Oto całkiem proste wyzwanie:
Biorąc pod uwagę ciąg reprezentujący liczbę w nieznanej bazie, określ najniższą możliwą bazę, w której może znajdować się liczba. Ciąg będzie zawierał tylko
0-9, a-z
. Jeśli chcesz, możesz wybrać wielkie litery zamiast małych, ale określ to. Musisz podać tę najniższą możliwą podstawę w systemie dziesiętnym.
Oto bardziej konkretny przykład. Jeśli ciąg wejściowy to „01234”, to niemożliwe jest, aby ta liczba była binarna, ponieważ 2, 3 i 4 są niezdefiniowane binarnie. Podobnie, liczba ta nie może znajdować się w podstawie 3 ani w bazie 4. Dlatego też liczba ta musi znajdować się w podstawie 5 lub wyższej, więc powinieneś wypisać „5”.
Twój kod musi działać dla dowolnej bazy między bazą 1 (unary, wszystkie „0”) a bazą 36 („0-9” i „a-z”).
Możesz przyjmować dane wejściowe i dostarczać dane wyjściowe w dowolnym rozsądnym formacie. Wbudowane konwersje podstawowe są dozwolone. Jak zwykle obowiązują standardowe luki, a zwycięzcą jest najkrótsza odpowiedź w bajtach!
Test IO:
#Input #Output
00000 --> 1
123456 --> 7
ff --> 16
4815162342 --> 9
42 --> 5
codegolf --> 25
0123456789abcdefghijklmnopqrstuvwxyz --> 36
źródło
You must output this lowest possible base in decimal.
Odpowiedzi:
Galaretka , 4 bajty
Wymaga wielkich liter. Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
Python,
2722 bajtówWymaga to, aby dane wejściowe były bajtowaniem (Python 3) lub bajtowaniem (Python 2 i 3).
Dzięki @AleksiTorhamo za grę w golfa z 5 bajtów!
Przetestuj na Ideone .
Jak to działa
Zaczynamy od pobrania maksimum ciągu. To, że punkty kodowe liter są wyższe niż punkty kodowe cyfr, ten maksymalny znak jest również maksymalną 36 cyfrą podstawową.
Punkt kodowy „0” - „9” to 48–57 , więc musimy odjąć 48 od ich punktów kodowych, aby obliczyć odpowiednie cyfry, lub 47, aby obliczyć najniższą możliwą podstawę. Podobnie punkty kodowe liter „a” - „z” to 97–122 . Ponieważ „a” reprezentuje cyfrę o wartości 10 , musimy odjąć 87 od ich punktów kodowych, aby obliczyć odpowiednie cyfry, lub 86, aby obliczyć najniższą możliwą podstawę. Jednym ze sposobów osiągnięcia tego jest:
Różnica między 97 a 58 ( „:” , znak po „9” ) wynosi 39 , więc biorąc punkty kodowe modulo 39, można osiągnąć odejmowanie. Ponieważ 48% 39 = 9 , a pożądany wynik dla znaku „0” wynosi 1 , najpierw odejmujemy 8, zanim weźmiemy wynik modulo 39 . Odejmowanie w pierwszej kolejności jest konieczne, ponieważ w przeciwnym razie „u”% 39 = 117% 39 = 0 .
źródło
ord()
i wygrać o 3 bajty. :)Python, 25 bajtów
Definiuje lambda, która pobiera ciąg
x
. Znajduje największą cyfrę w ciągu (posortowaną według liter powyżej cyfr, domyślnie w Pythonie) i konwertuje na bazę 36. Dodaje 1, ponieważ8
nie ma jej w bazie 8.źródło
Haskell, 34 bajty
Wykorzystuje
mod(ord(c)-8,39)
pomysł Dennisa.41 bajtów
45 bajtów:
Wyjścia jak
Just 3
.źródło
Cheddar ,
342921 bajtówZaoszczędzono 8 bajtów dzięki Dennisowi !!!
Używa małych liter
Wypróbuj online
Wyjaśnienie
źródło
(-)&8
zamiastn->n-8
?f&n
obligacjin
do pierwszego arg funkcji.05AB1E , 6 bajtów
Przyjmuje wielkie litery.
Wyjaśnienie
Wypróbuj online
źródło
Właściwie 6 bajtów
Wypróbuj online!
źródło
Julia, 22 bajty
Pomiędzy cudzysłowami jest znak BS (0x08). Wypróbuj online!
źródło
-''
zrobić?JavaScript (ES6),
4137 bajtówEdycja: Zapisano 4 bajty dzięki @ edc65.
źródło
pop()
aby zapisać 4Haskell,
5540 bajtówDzięki @Dennis za jego podejście. (weź to, @xnor;))
źródło
f=
dla 38 bajtów, ponieważf
nie przyjmuje wyraźnych argumentów.Perl 6: 18 bajtów
Definiuje lambda, która pobiera argument z jednym ciągiem i zwraca liczbę całkowitą. Dzieli ciąg na znaki, znajduje „najwyższy”, konwertuje go na bazę 36, dodaje 1.
Ten wykorzystuje podejście modulo od Dennisa. Ta sama długość.
źródło
Siatkówka , 28 bajtów
Wypróbuj online! (Pierwszy wiersz włącza pakiet testowy oddzielony od linii).
Wyjaśnienie
To sortuje znaki wejściowe.
To usuwa wszystkie postacie oprócz ostatniego, więc pierwsze dwa etapy znajdują maksymalną postać.
Są to dwa etapy, które tworzą pętlę. Pierwszy z nich powiela pierwszego znaku, a drugi to „ubytków” (zastępujące np
x
zw
,a
z9
, a1
z0
). Ten ostatni etap napotyka zero jako pierwszy znak, zamiast tego go usuwa. Jest to standardowa technika generowania zakresu znaków, biorąc pod uwagę górny koniec. W ten sposób generowane są wszystkie „cyfry” od0
cyfry maksymalnej.Wreszcie, po prostu liczymy liczbę cyfr, co daje nam podstawę.
źródło
R,
998985 bajtówPopatrz ! Mniej niż 100 bajtów!
Popatrz ! 10 bajtów off!
Popatrz ! 4 bajty wyłączone!
Nie golfowany:
Jak często ta odpowiedź korzysta z
ifelse
funkcji:ifelse(Condition, WhatToDoIfTrue, WhatToDoElse)
źródło
scan
metody do gry w golfa w niektórych bajtach;)PHP,
5138 bajtów(Od Dennisa) ^^
Inna propozycja bez sztuczki Dennisa
źródło
<?=base_convert(max(str_split($argv[1])),36,10)+1
jest eleganckim rozwiązaniem, ale ma 49 bajtów!intval()
zamiast tego,base_convert()
który skraca do 38 bajtów<?=intval(max(str_split($argn)),36)+1;
tio: tio.run/##K8go@P/…Oktawa, 20 bajtów
źródło
Pyke, 6 bajtów
Wypróbuj tutaj!
źródło
Java 7,
6761 bajtów(m-8)%39
jest dzięki niesamowitej odpowiedzi @Dennis .Kod niepoznany i testowy:
Wypróbuj tutaj.
Wydajność:
źródło
Math.max()
ciebie możesz użyćm = m>c?m:c
reduce
C89,
55535250 bajtów-8%39
bezwstydnie skradziony DennisowiTest
Wydajność
Zaoszczędzono 2 bajty dzięki Toby Speightowi
Zaoszczędzono 2 bajty dzięki Kevinowi Cruijssenowi
źródło
f(char*s,int b)
staje sięf(s,b)char*s;
.f(s,b)char*s;{return*s?f(s+1,*s>b?*s:b):(b-8)%39;}
C, 55 bajtów
Ta odpowiedź zakłada, że dane wejściowe są w formacie ASCII (lub identyczne z cyframi i literami, np. ISO-8859 lub UTF-8):
Po prostu iterujemy wzdłuż łańcucha, pamiętając największą zaobserwowaną wartość, a następnie używamy dobrze znanej konwersji modulo-39 z base- {11..36}.
Program testowy
Wyniki testów
źródło
f()
więcej niż raz. Wiem, że prawie wszystko jest uczciwą grą w golfa, ale moje zawodowe instynkty uważają to za zbyt delikatne!m
między połączeniami zf()
. Wtedy mój program testowy mógłby nadal działać.Mathematica,
3432 bajty2 bajty zapisane dzięki Martinowi Enderowi
Uznałem, że inna metoda zasługuje na nową odpowiedź.
metoda
skradzionainspirowana rozwiązaniem Dennisaźródło
Max@Mod[ToCharacterCode@#-8,39]&
(to samo dotyczy twojej drugiej odpowiedzi)&
na końcu, aby wskazać anonimową funkcję.@
z obu swoich odpowiedzi (ToCharacterCode@#
iCharacters@#
).Mathematica,
3432 bajtyzapisane 2 bajty dzięki Martinowi Enderowi
Definiuje czystą funkcję, która pobiera ciąg jako dane wejściowe.
Dzieli dane wejściowe na znaki, konwertuje je na 36 liczb podstawowych i zwraca maksimum +1.
źródło
Max@BaseForm[Characters@#,36]+1&
C # REPL, 17 bajtów
Właśnie przeniesiono odpowiedź @ Dennisa na C #.
źródło
CJam, 10 bajtów
Dzięki Martinowi Enderowi za uratowanie mi kilku bajtów!
Wykorzystuje formułę Dennisa
Wypróbuj online
CJam,
1816 bajtówAlternatywne rozwiązanie:
Wypróbuj online
źródło
Scala, 25 bajtów
print((args(0).max-8)%39)
Uruchom to jak:
$ scala whatbase.scala 0123456789abcdefghijklmnopqrstuvwxyz
źródło
R,
6254 bajtyNie golfowany:
Aktualizacja: wygolono 8 bajtów z powodu redundancji
na.rm=T
przy założeniu ważności danych wejściowych.O 39% większa wielkość w porównaniu do odpowiedzi Frédérica . Poza tym działa trochę szybciej: 0,86 sekundy dla 100000 replikacji w porównaniu do 1,09 sekundy dla konkurencyjnej odpowiedzi. Więc mój jest zarówno mniejszy, jak i bardziej wydajny.
źródło
Dyalog APL , 10 bajtów
Monity o wpisywanie wielkich liter.
⌈/
maksymalny⍞
znaki wejściowe⍳⍨
1 indeksowane do⎕D,
wszystkie cyfry, po których następuje⎕A
wszystkie postacieWypróbuj APL online!
źródło
BASH 70
Wprowadzane litery są małe.
źródło
JavaScript,
575048 bajtów7 bajtów zapisanych dzięki @ kamaroso97 2 bajty zapisane dzięki @Neil
Oryginalna odpowiedź:
źródło
n=>Math.max(...n.split``.map(a=>parseInt(a,36)+1))
.Math.max
istnienia. Dzięki, że mi o tym opowiedziałeś![...s]
jest krótszy niżs.split``
.Perl,
3027 bajtówObejmuje +1 dla
-p
Uruchom z wejściem na STDIN, np
base.pl
:źródło
LiveScript, 32 bajty
Część tej odpowiedzi w moim ulubionym języku, która kompiluje się w JavaScript. Gdyby
base~number
operator pracował ze zmiennymi, mógłbym zapisać->1+36~(it/'')sort!pop!
(23 bajty), ale powoduje to konflikt z operatorem powiązania funkcji: /źródło