Вот хороший простой вызов:
Учитывая строку, которая представляет число в неизвестной базе, определите минимально возможную базу, в которой может быть число. Эта строка будет содержать только
0-9, a-z
. Если хотите, вы можете выбрать заглавные буквы вместо строчных, но, пожалуйста, укажите это. Вы должны вывести эту минимально возможную базу в десятичной форме.
Вот более конкретный пример. Если входная строка была «01234», это число невозможно для двоичного числа, поскольку 2, 3 и 4 не определены в двоичном виде. Точно так же это число не может быть в базе 3 или базе 4. Следовательно, это число должно быть в базе 5 или более высокой базе, поэтому вы должны вывести «5».
Ваш код должен работать для любой базы между базой 1 (унарная, все «0») и базой 36 («0-9» и «a-z»).
Вы можете принимать и предоставлять информацию в любом разумном формате. Встроенные преобразования базы разрешены. Как обычно, применяются стандартные лазейки, и самый короткий ответ в байтах - победитель!
Тест IO:
#Input #Output
00000 --> 1
123456 --> 7
ff --> 16
4815162342 --> 9
42 --> 5
codegolf --> 25
0123456789abcdefghijklmnopqrstuvwxyz --> 36
источник
You must output this lowest possible base in decimal.
Ответы:
Желе , 4 байта
Требуется прописная буква Попробуйте онлайн! или проверьте все контрольные примеры .
Как это работает
источник
Python,
2722 байтаДля этого требуется, чтобы входные данные были байтовой строкой (Python 3) или байтовой решеткой (Python 2 и 3).
Спасибо @AleksiTorhamo за 5 байтов в гольфе!
Проверьте это на Ideone .
Как это работает
Мы начинаем с того, что берем максимум строки. Это кодовые точки букв выше, чем кодовые точки цифр, этот максимальный символ также является максимальным основанием 36 цифр.
Кодовая точка '0' - '9' - это 48 - 57 , поэтому мы должны вычесть 48 из их кодовых точек, чтобы вычислить соответствующие цифры, или 47, чтобы вычислить минимально возможную базу. Точно так же кодовые точки букв «а» - «z» равны 97 - 122 . Поскольку «а» представляет цифру со значением 10 , мы должны вычесть 87 из их кодовых точек, чтобы вычислить соответствующие цифры, или 86, чтобы вычислить минимально возможное основание. Один из способов достижения этого заключается в следующем.
Разница между 97 и 58 ( ':' , символ после '9' ) составляет 39 , поэтому взятие кодовых точек по модулю 39 может привести к вычитанию. Поскольку 48% 39 = 9 , а желаемый результат для символа '0' равен 1 , мы сначала вычитаем 8, а затем получаем результат по модулю 39 . Вычитание сначала необходимо, так как в противном случае 'u'% 39 = 117% 39 = 0 .
источник
ord()
и выиграть на 3 байта. :)Python, 25 байт
Определяет лямбду, которая принимает строку
x
. Находит самую большую цифру в строке (отсортированную по буквам над цифрами по умолчанию в python) и конвертируется в базу 36. Добавляет 1, потому что8
отсутствует в базе 8.источник
Haskell, 34 байта
Использует
mod(ord(c)-8,39)
идею от Денниса.41 байт
45 байт:
Выходы вроде
Just 3
.источник
Чеддер ,
342921 байтСохранено 8 байт благодаря Денису !!!
Использует строчные буквы
Попробуйте онлайн
объяснение
источник
(-)&8
вместоn->n-8
?f&n
связываетсяn
с первым аргументом функции.05AB1E , 6 байтов
Берет буквы в верхнем регистре.
объяснение
Попробуйте онлайн
источник
На самом деле , 6 байтов
Попробуйте онлайн!
источник
Юлия, 22 байта
Между кавычками есть символ BS (0x08). Попробуйте онлайн!
источник
-''
?JavaScript (ES6),
4137 байтРедактировать: 4 байта сохранены благодаря @ edc65.
источник
pop()
для сохранения 4Haskell,
5540 байтСпасибо @Dennis за его подход. (возьми, @xnor;))
источник
f=
для 38 байтов, такf
как не принимает явных аргументов.Perl 6: 18 байт
Определяет лямбду, которая принимает один строковый аргумент и возвращает целое число. Он разбивает строку на символы, находит самый высокий, преобразует ее в базу 36, добавляет 1.
Этот использует подход по модулю от Денниса. Одинаковой длины
источник
Сетчатка , 28 байт
Попробуйте онлайн! (Первая строка включает набор тестов, разделенных переводом строки.)
объяснение
Это сортирует символы ввода.
При этом удаляются все символы, кроме последнего, поэтому первые два этапа находят максимальный символ.
Это две стадии, которые образуют петлю. Первый дублирует первый символ, а второй «уменьшает» его (заменяя, например,
x
наw
,a
с9
и1
на0
). На последнем этапе в качестве первого символа встречается ноль, вместо этого он удаляется. Это стандартная техника для генерации диапазона символов, учитывая верхний предел. Следовательно, это генерирует все «цифры» от0
максимальной цифры.Наконец, мы просто посчитаем количество цифр, которое дает нам базу.
источник
R,
998985 байтСмотри ! Менее 100 байт!
Смотри ! 10 байтов!
Смотри ! 4 байта!
Ungolfed:
Как часто этот ответ использует
ifelse
функцию:ifelse(Condition, WhatToDoIfTrue, WhatToDoElse)
источник
scan
метод для игры в гольф несколько байтов;)PHP,
5138 байт(От Денниса) ^^
Другое предложение без уловки Денниса
источник
<?=base_convert(max(str_split($argv[1])),36,10)+1
это элегантное решение, но с 49 байтами!intval()
вместоbase_convert()
которого сокращается до 38 байт<?=intval(max(str_split($argn)),36)+1;
tio: tio.run/##K8go@P/…Октава, 20 байт
источник
Пайк, 6 байт
Попробуй это здесь!
источник
Java 7,
6761 байт(m-8)%39
это благодаря удивительному ответу @Dennis .Ungolfed & тестовый код:
Попробуй это здесь.
Выход:
источник
Math.max()
тебя можно использоватьm = m>c?m:c
reduce
C89,
55535250 байтов-8%39
бесстыдно украденный у ДенисаТест
Выход
Сохранено 2 байта благодаря Тоби Спейт
Сохранено 2 байта благодаря Кевину Круйссену
источник
f(char*s,int b)
становитсяf(s,b)char*s;
.f(s,b)char*s;{return*s?f(s+1,*s>b?*s:b):(b-8)%39;}
C, 55 байтов
Этот ответ предполагает, что входные данные представлены в формате ASCII (или идентичны цифрам и буквам, например, ISO-8859 или UTF-8):
Мы просто выполняем итерацию по строке, помня наибольшее значение, которое видели, а затем используем хорошо известное преобразование по модулю 39 из base- {11..36}.
Тестовая программа
Результаты теста
источник
f()
более одного раза. Я знаю, что в гольфе почти все честно, но мои профессиональные инстинкты считают это слишком хрупким!m
между вызовамиf()
. Тогда моя тестовая программа все еще может работать.Mathematica,
3432 байта2 байта сэкономлено благодаря Мартину Эндеру
Я решил, что другой метод заслуживает нового ответа.
метод
украденвдохновлен решением Деннисаисточник
Max@Mod[ToCharacterCode@#-8,39]&
(то же самое относится и к вашему другому ответу)&
в конец, чтобы указать анонимную функцию.@
в обоих своих ответах (ToCharacterCode@#
иCharacters@#
).Mathematica,
3432 байтасэкономил 2 байта благодаря Мартину Эндеру
Определяет чистую функцию, которая принимает строку в качестве входных данных.
Разбивает ввод на символы, преобразует их в базовые 36 чисел и возвращает максимум +1.
источник
Max@BaseForm[Characters@#,36]+1&
C # REPL, 17 байт
Просто портировал @ ответ Денниса на C #.
источник
CJam, 10 байтов
Спасибо Мартину Эндеру за то, что он спас мне несколько байтов!
Использует формулу Денниса
Попробуйте онлайн
CJam,
1816 месяцевАльтернативное решение:
Попробуйте онлайн
источник
Скала, 25 байт
print((args(0).max-8)%39)
Запустите это как:
$ scala whatbase.scala 0123456789abcdefghijklmnopqrstuvwxyz
источник
R,
6254 байтаUngolfed:
Обновление: сокращено на 8 байт из-за избыточности
na.rm=T
в предположении достоверности ввода.Увеличение размера на 39% по сравнению с ответом Фредерика . Кроме того, он работает немного быстрее: 0,86 секунды для 100000 повторов против 1,09 секунды для конкурирующего ответа. Так что один из них меньше и эффективнее.
источник
Dyalog APL , 10 байт
Запрашивает ввод в верхнем регистре.
⌈/
максимальная⍞
символы ввода⍳⍨
1-индексируется в⎕D,
все цифры следуют⎕A
все персонажиПопробуй APL онлайн!
источник
BASH 70
Вводимые буквы строчные.
источник
JavaScript,
575048 байт7 байтов сохранено благодаря @ kamaroso97 2 байта сохранено благодаря @Neil
Оригинальный ответ:
источник
n=>Math.max(...n.split``.map(a=>parseInt(a,36)+1))
.Math.max
существует. Спасибо, что рассказали мне об этом![...s]
короче чемs.split``
.Perl,
3027 байтВключает +1 для
-p
Запустите с помощью ввода на STDIN, например,
base.pl
:источник
LiveScript, 32 байта
Порт этого ответа на моем любимом языке, который компилируется в JavaScript. Если
base~number
оператор работал с переменными, я мог бы написать->1+36~(it/'')sort!pop!
(23 байта), но это конфликтует с оператором связывания функции: /источник