На 4chan популярной игрой является get. Каждое сообщение на сайте получает последовательный идентификатор сообщения. Поскольку вы не можете влиять на них или определять их, люди пытаются угадать (хотя бы часть) свой собственный номер сообщения, обычно первые несколько цифр. Другая версия игры называется dubs, и ее целью является получение повторяющихся цифр в конце номера (т.е. 1234555).
Ваша задача, если вы хотите принять это, - написать программу, которая принимает идентификатор записи в качестве ввода (стандартное целое число, которое вы можете считать ниже 2 ^ 32) и возвращает количество повторяющихся цифр в конце.
правила
- Стандартные лазейки запрещены .
- Программа может быть функцией, полной программой, командой REPL, чем угодно, действительно, до тех пор, пока для ее запуска не требуется внешний несчетный код / аргументы.
- Входные данные могут поступать из STDIN, аргументов функции, аргумента командной строки, файла, что угодно.
Тестовые случаи
Input: 14892093
Output: 1
Input: 12344444
Output: 5
Input: 112311
Output: 2
Input: 888888
Output: 6
Input: 135866667 //Post number I got on /pol/ few days ago, rip
Output: 1
code-golf
number
number-theory
counting
sagiksp
источник
источник
Ответы:
Mathematica, 29 байт
Как насчет арифметического решения?
Мне очень приятно видеть, что это превосходит прямой подход Mathematica.
объяснение
Сам код вычисляет 9 * n + n% 10, а затем находит наибольшую степень 10, которая делит вход, или, другими словами, подсчитывает завершающие нули. Нам нужно показать, что если n заканчивается k повторяющимися цифрами, то 9 * n + n% 10 имеет k конечных нулей.
Повторные цифры легче всего выразить математически путем деления числа, такого как 99999 (что составляет 10 5 -1 ) на 9, и затем умножения на повторяющуюся цифру. Таким образом, мы можем написать n = m * 10 k + d * (10 k -1) / 9 , где m d (mod 10) , чтобы гарантировать, что n не заканчивается более чем k повторяющимися цифрами. Обратите внимание, что d = n% 10 .
Давайте включим это в нашу формулу 9 * n + n% 10 . Мы получаем 9 * m * 10 k + d * (10 k -1) + d . Значение d в конце отменяется, поэтому у нас осталось: 9 * m * 10 k + d * 10 k = (9 * m + d) * 10 k . Но 9 ≡ -1 (мод 10) , поэтому 9 * m + d ≡ d - m (мод 10) . Но мы утверждали, что m ≢ d (мод 10) и, следовательно, d - m ≢ 0 (мод 10) .
Другими словами, мы показали, что 9 * m + d не делится на 10 и, следовательно, наибольшая степень 10, которая делит 9 * n + n% 10 = (9 * m + d) * 10 k, равна k , количество конечных повторяющихся цифр.
В качестве бонуса это решение печатает правильный результат
∞
для ввода0
.источник
Сетчатка , 9 байт
Попробуйте онлайн!
Подсчитывает количество совпадающих совпадений,
(.)\1*$
регулярное выражение которых совпадает с суффиксом идентичных символов.источник
(.)(?=\1*$)
.(?=(.)\1*$)
(так же, как и ваша).Брахилог , 4 байта
Попробуйте онлайн!
объяснение
Если бы мы
ḅ
работали непосредственно с целыми числами (и я не уверен, почему я не реализовал это так, как оно делает), это было бы только 3 байта, посколькуẹ
не было бы необходимости.источник
Python 2 ,
4741 байтПопробуйте онлайн!
36 байт - для более гибкого ввода
Попробуйте онлайн!
источник
dir(object)
наш друг с:Javascript (ES6),
55523230 байтИспользование регулярного выражения для соответствия последней группе последней цифры
Примечание: первый раз. Не стесняйтесь делать замечания.
источник
/(.)\1*$/
f=
.C
62564847 байтовСохраненный байт благодаря @Steadybox!
Попробуйте онлайн!
источник
PHP,
474540 байтБежать с
echo <n> | php -nR '<code>
Кажется, цикл все еще меньше, чем мой первый ответ. просто посчитайте символы, которые равны последним. Это использует отрицательные смещения строк в PHP 7.1 .
-5 байт по Титу. Благодарность !
Старый ответ:
удаляет справа каждый символ, соответствующий крайнему правому символу, и вычисляет разницу в длине.
источник
-R
и$argn
может сэкономить 5 байтов.05AB1E , 4 байта
Попробуйте онлайн! или как тестовый набор
объяснение
источник
CJam , 7 байтов
Попробуйте онлайн!
объяснение
источник
Желе , 5 байт
Попробуйте онлайн!
объяснение
источник
Perl 5 , 22 байта
21 байт кода +
-p
флаг.Попробуйте онлайн!
/(.)\1*$/
получает последние идентичные числа, а затем$_=length$&
назначает его длину$_
, которая неявно печатается благодаря-p
флажку.источник
C (gcc) ,
3229 байтЭто порт моего ответа Python .
Это работает с gcc, но отсутствие
return
оператора - неопределенное поведение.Попробуйте онлайн!
источник
return
делает оператор - сохраняет возвращаемое значение в EAX. При использовании gcc присвоение его переменной происходит так же. Что касается арифметики указателя, то когда вы добавляете 1 к указателю int, он перемещается к следующему int, а не к следующему байту.Python 2, 51 байт
Принимает целое число в качестве входных данных. Попробуйте онлайн
48 байтов для строки в качестве ввода. Попробуйте онлайн
источник
C # ,
6362 байтаGolfed
Ungolfed
Ungolfed читаемый
Полный код
релизы
- 1 byte
- Благодаря комментарию Кевина .63 bytes
- Исходное решение.Заметки
Нечего добавить
источник
i=>{int a=i.Length-1,b=a;while(a-->0&&i[a]==i[b]);return b-a;}
Python 2 ,
3832 байтаСпасибо @xnor за сохранение 6 байтов!
Попробуйте онлайн!
источник
MATL ,
65 байт1 байт сохранен благодаря @Luis
Попробуйте это на MATL Online
объяснение
источник
&
сделал это дляY'
:-D Почему бы не принять ввод как строку, заключенную в кавычки и избавиться отj
?Cubix,
2419 байтЗаметка
Попробуй здесь
объяснение
Во-первых, давайте расширим куб
Этапы выполнения могут быть разделены на три этапа:
Этап 1: Ввод
Первые два символа, которые выполняются,
A
иB
.A
читает все вводимые данные и помещает их в виде кодов символов в стек. Обратите внимание, что это делается в обратном порядке, первый символ заканчивается сверху стека, последний символ почти внизу. В самом низу находится-1
(EOF
), который будет использоваться в качестве счетчика для количества последовательных символов в конце строки. Так как нам нужно, чтобы верхняя часть стека содержала последние два символа, мы обращаемся к стеку перед входом в цикл. Обратите внимание , что верхняя часть стека теперь выглядит следующим образом :..., C[n-1], C[n], -1
.Место IP на кубе находится там, где оно
E
есть, и оно указывает вправо. Все инструкции, которые еще не были выполнены, были заменены на no-ops (полные остановки).Этап 2: Сравнение персонажей
Стек - это
..., C[a-1], C[a], counter
гдеcounter
счетчик увеличивается, когда два проверяемых символа равны (C[a]
иC[a-1]
). IP сначала входит в этот цикл уS
персонажа, двигаясь вправо.E
Характер положение , в котором IP будет в конечном итоге (указывая право) , когдаC[a]
иC[a-1]
не имеют то же значение, что означает , что вычитаниеC[a]
изC[a-1]
не уступающие0
, в этом случае инструкции , следующей за!
будет пропущен (который являетсяw
).Вот инструкции, которые выполняются во время полного цикла:
И тогда это зацикливается.
Этап 3: печать результатов
Так как мы вышли из цикла раньше, стек выглядит следующим образом :
counter, ..., C[a-1]-C[a]
. Счетчик легко напечатать, но мы должны увеличить счетчик один раз, потому что мы не делали этого на последней итерации цикла, и еще раз, потому что мы начали считать-1
вместо0
. Путь на кубе выглядит следующим образом, начиная сS
направления вправо. Два no-ops, которые выполняются IP, заменяются стрелками, которые указывают в направлении IP.Инструкции выполняются в следующем порядке. Обратите внимание, что
B)
инструкции в конце изменяют стек, но не влияют на программу, так как мы собираемся завершить его, и мы больше не используем стек.Alea iacta est.
источник
Пакет, 91 байт
В
-
предотвращает испытание от стекания начала строки.источник
JavaScript (ES6), 34 байта
Не короче, чем решение регулярных выражений.
Рекурсивная функция, которая оценивает цифры справа налево, останавливаясь при обнаружении другой цифры. Результатом является количество итераций.
p
находитсяundefined
на первой итерации, что означаетn%10-p
возвратNaN
(ложь). После этогоp
равна предыдущей цифре сn%10
. Когда текущая цифра (n%10
) и предыдущая (p
) различаются, цикл заканчивается.источник
Рёда , 12 байт
Попробуйте онлайн!
Это анонимная функция, которая ожидает, что каждый символ входной строки помещается в поток (я думаю, что это верно в духе недавнего мета-вопроса ).
Он использует две встроенные функции:
count
иtail
:count
считывает значения из потока и передает количество последовательных элементов в поток.tail
возвращает последнее значение в потоке.источник
T-SQL,
238214 байтИли:
источник
Java 7, 78 байт
Попробуй это здесь.
Я пробовал некоторые вещи, используя рекурсию или цикл, но оба оказались выше 100 байт ..
источник
Powershell, 41 байт
прямой цикл в обратном направлении, пока символ не совпадает с последним символом в строке, возвращает индекс этого символа -1.
-3 благодаря @AdmBorkBork - вместо цикла время используется цикл for.
источник
Mathematica,
3330 байтСпасибо Грегу Мартину за сохранение 3 байта.
Принимает ввод в виде строки.
Получает десятичные цифры (в виде символов), разбивает их на серии одинаковых элементов, получает последний цикл и вычисляет длину с помощью стандартного трюка получения суммы вектора
1^list
.источник
Characters
вместоIntegerDigits
?Утилиты Bash + Unix, 34 байта
Попробуйте онлайн!
источник
JavaScript (ES6),
39383727 байтВозможно, не короче, чем решение на основе регулярных выражений, но я не удержался от написания решения, полностью основанного на арифметике. Техника состоит в том, чтобы повторно брать
n % 100 % 11
и делить на 10, пока результат не станет ненулевым, а затем посчитать итерации. Это работает, потому что, если последние две цифры одинаковы,n % 100 % 11
будет0
.источник
f=(n,p)=>n%10-p?0:1+f(n/10|0,n%10)
Haskell , 33 байта
Попробуйте онлайн!
Принимает строку ввода. Неоднократно обрезает первый символ и добавляет 1, если все символы в суффиксе равны первому.
источник
R 35 байт
Краткое объяснение
источник
Befunge-98 , 19 байт
Попробуйте онлайн!
Это можно было бы сделать короче, если бы мне удалось использовать только стек.
Как это работает:
источник
Python 3 -
5044 байтаПолная программа (в Python 3
input()
возвращает строку, независимо от ввода):источник