Одному из коллег понадобилось вывести число с ведущими нулями, чтобы получилось вот такое:
В его случае требовалось иметь минимум три цифры в целой части. Мы с другим коллегой крепко призадумались, как ему помочь… Через 10 минут накидали десяток вариантов, естественно, сравнивая, чей быстрее. В конце концов нашли быстрое решение, но нам этого показалось мало. «Давай, у кого короче!» В итоге полдня мы провели с пользой, остановившись на достаточно лаконичном варианте. Но в сердце тлеет огонёк надежды, что удастся сэкономить ещё пару байт драгоценного дискового пространства.
Не хочется сразу выкладывать наш вариант, точнее два, напишу пока
без учета описания функции и return. Грубо говоря, решение — набор операторов, делающих из $a (число, которое нужно преобразовать) и $b (число цифр в целой части) некое $c, требования к которому описаны выше.
Конечно, будет интересно рассмотреть решения и на других языках.
UPD. Обратите внимание, что количество цифр в целой части — переменная величина. И на то, что может иметь место дробная часть,
UPD2. Как видно из комментов, многие решения даются для конкретного случая или не решают задачу должным образом. Некоторым задача изначально показалась тривиальной, поэтому нахватал минусов. Но все равно было интересно почитать ваши предложения. Вообще говоря, мы сами случайно слукавили: наше 33-байтное решение тестировалось не как результат функции, а просто как преобразование:
Поэтому задачу надо все-таки рассматривать вместе с возвращением:
На данный момент это самый короткий вариант — 43 байта. Хотя, dna оказался тоже очень близок, но с ретурном получается 45.
Если кому-то влом придумывать проверочные числа:
Надеюсь, теперь всем понятно, что требуется в задаче, и что вы не будете так безжалостны :)
1 => 001 23 => 023 456 => 456 7.89 => 007.89 12345.6 => 12345.6
В его случае требовалось иметь минимум три цифры в целой части. Мы с другим коллегой крепко призадумались, как ему помочь… Через 10 минут накидали десяток вариантов, естественно, сравнивая, чей быстрее. В конце концов нашли быстрое решение, но нам этого показалось мало. «Давай, у кого короче!» В итоге полдня мы провели с пользой, остановившись на достаточно лаконичном варианте. Но в сердце тлеет огонёк надежды, что удастся сэкономить ещё пару байт драгоценного дискового пространства.
Не хочется сразу выкладывать наш вариант, точнее два, напишу пока
сколько символов получилось
33
без учета описания функции и return. Грубо говоря, решение — набор операторов, делающих из $a (число, которое нужно преобразовать) и $b (число цифр в целой части) некое $c, требования к которому описаны выше.
Конечно, будет интересно рассмотреть решения и на других языках.
UPD. Обратите внимание, что количество цифр в целой части — переменная величина. И на то, что может иметь место дробная часть,
sscanf('%0'.$b.'d', $a);
не подходит.UPD2. Как видно из комментов, многие решения даются для конкретного случая или не решают задачу должным образом. Некоторым задача изначально показалась тривиальной, поэтому нахватал минусов. Но все равно было интересно почитать ваши предложения. Вообще говоря, мы сами случайно слукавили: наше 33-байтное решение тестировалось не как результат функции, а просто как преобразование:
for(;strlen($a|0)<$b--;$a="0$a");
Поэтому задачу надо все-таки рассматривать вместе с возвращением:
for(;strlen($a|0)<$b--;$a="0$a");return $a;
На данный момент это самый короткий вариант — 43 байта. Хотя, dna оказался тоже очень близок, но с ретурном получается 45.
Если кому-то влом придумывать проверочные числа:
foreach (
array(
0, // 000
.1, // 000.1
1, // 001
1.2, // 001.2
12, // 012
12.3, // 012.3
123, // 123
123.4, // 123.4
12345, // 12345
12345.6 // 12345.6
) as $n)
{
echo foo($n, 3), '<br>';
}
Надеюсь, теперь всем понятно, что требуется в задаче, и что вы не будете так безжалостны :)