Эта задача - дань уважения пользователю PPCG Деннису за победу в грабительской части Викторины по языку программирования .
Глядя на страницу профиля Денниса PPCG, мы можем увидеть довольно впечатляющие вещи:
В настоящее время у него более шестидесяти восьми тысяч репутации, что делает его вторым по репутации , превосходя третье место почти на тридцать тысяч. Недавно он выиграл наши выборы нового модератора и получил новый блестящий бриллиант рядом с его именем. Но лично я думаю, что самая интересная часть о Деннисе - это его идентификационный номер пользователя PPCG: 12012.
На первый взгляд 12012
выглядит почти как палиндром , число, которое читается одинаково при обращении, но это немного не так. Он может стать палиндромом, 21012
если мы поменяем местами первые 1
и 2
, и он может стать палиндромом, 12021
если мы поменяем местами последние 1
и 2
. Кроме того, следуя соглашению о том, что начальные нули в числе не записываются, меняются местами первые 1
и 0
результаты, 02112
а точнее 2112
- другой палиндром.
Давайте определим число Денниса как положительное целое число, которое само по себе не является палиндромным, но может быть превращено в палиндром путем замены позиций по крайней мере одной пары любых двух цифр. Порядок ряда Dennis это число различных пар цифр , которые можно поменять местами , чтобы сделать (не обязательно различные) палиндром.
Таким образом , порядок 12012
равен 3 , начиная с 3 различными парами его цифр ( 12012
, , ) может быть заменено вокруг , чтобы произвести палиндромы. случается, самый маленький номер заказа 3 Деннис.12012
12012
12012
10
это наименьшее число Денниса и имеет порядок 1, потому что переключение вокруг 1
и 0
дает 01
ака, 1
который является палиндромом.
Мнимые ведущие нули числа не считаются переключаемыми цифрами. Например, изменение 8908
в 08908
и поменять местами первые две цифры , чтобы получить палиндром 80908
недействителен. 8908
это не номер Денниса.
Можно сказать, что номера не-Денниса имеют порядок 0.
Вызов
Напишите программу или функцию, которая принимает положительное целое число N и печатает или возвращает N-е наименьшее число Денниса вместе со своим порядком в некотором приемлемом формате, таком как 12012 3
или (12012, 3)
.
Например, 12012
это 774-й номер Денниса, поэтому, если 774
это входные данные для вашей программы, выходные данные должны быть примерно такими 12012 3
. (Любопытно, что 774 - еще один номер Денниса.)
Самый короткий код в байтах побеждает.
Вот первые 20 номеров Денниса и их заказы для справки:
N Dennis Order
1 10 1
2 20 1
3 30 1
4 40 1
5 50 1
6 60 1
7 70 1
8 80 1
9 90 1
10 100 1
11 110 2
12 112 1
13 113 1
14 114 1
15 115 1
16 116 1
17 117 1
18 118 1
19 119 1
20 122 1
источник
Ответы:
Pyth, 44 байта
Попробуйте онлайн: демонстрация или тестовый набор
Маленькая глупая ошибка (?) В Pyth испортила 41-байтовое решение.
Объяснение:
источник
.f
. Вот запрос на извлечение, который я сделал из-за этого вопроса: github.com/isaacg1/pyth/pull/151CJam, 45 байтов
Попробуйте онлайн!
Как это устроено
источник
Haskell, 174 байта
p
проверяет, является ли список палиндромом.x!y
являетсяTrue
тогда и только тогда спискиx
иy
(которые должны иметь одинаковую длину) отличаются ровно в два места. В частности, еслиx
это перестановкаy
,x!y
определяет, является ли это «обмен».o n
находит Dennis-порядокn
. Он фильтрует свопы среди перестановокx = show n
, а затем подсчитывает, сколько из этих свопов являются палиндромами. Понимание списка, которое выполняет этот счет, имеет дополнительную защитуnot (p x)
, что означает, что он вернется,0
еслиn
был палиндромом для начала.Этот
snd (span (<'1') v)
бит всего наdropWhile
один байт короче; это превращается"01221"
в"1221"
.f
индексы из списка,(i, o i)
гдеo i > 0
(тоi
есть, число Денниса). Обычно здесь(!!)
бывали ошибочные ошибки, считая с 0, но проблема считая с 1. Мне удалось исправить это, начав поиск с-10
(который по моей программе оказалось числом Денниса!) тем самым подтолкнув все числа в правильные места.f 774
есть(12012,3)
.источник
Python 2, 176
Я не могу представить, что мой код подкачки особенно оптимален, но это лучшее, что я смог получить. Мне также не нравится, как часто я конвертирую между строкой и целым числом ...
Для каждого числа создается список того, являются ли все перестановки из двух цифр палиндромами. Счетчик уменьшается, когда хотя бы одно из этих значений истинно, а исходное число не является палиндромом. Так как
0+True
в python вычисляется1
сумма итогового списка работ для порядка числа Денниса.источник
Ржавчина, 390 байт
Новая Java? : /
Развернулся и прокомментировал:
источник
Желе , 33 байта (неконкурентный)
Попробуйте онлайн!
Как это устроено
источник
APL, 87
Тело цикла возвращает вектор из 4 чисел: 1) левый аргумент,
⍺
считанный из входных данных, 2) количество показов чисел Денниса, 3) текущее значениеX
счетчика цикла и 4) его порядок,K
вычисленный как сумма палиндромов. в пределах 1-перестановок. Он заканчивается, когда первые два элемента становятся равными, а последние два возвращаются как результат.источник
JavaScript (ES6), 229
Как обычно, JavaScript сияет своей неспособностью к комбинаторике (или, может быть, это моя неумелость ...). Здесь я получаю все возможные позиции подкачки, находя все двоичные числа заданной длины и только 2 установленные.
Тестовый запуск фрагмента ниже в Firefox (так как MSIE далек от совместимости с EcmaScript 6, а в Chrome все еще отсутствуют параметры по умолчанию)
источник
awk, 199
Структура
использование
Вставьте это в свою консоль и замените номер после
echo
, если хотитеЭто становится медленным при больших числах;)
Ungolfed многоразовая версия
источник
Рубин, 156
Использует функцию Ruby, где вызов
"19".next!
возвращается,"20"
чтобы избежать необходимости конвертировать типы назад и вперед; мы просто используем регулярные выражения, чтобы игнорировать ведущие0s
. Перебирает все пары позиций строк, чтобы проверить палиндромные переключатели. Первоначально я написал эту рекурсивную функцию, но она разрушает стек.Вывод для 774 - это
["12012", 3]
(удаление кавычек будет стоить на 4 байта больше, но я думаю, что спецификация позволяет им).источник