Как стать автором
Обновить

У кого короче

Время на прочтение2 мин
Количество просмотров13K
Одному из коллег понадобилось вывести число с ведущими нулями, чтобы получилось вот такое:
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>';
}


Надеюсь, теперь всем понятно, что требуется в задаче, и что вы не будете так безжалостны :)
Теги:
Хабы:
Всего голосов 57: ↑25 и ↓32-7
Комментарии75

Публикации

Истории

Работа

PHP программист
183 вакансии

Ближайшие события

19 августа – 20 октября
RuCode.Финал. Чемпионат по алгоритмическому программированию и ИИ
МоскваНижний НовгородЕкатеринбургСтавропольНовосибрискКалининградПермьВладивостокЧитаКраснорскТомскИжевскПетрозаводскКазаньКурскТюменьВолгоградУфаМурманскБишкекСочиУльяновскСаратовИркутскДолгопрудныйОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
24 – 25 октября
One Day Offer для AQA Engineer и Developers
Онлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
26 октября
ProIT Network Fest
Санкт-Петербург
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань