Voici un beau défi facile:
Étant donné une chaîne qui représente un nombre dans une base inconnue, déterminez la base la plus basse possible dans laquelle ce nombre pourrait être. La chaîne ne contiendra que
0-9, a-z
. Si vous le souhaitez, vous pouvez choisir de prendre des majuscules au lieu de minuscules, mais veuillez le préciser. Vous devez sortir cette base la plus basse possible en décimal.
Voici un exemple plus concret. Si la chaîne d'entrée était "01234", il est impossible que ce nombre soit en binaire, car 2, 3 et 4 ne sont pas tous définis en binaire. De même, ce nombre ne peut pas être en base 3 ou en base 4. Par conséquent, ce nombre doit être en base-5 ou une base supérieure, vous devez donc sortir «5».
Votre code doit fonctionner pour toute base comprise entre la base 1 (unaire, tous les «0») et la base 36 («0-9» et «a-z»).
Vous pouvez prendre des entrées et fournir des sorties dans n'importe quel format raisonnable. Les fonctions intégrées de conversion de base sont autorisées. Comme d'habitude, les échappatoires standard s'appliquent et la réponse la plus courte en octets est gagnante!
Test IO:
#Input #Output
00000 --> 1
123456 --> 7
ff --> 16
4815162342 --> 9
42 --> 5
codegolf --> 25
0123456789abcdefghijklmnopqrstuvwxyz --> 36
la source
You must output this lowest possible base in decimal.
Réponses:
Gelée , 4 octets
Nécessite des majuscules. Essayez-le en ligne! ou vérifier tous les cas de test .
Comment ça marche
la source
Python,
2722 octetsCela nécessite que l'entrée soit un bytestring (Python 3) ou un bytearray (Python 2 et 3).
Merci à @AleksiTorhamo d'avoir joué au golf sur 5 octets!
Testez-le sur Ideone .
Comment ça marche
On commence par prendre le maximum de la chaîne. Si les points de code des lettres sont supérieurs aux points de code des chiffres, ce caractère maximal est également le chiffre de base maximal de 36.
Les points de code «0» - «9» sont 48 - 57 , nous devons donc soustraire 48 de leurs points de code pour calculer les chiffres correspondants, ou 47 pour calculer la base la plus basse possible. De même, les points de code des lettres «a» - «z» sont 97 - 122 . Puisque «a» représente le chiffre avec la valeur 10 , nous devons soustraire 87 de leurs points de code pour calculer les chiffres correspondants, ou 86 pour calculer la base la plus basse possible. Une façon d'y parvenir est la suivante.
La différence entre 97 et 58 ( ':' , le caractère après '9' ) est de 39 , donc prendre les points de code modulo 39 peut réaliser la soustraction. Puisque 48% 39 = 9 et que le résultat souhaité pour le caractère '0' est 1 , nous soustrayons d'abord 8 avant de prendre le résultat modulo 39 . La soustraction en premier est nécessaire car sinon 'u'% 39 = 117% 39 = 0 .
la source
ord()
et gagner de 3 octets. :)Python, 25 octets
Définit un lambda qui prend la chaîne
x
. Recherche le plus grand chiffre de la chaîne (trié avec des lettres au-dessus des chiffres, par défaut de python), et convertit en base 36. Ajoute 1, car8
n'est pas en base 8.la source
Haskell, 34 octets
Utilise l'
mod(ord(c)-8,39)
idée de Dennis.41 octets
45 octets:
Sorties comme
Just 3
.la source
Cheddar ,
342921 octets8 octets enregistrés grâce à Dennis !!!
Utilise des lettres minuscules
Essayez-le en ligne
Explication
la source
(-)&8
lieu den->n-8
?f&n
lie bassementn
au premier argument de la fonction.05AB1E , 6 octets
Prend des lettres en majuscules.
Explication
Essayez-le en ligne
la source
En fait , 6 octets
Essayez-le en ligne!
la source
Julia, 22 octets
Il y a un caractère BS (0x08) entre les guillemets. Essayez-le en ligne!
la source
-''
il?JavaScript (ES6),
4137 octetsEdit: 4 octets enregistrés grâce à @ edc65.
la source
pop()
pour enregistrer 4Haskell,
5540 octetsMerci @Dennis pour son approche. (prenez ça, @xnor;))
la source
f=
pour 38 octets carf
ne prend pas d'arguments explicites.Perl 6: 18 octets
Définit un lambda qui prend un seul argument de chaîne et renvoie un entier. Il divise la chaîne en caractères, trouve la "plus haute", la convertit en base 36, ajoute 1.
Celui-ci utilise l'approche modulo de Dennis. Même longueur.
la source
Rétine , 28 octets
Essayez-le en ligne! (La première ligne active une suite de tests séparée par saut de ligne.)
Explication
Cela trie les caractères de l'entrée.
Cela supprime tous les caractères sauf le dernier, donc les deux premières étapes trouvent le caractère maximum.
Ce sont deux étapes qui forment une boucle. Le premier duplique le premier caractère et le second le "décrémente" (en remplaçant par exemple
x
parw
,a
avec9
et1
avec0
). Cette dernière étape rencontre un zéro comme premier caractère, elle le supprime à la place. Il s'agit d'une technique standard pour générer une plage de caractères, étant donné l'extrémité supérieure. Par conséquent, cela génère tous les «chiffres» du0
chiffre maximum.Enfin, nous comptons simplement le nombre de chiffres, ce qui nous donne la base.
la source
R,
998985 octetsRegardez! Moins de 100 octets!
Regardez! 10 octets de moins!
Regardez! 4 octets de moins!
Ungolfed:
Comme souvent, cette réponse utilise la
ifelse
fonction:ifelse(Condition, WhatToDoIfTrue, WhatToDoElse)
la source
scan
méthode your pour jouer au golf quelques octets;)PHP,
5138 octets(De Dennis) ^^
Autre proposition sans l'astuce de Dennis
la source
<?=base_convert(max(str_split($argv[1])),36,10)+1
c'est une solution élégante, mais à 49 octets!intval()
au lieu debase_convert()
ce qui réduit à 38 octets<?=intval(max(str_split($argn)),36)+1;
tio: tio.run/##K8go@P/…Octave, 20 octets
la source
Pyke, 6 octets
Essayez-le ici!
la source
Java 7,
6761 octets(m-8)%39
c'est grâce à la réponse étonnante de @Dennis .Non testé et code de test:
Essayez ici.
Sortie:
la source
Math.max()
vous pouvez utiliserm = m>c?m:c
reduce
C89,
55535250 octets-8%39
sans vergogne volé à DennisTester
Sortie
Enregistré 2 octets grâce à Toby Speight
Enregistré 2 octets grâce à Kevin Cruijssen
la source
f(char*s,int b)
devientf(s,b)char*s;
.f(s,b)char*s;{return*s?f(s+1,*s>b?*s:b):(b-8)%39;}
C, 55 octets
Cette réponse suppose que l'entrée est en ASCII (ou identique en chiffres et lettres, par exemple ISO-8859 ou UTF-8):
Nous parcourons simplement la chaîne, en nous souvenant de la plus grande valeur vue, puis utilisons la conversion modulo-39 bien connue de base- {11..36}.
Programme de test
Résultats de test
la source
f()
plus d'une fois. Je sais que presque tout est un jeu équitable dans le golf, mais mes instincts professionnels le considèrent comme trop fragile!m
entre les appels versf()
. Ensuite, mon programme de test pourrait encore fonctionner.Mathematica,
3432 octets2 octets économisés grâce à Martin Ender
J'ai décidé que la méthode différente méritait une nouvelle réponse.
méthode
voléeinspirée par la solution de Dennisla source
Max@Mod[ToCharacterCode@#-8,39]&
(il en va de même pour votre autre réponse)&
à la fin pour indiquer une fonction anonyme.@
dans vos deux réponses (ToCharacterCode@#
etCharacters@#
).Mathematica,
3432 octetséconomisé 2 octets grâce à Martin Ender
Définit une fonction pure qui prend une chaîne en entrée.
Divise l'entrée en caractères, les convertit en base de 36 chiffres et renvoie le maximum +1.
la source
Max@BaseForm[Characters@#,36]+1&
C # REPL, 17 octets
Je viens de porter la réponse de @ Dennis à C #.
la source
CJam, 10 octets
Merci à Martin Ender de m'avoir sauvé quelques octets!
Utilise la formule de Dennis
Essayez-le en ligne
CJam,
1816 btyesSolution alternative:
Essayez-le en ligne
la source
Scala, 25 octets
print((args(0).max-8)%39)
Exécutez-le comme:
$ scala whatbase.scala 0123456789abcdefghijklmnopqrstuvwxyz
la source
R,
6254 octetsUngolfed:
Mise à jour: rasé de 8 octets en raison de la redondance de
na.rm=T
sous l'hypothèse de validité d'entrée.Une amélioration de 39% de la taille par rapport à la réponse de Frédéric . En plus de cela, il s'exécute un peu plus vite: 0,86 seconde pour 100 000 réplications contre 1,09 seconde pour la réponse concurrente. Le mien est donc à la fois plus petit et plus efficace.
la source
Dyalog APL , 10 octets
Invite à saisir des majuscules.
⌈/
maximum⍞
caractères d'entrée⍳⍨
1-indexé dans⎕D,
tous les chiffres suivis de⎕A
tous les personnagesTryAPL en ligne!
la source
BASH 70
Les lettres d'entrée sont en minuscules.
la source
JavaScript,
575048 octets7 octets enregistrés grâce à @ kamaroso97 2 octets enregistrés grâce à @Neil
Réponse originale:
la source
n=>Math.max(...n.split``.map(a=>parseInt(a,36)+1))
.Math.max
existait. Merci de m'en avoir parlé![...s]
est plus court ques.split``
.Perl,
3027 octetsInclut +1 pour
-p
Exécuter avec l'entrée sur STDIN, par exemple
base.pl
:la source
LiveScript, 32 octets
Un portage de cette réponse dans ma langue préférée qui se compile en JavaScript. Si l'
base~number
opérateur travaillait avec des variables, je pourrais écrire->1+36~(it/'')sort!pop!
(23 octets), mais cela entre en conflit avec l'opérateur de liaison de fonction: /la source