Hier ist eine schöne einfache Herausforderung:
Bestimmen Sie anhand einer Zeichenfolge, die eine Zahl in einer unbekannten Basis darstellt, die niedrigste mögliche Basis, in der sich diese Zahl möglicherweise befindet. Die Zeichenfolge enthält nur
0-9, a-z
. Wenn Sie möchten, können Sie Großbuchstaben anstelle von Kleinbuchstaben verwenden. Geben Sie dies jedoch an. Sie müssen diese niedrigstmögliche Basis dezimal ausgeben.
Hier ist ein konkreteres Beispiel. Wenn die Eingabezeichenfolge "01234" war, ist es unmöglich, dass diese Zahl binär ist, da 2, 3 und 4 in binär nicht definiert sind. In ähnlicher Weise kann diese Zahl nicht 4. Daher in der Basis 3 oder Base sein, diese Zahl muss in der Basis-5 sein, oder eine höhere Basis, so sollten Sie Ausgang ‚5‘.
Ihr Code muss für jede Basis zwischen Basis 1 (unär, alle Nullen) und Basis 36 ('0-9' und 'a-z') funktionieren.
Sie können Eingaben vornehmen und Ausgaben in jedem vernünftigen Format bereitstellen. Buildins für die Basiskonvertierung sind zulässig. Wie üblich gelten Standardlücken und die kürzeste Antwort in Bytes ist der Gewinner!
Test IO:
#Input #Output
00000 --> 1
123456 --> 7
ff --> 16
4815162342 --> 9
42 --> 5
codegolf --> 25
0123456789abcdefghijklmnopqrstuvwxyz --> 36
quelle
You must output this lowest possible base in decimal.
Antworten:
Gelee , 4 Bytes
Benötigt Großbuchstaben. Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
Python,
2722 BytesDies erfordert, dass die Eingabe ein Bytestring (Python 3) oder ein Bytearray (Python 2 und 3) ist.
Vielen Dank an @AleksiTorhamo für das Abschlagen von 5 Bytes!
Teste es auf Ideone .
Wie es funktioniert
Wir beginnen mit dem Maximum der Zeichenkette. Hierbei sind die Codepunkte der Buchstaben höher als die Codepunkte der Ziffern, wobei dieses maximale Zeichen auch die maximale Basisziffer 36 ist.
Der Codepunkt von '0' - '9' ist 48 - 57 , daher müssen wir 48 von ihren Codepunkten abziehen , um die entsprechenden Ziffern zu berechnen , oder 47 , um die niedrigstmögliche Basis zu berechnen. Ähnlich werden die Codepunkte des Buchstaben ‚A‘ - ‚Z‘ sind 97 bis 122 . Da 'a' die Ziffer mit dem Wert 10 darstellt , müssen wir 87 von ihren Codepunkten abziehen , um die entsprechenden Ziffern zu berechnen , oder 86 , um die niedrigstmögliche Basis zu berechnen. Ein Weg, dies zu erreichen, ist wie folgt.
Der Unterschied zwischen 97 und 58 ( ':' , das Zeichen nach '9' ) beträgt 39 , sodass die Subtraktion mit den Codepunkten modulo 39 erzielt werden kann. Da 48% 39 = 9 , und das gewünschte Ergebnis für das Zeichen ‚0‘ ist 1 , subtrahieren wir zuerst 8 , bevor das Ergebnis modulo Aufnahme 39 . Zuerst muss subtrahiert werden, da sonst 'u'% 39 = 117% 39 = 0 ist .
quelle
ord()
und um 3 Byte gewinnen. :)Python, 25 Bytes
Definiert ein Lambda, das die Zeichenfolge annimmt
x
. Findet die größte Ziffer in der Zeichenfolge (standardmäßig nach Buchstaben über den Ziffern sortiert) und konvertiert sie zur Basis 36. Fügt 1 hinzu, da sie8
nicht zur Basis 8 gehört.quelle
Haskell, 34 Bytes
Verwendet die
mod(ord(c)-8,39)
Idee von Dennis.41 Bytes
45 Bytes:
Ausgänge mögen
Just 3
.quelle
Cheddar ,
342921 Bytes8 Bytes dank Dennis gespart !!!
Verwendet Kleinbuchstaben
Probieren Sie es online aus
Erläuterung
quelle
(-)&8
stattn->n-8
?f&n
Bindungenn
zum ersten Arg- der Funktion.05AB1E , 6 Bytes
Nimmt Buchstaben in Großbuchstaben.
Erläuterung
Probieren Sie es online aus
quelle
Eigentlich 6 Bytes
Probieren Sie es online!
quelle
Julia, 22 Bytes
Zwischen den Anführungszeichen steht ein BS-Zeichen (0x08). Probieren Sie es online!
quelle
-''
tun?JavaScript (ES6),
4137 ByteBearbeiten: 4 Bytes dank @ edc65 gespeichert.
quelle
pop()
speichern 4Haskell,
5540 BytesDanke @Dennis für seinen Ansatz. (nimm das, @xnor;))
quelle
f=
für 38 Bytes entfernen, daf
keine expliziten Argumente verwendet werden.Perl 6: 18 Bytes
Definiert ein Lambda, das ein einzelnes Zeichenfolgenargument akzeptiert und eine Ganzzahl zurückgibt. Es teilt den String in Zeichen auf, findet den "höchsten", konvertiert ihn in Basis 36 und addiert 1.
Dieser nutzt den Modulo-Ansatz von Dennis. Die gleiche Länge.
quelle
Retina , 28 Bytes
Probieren Sie es online! (Die erste Zeile aktiviert eine durch Zeilenvorschub getrennte Testsuite.)
Erläuterung
Dies sortiert die Zeichen der Eingabe.
Dadurch werden alle Zeichen mit Ausnahme des letzten entfernt, sodass in den ersten beiden Schritten das maximale Zeichen ermittelt wird.
Dies sind zwei Stufen, die eine Schleife bilden. Das erste dupliziert das erste Zeichen und das zweite "dekrementiert" es (ersetzt zB
x
mitw
,a
mit9
und1
mit0
). Die letzte Stufe trifft auf eine Null als erstes Zeichen, sie entfernt sie stattdessen. Dies ist eine Standardtechnik zum Erzeugen einer Reihe von Zeichen am oberen Ende. Somit werden alle "Ziffern" von0
bis zur maximalen Ziffer erzeugt.Schließlich zählen wir einfach die Anzahl der Stellen, die uns die Basis gibt.
quelle
R
998985 BytesAussehen ! Weniger als 100 Bytes!
Aussehen ! 10 Bytes aus!
Aussehen ! 4 Bytes aus!
Ungolfed:
Wie so oft benutzt diese Antwort die
ifelse
Funktion:ifelse(Condition, WhatToDoIfTrue, WhatToDoElse)
quelle
scan
Methode zum Golfen einiger Bytes verwenden;)PHP,
5138 Bytes(Von Dennis) ^^
Anderer Vorschlag ohne Dennis 'Trick
quelle
<?=base_convert(max(str_split($argv[1])),36,10)+1
ist eine elegante Lösung, aber bei 49 Bytes!intval()
stattdessenbase_convert()
verkürzt sich auf 38 Bytes<?=intval(max(str_split($argn)),36)+1;
tio: tio.run/##K8go@P/…Oktave, 20 Bytes
quelle
Pyke, 6 Bytes
Probieren Sie es hier aus!
quelle
Java 7,
6761 Bytes(m-8)%39
ist dank @Dennis 'erstaunlicher Antwort .Ungolfed & Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle
Math.max()
können Siem = m>c?m:c
reduce
C89,
55535250 Bytes-8%39
schamlos von Dennis gestohlenPrüfung
Ausgabe
Dank Toby Speight 2 Bytes gespart
2 Bytes dank Kevin Cruijssen gespeichert
quelle
f(char*s,int b)
wirdf(s,b)char*s;
.f(s,b)char*s;{return*s?f(s+1,*s>b?*s:b):(b-8)%39;}
C 55 Bytes
Diese Antwort setzt voraus, dass die Eingabe in ASCII erfolgt (oder in den Zahlen und Buchstaben identisch ist, z. B. ISO-8859 oder UTF-8):
Wir iterieren einfach entlang des Strings, wobei wir uns den größten Wert merken, und verwenden dann die bekannte Modulo-39-Konvertierung von base- {11..36}.
Testprogramm
Testergebnisse
quelle
f()
mehr als einmal anrufen . Ich weiß, dass fast alles im Golfsport fair ist, aber meine professionellen Instinkte halten das für zu fragil!m
zwischen Anrufen zurückzusetzenf()
. Dann könnte mein Testprogramm noch funktionieren.Mathematica,
3432 Bytes2 Bytes gespart dank Martin Ender
Ich entschied, dass die andere Methode eine neue Antwort verdient.
Methode
gestohlen,inspiriert von Dennis 'Lösungquelle
Max@Mod[ToCharacterCode@#-8,39]&
(Gleiches gilt für Ihre andere Antwort)&
am Ende hinzufügen , um auf eine anonyme Funktion hinzuweisen.@
Ihrer beiden Antworten (ToCharacterCode@#
undCharacters@#
) vergessen .Mathematica,
3432 Bytes2 Bytes gespart dank Martin Ender
Definiert eine reine Funktion, die eine Zeichenfolge als Eingabe akzeptiert.
Teilt die Eingabe in Zeichen auf, konvertiert sie in Zahlen zur Basis 36 und gibt das Maximum +1 zurück.
quelle
Max@BaseForm[Characters@#,36]+1&
C # REPL, 17 Bytes
Nur portiert @ Dennis Antwort auf C #.
quelle
CJam, 10 Bytes
Vielen Dank an Martin Ender, der mir ein paar Bytes gespart hat!
Verwendet Dennis Formel
Probieren Sie es online aus
CJam,
1816 BtyesAlternative Lösung:
Probieren Sie es online aus
quelle
Scala, 25 Bytes
print((args(0).max-8)%39)
Führen Sie es wie folgt aus:
$ scala whatbase.scala 0123456789abcdefghijklmnopqrstuvwxyz
quelle
R
6254 BytesUngolfed:
Update: 8 Bytes wurden aufgrund der Redundanz von
na.rm=T
unter der Annahme der Eingabegültigkeit abgeschnitten .Eine Größenverbesserung von 39% im Vergleich zu Frédérics Antwort . Außerdem läuft es ein bisschen schneller: 0,86 Sekunden für 100000 Replikationen gegenüber 1,09 Sekunden für die konkurrierende Antwort. Meiner ist also kleiner und effizienter.
quelle
Dyalog APL , 10 Bytes
Fordert zur Eingabe von Großbuchstaben auf.
⌈/
maximal⍞
Zeichen der Eingabe⍳⍨
1-indiziert in⎕D,
Alle Ziffern gefolgt von⎕A
alle ZeichenTryAPL online!
quelle
BASH 70
Eingabebuchstaben sind Kleinbuchstaben.
quelle
JavaScript,
575048 Bytes7 Bytes gespart dank @ kamaroso97 2 Bytes gespart dank @Neil
Ursprüngliche Antwort:
quelle
n=>Math.max(...n.split``.map(a=>parseInt(a,36)+1))
.Math.max
existiert. Danke, dass du mir davon erzählt hast![...s]
ist kürzer alss.split``
.Perl,
3027 BytesBeinhaltet +1 für
-p
Führen Sie mit der Eingabe auf STDIN, z
base.pl
:quelle
LiveScript, 32 Bytes
Ein Port dieser Antwort in meiner Lieblingssprache, die mit JavaScript kompiliert wird. Wenn der
base~number
Operator mit Variablen arbeiten würde, könnte ich schreiben->1+36~(it/'')sort!pop!
(23 Bytes), aber das widerspricht dem Funktionsbindungsoperator: /quelle