Вы можете вспомнить в первом или втором классе, используя расширенную форму, чтобы узнать о стоимости места чисел. Это проще объяснить на примере, поэтому рассмотрим число 123
. В развернутом виде это представляется как 100 + 20 + 3
, что помогает молодому уму визуализировать значение места. Это напоминает то, как вы это говорите: сто (плюс) двадцать (плюс) три.
Мы можем расширить это прошлое единиц измерения с десятичными знаками: 2.718 => 2 + 0.7 + 0.01 + 0.008
Ваша задача состоит в том, чтобы написать программу или функцию, которая принимает положительное число с плавающей запятой или ноль (предположим, что оно настолько велико или точно, как ваш язык может его обработать; это не будет в научной нотации) или строку, и печатает / возвращает ее в развернутом виде как объяснено выше.
Вам не нужно ставить пробелы между символами +
's' и 'ноль' до десятичной точки, поэтому приведенный выше пример может быть таким 2+.7+.01+.008
. Значения, которые будут равны нулю, должны быть опущены ( 101.01 => 100 + 1 + 0.01
), если вход не равен нулю (см. Ниже).
Значения не должны иметь более одного начального нуля до десятичной запятой или любых конечных нулей после нее (no-no's:) 0060, 0000.2, 30., 30.000, .0400
. Вход будет соответствовать этому тоже.
Поскольку у первоклассников короткий интервал внимания, ваш код должен быть максимально коротким.
Контрольные примеры
0 => 0
6 => 6
0.99 => 0.9 + 0.09
24601 => 20000 + 4000 + 600 + 1
6.283 => 6 + 0.2 + 0.08 + 0.003
9000000.0000009 => 9000000 + 0.0000009
источник
Ответы:
CJam,
3326 байтовЭто не будет работать с интерпретатором Java; это печать плавает по-разному. Попробуйте это с интерпретатором CJam .
Последний тестовый пример печатает
9000000+9e-7
, который был признан действительным @NinjaBearMonkey .Спасибо @ jimmy23013 за удаление 7 байтов!
Как это устроено
источник
r_ee\'0fe<f{\~t~}{},'+*0e|
.JavaScript (ES7), 102 байта
объяснение
Требуется, чтобы число вводилось в виде строки без начальных нулей (если, конечно, число не является
0
).Примечание: из-за странности с плавающей точкой некоторые числа (например
.3
) получаются неправильными, но теоретически это работает для любого числа.Контрольная работа
Тест использует
Math.pow
вместо**
совместимости браузера.Показать фрагмент кода
источник
Math.floor
=>0|
...?1
оно сломалось бы, потомуMath.log10(n)
что возвращало бы отрицательное число и округляло бы|0
к нулю вместо настила.0|Math.log10(n),p-=p<0
вместоMath.floor(Math.log10(n))
?n<1
потому , что0|
будет делатьp
равным0
для обоих0.1
и-0.1
. Самый короткий путь, который я могу придумать, -p=Math.log10(n),p=p-(p<0)|0
это та же длина, что и при использованииMath.floor
. :(n=0.1
.Retina ,
867775 байтПодсчет байтов предполагает, что источник кодируется как ISO 8859-1.
Конечный перевод строки значителен.
Попробуйте онлайн.
объяснение
Мы начнем с превращения ввода в отдельный список компонентов перевода строки, хотя верна только начальная (или конечная) цифра. Это делается путем злоупотребления разделенным этапом. Вместо разделения входных данных мы сопоставляем все, поэтому оставшиеся сегменты все пусты. Мы удаляем эти пустые сегменты с помощью
_
опции. Суть в том, что разделенные этапы также возвращают значения всех групп захвата. Таким образом, мы используем предпросмотр каждого совпадения для захвата правильной части строки: сначала мы пытаемся найти.
левую часть совпадения. Если это так, мы фиксируем все с.
до и включая цифру, которую мы в настоящее время сопоставляем. В противном случае мы должны быть в целочисленной части ввода, поэтому мы фиксируем все числа после совпадения (включая совпадение). Мы также должны избавиться от самой десятичной точки, поэтому второй захват не является обязательным. Если нет\d
необходимости захватывать, это просто удалит совпадение из ввода.Теперь мы используем этап транслитерации, чтобы превратить все нули, кроме начальных / конечных цифр. Мы либо сопоставляем компонент, который меньше 1, с тем,
\..+\B
где\B
мы гарантируем, что мы останавливаем совпадение на одну цифру до конца, либо мы сопоставляем целочисленную часть с тем,(?<=^\d).+
где просмотр сзади гарантирует, что мы начинаем одну цифру с числа. Затем на этапе транслитерации любые цифры (d
) заменяются нулями внутри совпадений.Теперь фактический формат вывода должен использовать
+
не перевод строки в качестве разделителей. Соответствует¶
переводу строки для выполнения этой замены. Пока мы это делаем, мы также удаляем строки, которые содержат только0
s и.
s.Предыдущий этап не удаляет начало или конец
0
(потому что те не имеют перевода строки до и после них), поэтому мы удаляем их явно.источник
Python 2,
216210196175 байтВот некоторый слегка играемый в гольф код, который я буду играть в гольф, когда у меня будет время. Использует анализ строк.
объяснение
Таким образом, входные данные разделены на целую и десятичную части. Затем, есть понимание списка цикла. В целочисленной части длина строки после десятичного знака умножается на «0», чтобы получить столько нулей в конце этого символа.
Для десятичной части индекс текущего символа - это число нулей перед ним, поэтому эта часть проста.
Попытка и исключение используется, чтобы определить, имеет ли он десятичную часть или нет (с ошибкой).
Конечный результат соединяется со знаком плюс.
Попробуй это здесь!
источник
o if o else ["0"]
может бытьo or["0"]
.o=[(...)] for
,e(I) if
,e(i[1]) if
,print "+"
, и внешняя скобка вo=[(...)
а, на самом деле. Наконец, вы можете извлечь последнее условноеprint"+".join(o)or"0"
выражение из функции соединения следующим образом: потому что объединение вернет пустой список, еслиo
оно пустое, поэтому условное вычисление будет выполнено таким же образом, что сэкономит вам один байт.Pyth, 30 байт
Тестирование
Основное решение здесь состоит в том, чтобы заменить все цифры на входе
0
, затем вставить каждую цифру в нужном месте, вычислить, отфильтровать нули и объединить плюсы. К сожалению, функция eval Пита в настоящее время не принимает лидирующие нули. Я буду работать, чтобы исправить это.Чтобы обойти эту проблему, я добавил вспомогательную функцию,
y
которая рекурсивно повторяет eval до тех пор, пока не будет выдано никаких ошибок, каждый раз удаляя первую цифру. Обратите внимание, что эта функция будет бесконечно зацикливаться на неверном вводе.Кроме того, особый случай был необходим для ввода
0
.В целом, я думаю, что код довольно хорош, но языковые возможности могут быть лучше. Кто хочет ошибки?
источник
Питон 3, 138
Это в значительной степени основано на подходе TanMath / Ogaday, заключающемся в том, что число читается как строка и обрабатывается таким образом. Я должен использовать звездное присвоение,
i
чтобы оно правильно обрабатывало целые числа.источник
Python,
141132128 байтЭтот все еще относительно читабелен. Преобразовать в строку и обрабатывать
>1
цифры отдельно от<1
цифр. У нас также есть особый случай для нуля. Я мог бы убрать еще два пробела ниже, но мне нравится держать их красивыми.Недостатком является то, что он будет разбит на поплавки с более чем 9 знаками после запятой.
Ниже оригинал. Первым редактированием было сокращение нуля в специальном случае, вторым редактированием было удаление 0 перед десятичной дробью, третьим - удаление лишних скобок и пробелов.
Объяснение:
источник
Mathematica, 81 байт
Прецедент:
источник
CJam, 44 байта
Попробуй это здесь.
Он не проходит последний тестовый пример и выдает следующее:
Но, скажем, слишком точно, что CJam не может справиться с этим.
объяснение
источник
Python 3,
187180173154 байтаБлагодаря удачному предложению @Thomas Kwa, приведенному выше
result or['0']
, удалось сыграть в гольф на 19 байтов , а также переставить некоторую алгебру ( 154 байта ):Моя лучшая попытка на данный момент( 173 байта ). Основываясь на новом подходе, смотрите основание поста:Гольф мой оригинал до 180 байт :
Сегодня я изучил новую языковую функцию! Условия через логическое индексирование. Возможно, я немного перестарался.
Я попытался абстрагироваться от понимания, но не смог сделать его короче ( 196 байт ):
(Обратные последовательности дороги!)
Пока мой короче, но я думаю, что TanMath может сыграть вничью, чтобы он соответствовал моему: использование
e=enumerate
, заменаpass
на0
и использование'0'
вместо['0']
в выражении return должно сохранить 4 + 3 + 2 = 9 байт! Снижение до 187. Я уверен, что еще несколько байтов можно где-то сбрить ...редактировать новый подход ( 156 байт ). Тем не менее, он может работать только с точностью до 6 dp, аналогично записи CJam в @ jimmy23013, поэтому он не проходит финальный тест. Я не мог заставить его печатать больше 0, может кто-то другой может. Вместо этого я использовал его в качестве основы для своей лучшей попытки, см. Top (Кроме того, этот подход печатает 0 перед десятичным знаком, но это также кажется действительным). Взял
try:... except:...
подход от TanMath:источник
чистый баш, 210
или же
Контрольная работа:
источник
Python, 131 байт
Действительно, очень грязная рекурсивная функция, вероятно, не лучший способ сделать это. Ввод как
f("10.0203")
.источник
C
155153161 байт+2 для ссылки в математической библиотеке (сам источник 159).
Ungolfed
источник
Дьялог АПЛ , 47 байт
Принимает число в символьной векторной форме, например
'123'
.Примеры:
Примечания:
○ Причиной изменения последнего примера является то, что APL, как и некоторые другие представления, по умолчанию переключается на научную запись для таких крайних чисел.
○ Фраза
↑⍕¨f¨,¨
нужна только для одновременной обработки всех примеров.источник
Сетчатка, 113 байт
В настоящее время намного дольше, чем решение Мартина, но использует другой метод, поэтому я решил опубликовать его.
Попробуйте это онлайн здесь.
источник
perl, 132 байта
131 +1 за
-p
переключатель.Это основано на моем предыдущем
sed
ответе :Тестирование:
источник
Powershell -
172166193 байтаВсе в одной строке:
Ungolfed:
Контрольные примеры плюс один дополнительный:
источник
$args = 0
. Вот простое исправление ошибки, которое также экономит 3 байтаPerl, 248 байт
Фу, я нобист в Perl, играю в гольф.
Попробуй это здесь.
источник
5
возвращаюсь50
.Ява,
284244243 байтаК сожалению, я не смог найти более короткий способ создания повторяющихся строк, чем:построитьchar[]
нужной длиныиспользоватьArrays.fill
для установки символовиспользовать,new String
чтобы его можно было объединитьС вдохновением @Khaled A Khunaifer я смог сбрить 40 байт.
Редактировать:
indexOf
принимает int, чтобы я мог заменить'.'
на46
. К сожалению, это не представляется возможным сreplace
.источник
.replace('\0','0')
функцию заменитьString
не ожидайтеchar
, это должно быть.replace("\0","0")
Python, 125 байт
После удаления моего первого ответа (sry!), Который не мог обработать небольшие числа из-за проблем с эпсилоном, я нашел другое решение. Он обрабатывает числа с плавающей запятой, а также целые числа, завершающие нули (!) И записывается как функция.
Спасибо @ogaday за полезные советы и компактное исправление 0!
Golfed:
Ungolfed:
Использование:
источник
f('0')
тест не проходит , и когда я копирую и вставляю текст прямо в мой интерпретатор, я получаю научную запись (что, я думаю, хорошо). Такжеlist(c)
короче. Если вы объединяете'.'
перед тем, как превратить его в список, добавлять его[]
тоже не нужно . Использованиеfind
вместо индекса в строке перед превращением ее в список, после добавления'.'
также экономит вам байт. Изменение порядка неравенства также позволяет убрать дополнительное пространство:def f(x):x+='.';i=x.find('.');z=list(x);del z[i];return"+".join([str(int(o)*10**(i-j-1))for j,o in enumerate(z)if"0"<o])or'0'
CoffeeScript, 144 байта
Прямое решение:
Исполняемые:
Показать фрагмент кода
источник
Stax , 18 байт
Запустите и отладьте его
Распакованный, размазанный и прокомментированный, это выглядит так.
Запустите этот
Как и многие другие опубликованные решения, он производит
9000000+9e-7
для последнего теста. Согласно установленному прецеденту это разрешено, потому что контрольный пример слишком точен для языка.источник
Луа, 350 байт
Я думаю, что есть еще два способа сделать это:
Я мог бы использовать
macro.define
для замены некоторых выражений обыкновенных (не могу проверить прямо сейчас, и не уверен, что это заставит меня получить несколько байтов)Используйте разделение на точке вместо итерации по всей строке. Еще раз, я не уверен, что это уменьшит размер этой функции, так как манипулирование строкой в lua довольно болезненно.
Пояснения
Вы можете протестировать lua онлайн и использовать следующий исходный код, чтобы запустить его с некоторыми тестами.
источник
C 253 байта
Примечание:
putchar(8)
должен выполнять возврат.Подробно , попробуйте здесь
источник
sed,
136128 байтУменьшается на 8 символов за счет удаления пробелов и бесполезно
0
.Тестовые случаи:
источник
JavaScript (ES7), 114 байт
Работает с произвольными числами длины, потому что он использует строковые манипуляции повсюду.
Без понимания массива (122 байта):
Ungolfed:
источник
R - 133 байта
Надежный, игнорирует Machine Epsilon и работает также с конечными нулями.
а) Гольф:
Ungolfed:
Использование:
источник