Пользователь PPCG и избранный мод @Dennis стали вторым пользователем, заработавшим более 100 тысяч повторений!
Это совершенно оригинальная идея, которую я не получил ни от кого другого , но давайте сделаем вызов на основе его идентификатора пользователя, 12012
как дань уважения!
Глядя на это, вы заметите, что есть два отдельных «раздела» его идентификатора.
12
а также
012
Оба этих раздела в сумме дают 3. Это довольно интересное свойство.
Давайте определим «число Денниса 2.0» как любое положительное целое число, где каждая максимальная подпоследовательность строго возрастающих цифр суммируется с одним и тем же числом. Например,
123
является числом Денниса 2.0, потому что существует только один максимальный подсписок строго возрастающих цифр, и его сумма равна 6. Кроме того, 2846145 также является числом Денниса 2.0, потому что три максимальных подсписка возрастающих цифр, а именно
28
46
145
Вся сумма до 10
. Кроме того, числа, которые просто повторяют одну и ту же цифру, должны быть числами Денниса 2.0, потому что, например, 777
их можно разбить на
7
7
7
которые явно все сумма до семи.
Ряд таких , как 42
это не число Дэннис 2.0, так как оно разбивается на
4
2
которые явно не суммируются к одному и тому же числу.
Соревнование
Вы должны написать программу или функцию, чтобы определить, является ли данное число номером Дениса 2.0 или нет. Вы можете взять ввод и вывод в любом приемлемом формате ввода, например, в виде строки, в виде числа, из файла, аргументов / возврата функции, из STDIN / STDOUT и т. Д., А затем вернуть истинное значение, если это число является Денисом 2.0. число и ложное значение, если это не так. Для справки, вот каждый номер Dennis 2.0 до 1000:
1
2
3
4
5
6
7
8
9
11
12
13
14
15
16
17
18
19
22
23
24
25
26
27
28
29
33
34
35
36
37
38
39
44
45
46
47
48
49
55
56
57
58
59
66
67
68
69
77
78
79
88
89
99
101
111
123
124
125
126
127
128
129
134
135
136
137
138
139
145
146
147
148
149
156
157
158
159
167
168
169
178
179
189
202
222
234
235
236
237
238
239
245
246
247
248
249
256
257
258
259
267
268
269
278
279
289
303
312
333
345
346
347
348
349
356
357
358
359
367
368
369
378
379
389
404
413
444
456
457
458
459
467
468
469
478
479
489
505
514
523
555
567
568
569
578
579
589
606
615
624
666
678
679
689
707
716
725
734
777
789
808
817
826
835
888
909
918
927
936
945
999
Применяются стандартные лазейки, и выигрывает самый короткий ответ, измеряемый в байтах!
источник
1236|6
,
между ними? Это, вероятно, сильно растягивает.Ответы:
Желе,
1312 байт1 байт благодаря @Dennis.
Попробуйте онлайн!
объяснение
источник
JavaScript (ES6),
7270 байтПринимает строку в качестве ввода. Возвращает либо ложное, либо истинное значение (которое может быть числом).
Он использует регулярное выражение для преобразования входной строки, такой как
"2846145"
:Затем вызывает
eval()
это выражение.источник
2011
разделяется, как2 / 01 / 1
и не является числом D2.0. Что касается189
, это число D2.0 и18
является истинным значением.Python, 50 байт
Ожидается
input()
вычисление в строку, поэтому ввод требует окружающих кавычек в Python 2. Вывод осуществляется через код выхода , где 0 указывает на успех (истина), а 1 указывает на сбой (ложь).Проверьте это на Ideone .
Как это устроено
Мы инициализируем r в строку 0 и перебираем все цифры d на входе.
Если d больше, чем первая цифра r (первоначально 0 , затем равно предыдущему значению d ),
r<d
вычисляется как True и'=+'[r<d]*2
возвращается++
.Если d меньше первой цифры r ,
'=+'[r<d]*2
выдает==
.Если d равно первой цифре r , r будет длиннее, чем одиночная строка d , поэтому
'=+'[r<d]*2
возвращается снова==
.Во всех случаях цифра d и два сгенерированных символа добавляются к r .
Как только все входные цифры были обработаны,
eval(r)
оценивается сгенерированное выражение.Если входные данные состоят из одной строго возрастающей последовательности (положительных) цифр, выражение оценивается как их сумма.
Например, целое число 12345 приводит к выражению
5++4++3++2++1++0
, которое дает 15 при оценке. Обратите внимание, что каждая секунда + является унарным плюсом, поэтому она не влияет на результат. Деление 1 на 15 является действительным (результат не важен); программа выходит нормально.Если входные данные состоят из двух строго возрастающих последовательностей цифр, выражение состоит из простого сравнения.
Например, целое число 12012 приводит к выражению
2++1++0==2++1++0
, которое возвращает True, когда вычисляется, поскольку оба члена имеют сумму 3 . Деление 1 на True ( 1 ) действительно (результат не важен); программа выходит нормально.С другой стороны, целое число 12366 приводит к выражению
6==6++3++2++1++0
, которое выдает False при оценке, поскольку термины имеют суммы 6 и 12 . При делении 1 на False ( 0 ) возникает ошибка ZeroDivisionError ; программа завершается с ошибкой.Если входные данные состоят из трех или более строго возрастающих последовательностей цифр, выражение состоит из цепочечного сравнения , которое возвращает True, если и только если все участвующие сравнения возвращают True .
Например, целое число 94536 приводит к выражению
6++3==5++4==9++0
, которое возвращает True при оценке, так как все члены имеют сумму 9 . Как и прежде, программа выходит нормально.С другой стороны, целое число 17263 приводит к выражению
3==6++2==7++1++0
, которое выдает False при оценке, поскольку термины имеют суммы 3 , 8 и 8 . Как и прежде, программа завершает работу с ошибкой.источник
Брахилог , 13 байт
Попробуйте онлайн!
объяснение
~c
сначала объединится с самыми большими списками.источник
Пайк, 18 байт
Попробуй это здесь!
источник
PowerShell v2 +,
1006461 байтБуквальный однострочный, так как все это один конвейер. Принимает ввод в виде строки
$args[0]
.char
Перебирает его как -array, каждая итерация помещает либо текущий элемент с+
или-eq
перед ним в конвейер, основываясь на том, является ли текущее значение-l
ess-than-or-e
qual для предыдущего значения$i
. Эти строки-join
редактируются вместе и передаются по каналуiex
(сокращенноInvoke-Expression
и аналогичноeval
. Например, для ввода2846145
это будет оцениваться как+2+8-eq4+6-eq1+4+5
, то естьTrue
.Это логическое значение остается в конвейере и
True
/False
неявно записывается при завершении программы.Примечание: для ввода одной цифры полученная цифра остается на конвейере, что является истинным значением в PowerShell.
Примеры
источник
GNU sed 217 или 115
Оба включают +1 для -r
217:
Принимает ввод в нормальном десятичном формате
Попробуйте онлайн!
115:
Принимает ввод как разделенный запятыми список чисел в унарном формате. например
123
, будет1,11,111
Попробуйте онлайн!
источник
Perl, 38 + 3 (
-p
) = 41 байт-9 байт благодаря @Ton Hospel !
Поскольку существует
$'
, код должен быть в файле для запуска. Так что-p
считается за 3 байта. Выводит 1, если число является числом Дениса 2.0, или пустой строкой в противном случае:источник
s%.%2x$&.($&.O ge$')%eg;$_=/^(2+1)\1*$/
с-p
опцией (+3, потому что код имеет$'
)A
лучше использовать результат сравнения вместо случайного ! Спасибо!.O
Хотя я не понимаю ... Без этого в некоторых случаях это не помогает, но я не понимаю, почему.$'
следующая цифра и все после нее. Так, например,778
он сравнивается7
с тем,78
чтоlt
выглядит как восходящая последовательность. ВO
перерывы , которые и сравнивает7O
с78
(что - либо выше9
в ASCII работ)$' or $
`вместо своих групп захвата, но не смог его найти, из-за этого" и всех тех, кто после него ". Спасибо за чаевые!~$&le~$'
должно быть на 1 корочеJavaScript (ES6),
666563 байтаСохранено 2 байта благодаря @ edc65
Принимает ввод в виде строки. Старая версия (работает только в Firefox 30+):
источник
[...x,0]
->[...x,p=t=z=0]
Mathematica, 38 байт
Анонимная функция. Принимает число как ввод и возвращает
True
илиFalse
как вывод.источник
Brachylog 2, 10 байт, языковые проблемы
Попробуйте онлайн!
По сути, это тот же алгоритм, что и в ответе @ Fatalize (которого я не видел, пока не написал), но он несколько перестроен, чтобы сделать его более подходящим для синтаксиса Brachylog 2.
Это полная программа, возвращающая,
false.
если это не номер Дениса 2.0, илиtrue
если это так.объяснение
Как обычно для полной программы Brachylog, если все утверждения могут быть выполнены одновременно, мы получим истинное возвращение, в противном случае - ложь. Порядок по умолчанию для
~c
сортировки - это сначала разделы с меньшим количеством более длинных элементов, а в Prolog (таким образом, Brachylog) порядок по умолчанию определяется первым предикатом в программе (используя второй как разрыв связей и т. Д., Здесь~c
доминирует, потому чтоẹ
является детерминированным и, следовательно, не имеет ничего к порядку).источник
MATL,
2423201816 байтовВозвращает правдивую матрицу Фалси
Попробуйте онлайн!
Также поздравляю @Dennis!
объяснение
источник
&=
!PHP,
10810592 байтапринимает входные данные из аргумента, завершает работу с
0
номером Dennis-2.0, с помощью1
else.сломать
источник
05AB1E , 18 байт
объяснение
N = 12012
используется в качестве примера.Попробуйте онлайн!
источник
Ruby 2.3, 56 байт
Почти наверняка это не самый лучший способ сделать это, но он демонстрирует некоторые приятные языковые особенности.
(Не переносит перевод строки, поэтому бегите как
ruby dennis2.rb <<< '12012'
)источник
PHP, 144 байта
Я уверен, что есть гораздо более умный (и более короткий) способ сделать это, но пока он подойдет.
источник
Python 2, 69 байт
Принимает ввод в виде строки.
Объяснение:
бывший
1201212012
Преобразует в список сумм:
1+2,0+1+2,1+2,0+1+2,
Зловещий и обращенный в сет.
set([3])
Если длина набора равна 1, все суммы одинаковы.
источник
JavaScript (ES6), 58
Применение моего редко полезного совета https://codegolf.stackexchange.com/a/49967/21348
Он сканирует строку char с помощью char, идентифицирующего пробег восходящих символов, в конце каждого рома он проверяет, всегда ли сумма одинакова
Контрольная работа
источник
Pyth , 20 байт
Две версии
Попробуйте первый онлайн!
Попробуйте второй онлайн!
источник
Рубин,
11710585 байтЭто вернуло бы целое число этого номера Дениса или,
nil
если не номер Дениса. Все целые числа будут считаться истинными в ruby, а такжеnil
считается ложным.i
целое число, которое проверяется.Третья версия на самом деле возвращается
true
иfalse
.PS проверено, чтобы вернуть 172 целых числа от 1 до 1000, как в ответе.
источник
APL, 23 байта
Объяснение:
N←⍎¨⍕⍵
: получить отдельные цифры на входе, сохранить вN
N⊂⍨1,2>/N
: найти списки строго растущих чисел вN
+/↑
: суммировать каждый подсписок1=≢∪
: посмотреть, есть ли в результирующем списке только один уникальный элементисточник
Добавить ++ , 109 байт
Попробуйте онлайн!
Как это устроено
€
[1 2 0 1 2 2]
источник