Язык J имеет очень глупый синтаксис для определения констант . Я хочу сосредоточиться на одной интересной особенности в частности: способность писать произвольно.
Если вы пишете XbY
для X
любого числа и Y
любой строки буквенно-цифровых символов, то J будет интерпретироваться Y
как базовое X
число, где 0
сквозные 9
имеют свое обычное значение, а a
сквозные z
обозначают от 10 до 35.
И когда я говорю X
любое число, я имею в виду любое число. Для целей этого вопроса я ограничусь X
положительным целым числом, но в J вы можете использовать что угодно: отрицательные числа, дроби, комплексные числа, что угодно.
Странно то, что вы можете использовать только цифры от 0 до 35 в качестве своей базовой цифры, независимо от того, какие цифры вы используете, потому что ваша коллекция используемых символов состоит только из 0-9 и az.
Проблема
Я хочу, чтобы программа помогла мне использовать магические числа в гольф, такие как 2 933 774 030 998, используя этот метод. Ну, ладно, может быть, не так уж и много, я с тобой справлюсь. Так...
Ваша задача - написать программу или функцию, которая принимает (обычно большое) десятичное число
N
от 1 до 4 294 967 295 (= 2 32 -1) в качестве входных данных и выводит / возвращает самое короткое представление формыXbY
, гдеX
положительное целое числоY
равно строка, состоящая из буквенно-цифровых символов (0-9 и az, без учета регистра) иY
интерпретируемая в базовыхX
равныхN
.Если длина каждого представления
XbY
представления больше или равна количеству цифрN
, тоN
вместо этого выведите . Во всех других связях вы можете вывести любое непустое подмножество кратчайших представлений.
Это код гольф, поэтому чем короче, тем лучше.
Контрольные примеры
Input | Acceptable outputs (case-insensitive)
------------+-------------------------------------------------------
5 | 5
|
10000000 | 79bkmom 82bibhi 85bgo75 99bauua 577buld
| 620bq9k 999baka
|
10000030 | 85bgo7z
|
10000031 | 10000031
|
12345678 | 76bs9va 79bp3cw 82bmw54 86bjzky 641buui
|
34307000 | 99bzzzz
|
34307001 | 34307001
|
1557626714 | 84bvo07e 87brgzpt 99bglush 420blaze
|
1892332260 | 35bzzzzzz 36bvan8x0 37brapre5 38bnxkbfe 40bij7rqk
| 41bgdrm7f 42bek5su0 45bablf30 49b6ycriz 56b3onmfs
| 57b38f9gx 62b244244 69b1expkf 71b13xbj3
|
2147483647 | 36bzik0zj 38br3y91l 39bnvabca 42bgi5of1 48b8kq3qv
(= 2^31-1) | 53b578t6k 63b2akka1 1022b2cof 1023b2661 10922bio7
| 16382b8wv 16383b8g7 32764b2gv 32765b2ch 32766b287
| 32767b241
|
2147483648 | 512bg000 8192bw00
|
4294967295 | 45bnchvmu 60b5vo6sf 71b2r1708 84b12mxf3 112brx8iv
(= 2^32-1) | 126bh5aa3 254b18owf 255b14640 1023b4cc3 13107bpa0
| 16383bgwf 21844b9of 21845b960 32765b4oz 32766b4gf
| 32767b483 65530b1cz 65531b1ao 65532b18f 65533b168
| 65534b143 65535b120
Если вы когда-либо не уверены, равно ли какое-либо представление некоторому числу, вы можете использовать любой J-интерпретатор, например, такой, как в Try It Online . Просто введите stdout 0":87brgzpt
и J выплюнет обратно 1557626714
. Обратите внимание, что J принимает только строчные буквы, даже если эта проблема не чувствительна к регистру.
Некоторая, возможно, полезная теория
- Для всех
N
менее 10 000 000 десятичное представление такое же короткое, как и любое другое, и, следовательно, является единственным приемлемым выходным значением. Чтобы сохранить что-либо, вам нужно быть как минимум на четыре цифры короче в новой базе, и даже больше, если база больше 99. - Достаточно проверить основания до потолка квадратного корня
N
. Для любого большего основания B ,N
будет не более два цифр в базовой B , поэтому в первый раз , вы получите что - то с действительной первой цифрой около B ≈N
/ 35. Но при таком размере вы всегда будете не меньше десятичного представления, так что нет смысла пытаться. Помните, что ceil (sqrt (наибольшее число, для которого я попрошу вас решить эту проблему)) = 65536. - Если у вас есть какое-либо представление в базе менее 36, то представление в базе 36 будет по меньшей мере таким же коротким. Таким образом, вам не нужно беспокоиться о случайно коротких решениях в базах менее 36. Например, представление
35bzzzzzz
для 1 892 322 260 использует необычную цифру для этой базы, но36bvan8x0
имеет ту же длину.
источник
Ответы:
JavaScript (ES6),
103101 байтПринимает ввод в виде строки.
Контрольные примеры
NB. Количество итераций в функции сниппета ограничено 600, чтобы тесты выполнялись быстрее. (В противном случае это займет несколько секунд.)
Показать фрагмент кода
источник
Math.floor(x/b)
вместоx/b|0
. (Но я не проверял это.)Рубин , 118 байт
Это было связано с другим вопросом, и я заметил, что здесь не так много ответов, поэтому я решил дать ему шанс.
Пройдите по всем базам вплоть до ввода, чтобы построить все действительные конструкции числа J. Это пропускает 1-8, хотя, потому что никоим образом они не будут короче, чем представление 10. Это довольно наивное решение, учитывая все обстоятельства, так как оно вызывает
digits
встроенную функцию для получения цифр, но, поскольку она начинается с наименее значащей цифры, сначала мы должныreverse
получить фактическое число, поэтому его можно улучшить.Это медленно. Так оооочень невероятно медленно. Тайм-аут на 34307000, например. Мы могли бы пойти с квадратным корнем или даже выбором Арно,
7e4
чтобы сэкономить время, но это стоит дополнительных байтов, так зачем беспокоиться?Попробуйте онлайн!
Попробуйте онлайн с sqrt, чтобы все закончилось вовремя
источник
05AB1E , 37 байт
10000000
ã
Без окончательного оператора if
DgIg@i\}
он все еще может быть проверен на более низкие значения, чтобы убедиться, что он действительно работает: попробуйте его онлайн.Посмотрим, смогу ли я придумать (возможно, гораздо дольше, но) более эффективное решение позже.
Объяснение:
источник
XbY
больше или равна количеству цифрN
, то выведитеN
вместо него». Хотя у вас есть первые 10 миллионов чисел, я подозреваю, что ввод10000031
даст что-то вроде26blmoof
. Число допустимо, но длина такая же, как и у ввода, поэтому вместо него он должен возвращать ввод.