Pull to refresh

У кого короче

Reading time2 min
Views13K
Одному из коллег понадобилось вывести число с ведущими нулями, чтобы получилось вот такое:
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>';
}


Надеюсь, теперь всем понятно, что требуется в задаче, и что вы не будете так безжалостны :)
Tags:
Hubs:
Total votes 57: ↑25 and ↓32-7
Comments75

Articles