Когда я был ребенком и хотел считать долларовые банкноты в своих сбережениях, я считал вслух:
один два три четыре пять шесть семь восемь девять десять;
одиннадцать, двенадцать, тринадцать, четырнадцать, пятнадцать, шестнадцать, семнадцать, восемнадцать, девятнадцать, двадцать;
двадцать один, двадцать два, двадцать три, двадцать четыре, двадцать пять ...
В конце концов мне надоело произносить каждое из этих многосложных чисел. Будучи математически мыслящим, я создал гораздо более эффективный метод подсчета:
один два три четыре пять шесть семь восемь девять десять;
один, два, три, четыре, пять, шесть, семь, восемь, девять, двадцать;
один, два, три, четыре, пять, шесть, семь, восемь, девять, тридцать ...
Как видите, я бы произносил только те цифры, которые изменились по сравнению с предыдущим номером. Это имеет дополнительное преимущество, заключающееся в том, что оно значительно более повторяется, чем английские названия чисел, и, следовательно, требует меньше умственных способностей для вычислений.
Вызов
Напишите программу / функцию, которая принимает положительное целое число и выводит / возвращает, как я бы посчитал, то есть самую правую ненулевую цифру и все конечные нули.
Примеры
1 1
2 2
10 10
11 1
29 9
30 30
99 9
100 100
119 9
120 20
200 200
409 9
1020 20
Полный список тест-кейсов не обязателен. Это A274206 на OEIS.
правила
- Ваша запись должна теоретически работать для всех натуральных чисел, игнорируя точность и проблемы с памятью.
- Вход и выход должны быть в десятичном формате.
- Вы можете выбрать ввод и / или вывод в виде числа, строки или массива цифр.
- Ввод гарантированно будет положительным целым числом. Ваша запись может сделать что угодно для неверного ввода.
Это код-гольф , поэтому выигрывает самый короткий код в байтах.
[1,0,2,0]
->[2,0]
для последнего теста? (Мне неясно фраза "массив из одного элемента").Ответы:
Python 2 , 28 байт
Попробуйте онлайн!
Рекурсивная формула работает очень чисто. Если последняя цифра ненулевая, выведите ее. В противном случае удалите конечный ноль, вычислите выход для этого и умножьте его на 10.
источник
Желе ,
63 байта-3 байта при наличии ввода / вывода в виде десятичного списка цифр .
Набор тестов на Попробуй онлайн!
Как?
Если мы не можем взять десятичные списки, 6 байт:
Который вы можете увидеть здесь .
Это делает то же самое, но предварительно преобразует целое число в десятичный список и впоследствии преобразует обратно в целое число.
источник
C,
302927 байтовГоржусь этим, когда я использую два C-эксплойта, чтобы сыграть в гольф (описано в конце поста); Это специально для C (GCC)
3)
b=10;f(a){a=a%b?:b*f(a/b);}
// 27 байт2)
// 29 байтb;f(a){b=a=a%10?:10*f(a/10);}
1)
// 30 байтf(i){return i%10?:10*f(i/10);}
Попробуйте онлайн (27-байтовая версия)
Первая попытка (30 байт): злоупотребляет тем фактом, что в GCC, если никакое значение не объявлено в троичной форме, будет возвращено условное значение. Следовательно, почему мой троичный оператор пуст для истинного возвращаемого значения.
Вторая попытка (29 байт): злоупотребляет ошибкой памяти в GCC, где, насколько я понимаю, если у функции нет возвращаемого значения, когда в функции было сознательно использовано более двух переменных, последнее заданное значение первой аргументной переменной будет возвращен.
(Изменить: но это «заданное значение» должно быть установлено определенным образом, например, установка переменной с помощью
=
или+=
работает, но установка с помощью%=
не работает; странно)Третья попытка (27 байт): поскольку я все равно должен осмысленно использовать вторую переменную (b) для правильного использования ошибки памяти, упомянутой выше, я также могу использовать ее в качестве фактической переменной для замены «10».
(Примечание: я должен быть в состоянии свопа
a=a%b
с ,a%=b
чтобы сохранить другие байты , но , к сожалению , это приводит к тому , ошибке памяти эксплуатирует выше остановки «работает», так что я не могу)источник
Сетчатка ,
76 байтПопробуйте онлайн (все тестовые случаи)
Выходные совпадения цифры, за которой следуют любые нули в конце входной строки. Хотя это и не обязательно, это также работает для
0
.источник
[1-9]
(или[^0]
) будет необходимо вместо\d
. Я предполагаю, что жадность*
гарантирует правильный вывод каждый раз.*
но с тем фактом, что совпадения ищутся слева направо.\d0*?$
также будет работать..0*$
должно работать.0*
Cubix , 18
32байтаЯ думаю, мне придется потратить некоторое время на это позже и посмотреть, смогу ли я немного сжать его. Но на данный момент вот оно.Оказывается, я думал об этом совершенно неправильно. Теперь процесс постепенно применяет мод (1,10,100,1000, ...) к входному целому числу и печатает первое, которое не равно нулю. Немного скучнее, но короче.
Попробуй здесь
источник
JavaScript, 21 байт
Контрольные примеры
Показать фрагмент кода
источник
Javascript
1918 байтБлагодаря ETHproductions для игры в гольф на один байт и Патрика Робертса для игры в гольф на два байта
Возвращает массив строк, которые соответствуют регулярному выражению нахождения в конце входной строки с любым символом, за которым следует наибольшее возможное число нулей.
Попробуйте онлайн
источник
g
, потому что есть только один матч, чтобы найти.x=>x.match`.0*$`
Bash + coreutils, 12
Попробуйте онлайн .
источник
Грязь , 5 байт
Попробуйте онлайн!
объяснение
источник
Брахилог , 2 байта
Попробуйте онлайн!
Встроенный суффикс
a₁
для целых чисел реализован следующим образом:Brachylog любит иметь возможность рассматривать целые числа как списки цифр, и для этого он использует предикат пользовательской утилиты
integer_value/2
. Здесь интересно тоinteger_value/2
, что, поскольку он должен уметь правильно переводить список цифр с ведущими нулями, он также может преобразовывать целое число в список цифр с лидирующими нулями, поэтому предикаты, которые этого не хотят случается (большинство из них, особенно недетализированные, напримерa
), запрещают заголовкам их списков цифр быть 0. Поэтому, хотяa₁
генерирует суффиксы, самые короткие для списков и строк, он пропускает любой суффикс целого числа с ведущим 0, который в дополнение к удалению дубликатов также означает, что первый сгенерированный суффикс является самой правой ненулевой цифрой со всеми завершающими нулями.источник
Brain-Flak , 74 байта
Попробуйте онлайн!
Печатает только последние не 0 и все завершающие 0.
Объяснение:
источник
Vim, 19 байт
Две версии, по 19 байт:
Плюс буксировка возврата каретки на каждом.
Проверьте все контрольные примеры онлайн! (Один байт добавлен для проверки нескольких строк)
источник
TI-Basic, 18 байтов
источник
R, 33 байта
Реализовано как безымянная функция
Это применяет мод от 10 ^ 0 до 10 ^ 99.
rle
используется для уменьшения результатов, так что второй элемент всегда является желаемым результатом.Попробуйте онлайн!
источник
Зш ,
1816 байтПопробуйте онлайн!Попробуйте онлайн!Баш , 25 байт
Попробуйте онлайн!
Оболочки должны вызывать внешние программы для использования регулярных выражений, поэтому мы должны обходиться без глобализации.
${1%[^0]*}
Расширение соответствует кратчайшему суффиксу , начинающемуся с ненулевым символом, и удаляет его.(M)
флага приводит к тому, что соответствующий суффикс сохраняется, а не удаляется.${1% }
расширение удаляет в качестве префикса все, что осталось.источник
ГНУ Сед ,
1714 + 1 (флаг r) = 15 байтИзменить: 2 байта меньше благодаря Райли
Он работает, удаляя все до самой правой ненулевой цифры, которая затем печатается вместе с любыми существующими конечными нулями. Сценарий может обрабатывать несколько тестов за один прогон, каждый на отдельной строке.
Попробуйте онлайн! (все тестовые примеры)
источник
Mathematica, 26 байтов
Чистая функция, которая берет список цифр и выводит список цифр:
объяснение
Это работает, поскольку он находит крайнее левое совпадение для
x
, которое должно быть самым правым ненулевым элементом списка, поскольку за ним следует последовательность из нуля больше0
s, а затем конец списка.источник
Java 8, 47 байт
это лямбда-выражение, присваиваемое
IntUnaryOperator
:Объяснение: умножьте m на 10, пока
x%m
не будет 0.return x%m*m/10
Требуется деление, потому что m на порядок больше, чем желаемый результат.источник
Perl 6 , 10 байт
Тривиальное регулярное выражение. Входы и выходы числа.
источник
MATL ,
107 байт3 байта сохранены благодаря @B. Мехта!
Ввод и вывод - это массив цифр.
Попробуйте онлайн!
Или проверьте все тестовые случаи .
объяснение
источник
48-
полностью удалить 3 байта: попробуйте онлайн!C #,
3028 байтНа основе этом ответе JavaScript , я предполагаю, что все кредиты вроде бы идут к нему.
Golfed
()
вокругa
благодаря Emignaисточник
i
чтобы она работала, когда вы используете рекурсию.i
он не будет объявлен для рекурсивного вызова).a
не требуется в любом случае, хотя.J, 27 байт
Это основано на формуле xnor, так что кредиты ему.
источник
Котлин, 49 байт
лямбда, присваивается
(List<Int>) -> List<Int>
it
вindexOfLast
..
для построения полигоновисточник
Perl 5, 12 байт
11 плюс 1
-nE
вместо-e
источник
05AB1E , 9 байтов
Попробуйте онлайн! или как тестовый набор
объяснение
источник
Japt , 6 байт
Попробуйте онлайн!
источник
Stax , 5 байт
Запустите и отладьте его
Процедура:
источник
05AB1E , 4 байта
Ввод / вывод в виде списка цифр.
Попробуйте онлайн или проверьте все тесты (набор тестов содержит объединение для лучшей читаемости).
Объяснение:
источник
Пайк,
131110 байтПопробуй это здесь!
11 байт:
Попробуй это здесь!
13 байтов:
Попробуй это здесь!
источник
Haskell 57 байт
источник