Celui-ci vient d'un problème réel. Nous l'avons résolu, bien sûr, mais il semble toujours que cela aurait pu être mieux fait, que c'est une solution trop longue et détournée. Cependant, aucun de mes collègues ne peut penser à une manière plus succincte de l'écrire. Je le présente donc comme du code-golf.
Le but est de convertir un entier non négatif en une chaîne de la même manière qu'Excel présente ses en-têtes de colonne. Donc:
0 -> A
1 -> B
...
25 -> Z
26 -> AA
27 -> AB
...
51 -> AZ
52 -> BA
...
16,383 -> XFD
Il doit fonctionner au moins jusqu'à 16 383, mais au-delà est également acceptable (pas de points bonus cependant). J'attends le plus avec impatience la solution C #, mais, selon les traditions du code-golf, tout véritable langage de programmation est le bienvenu.
code-golf
conversion
Vilx-
la source
la source
Réponses:
Perl 6 ,
1614 octetsFonctionne même au-delà de XFD. Grâce aux listes infinies de Perl 6, cela ne prend pas une éternité (et demie) à s'exécuter.
Essayez-le en ligne!
la source
Formule Excel :), 36 caractères
Usage:
Désolé, je n'ai pas pu résister ...
la source
<laughter type="evil">Muhahahahaha!</laughter>
"1"
par1
Perl, 17 caractères
L'
..
opérateur fait la même chose que l'auto-incrémentation magique, mais sans avoir besoin de la variable temporaire et de la boucle. Sauf sistrict subs
c'est dans la portée, les mots nusA
etXFD
sont interprétés comme des chaînes.( Cette réponse a été suggérée par un utilisateur anonyme en tant que modification d' une réponse existante . Je pensais qu'elle méritait d'être une réponse distincte, et je l'ai faite. Puisqu'il ne serait pas juste pour moi d'en gagner la réputation, je ' ve l'ont fait Wiki communautaire. )
la source
$_
et que la sortie est la valeur de l'expression,(A..XFD)[$_]
le problème est résolu avec seulement 12 caractères .perl -E 'say[A..XFD]->[<>]' < number.txt
. Ou, dans les shells qui le supportent, donnez simplement l'entrée sur la ligne de commande avecperl -E 'say[A..XFD]->[<>]' <<< 123
.say+(A..XFD)[<>]
C, 53 caractères
C'est comme jouer au golf avec un marteau ...
Version normale:
Et l'usage est comme ça:
la source
Haskell, 48
Moins golfé:
Explication
Le
sequence
combinateur de Haskell prend une liste d'actions et les exécute, renvoyant le résultat de chaque action dans une liste. Par exemple:est équivalent à:
Dans Haskell, les actions sont traitées comme des valeurs et sont collées ensemble à l'aide de
>>=
(bind) et desreturn
primitives. Tout type peut être une "action" s'il implémente ces opérateurs en ayant une instance Monad .Par ailleurs, le type de liste a une instance de monade. Par exemple:
C'est égal
[(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)]
. Remarquez comment la compréhension de la liste est étonnamment similaire:Les listes étant un type "d'action", nous pouvons les utiliser
sequence
avec des listes. Ce qui précède peut être exprimé comme suit:Ainsi,
sequence
nous donne des combinaisons gratuitement!Ainsi, pour construire la liste:
J'ai juste besoin de construire des listes pour passer à
sequence
Ensuite, utilisez
concatMap
pour appliquer les deux auxsequence
listes et concaténer les listes résultantes. Par coïncidence,concatMap
c'est la=<<
fonction pour les listes, donc la monade de liste me permet de raser quelques caractères ici aussi.la source
Perl, 26 caractères
la source
Ruby, 35 caractères
Usage:
Remarque: Il existe également une version plus courte (30 caractères) utilisant la récursivité.
Mais en utilisant cette fonction, vous devrez peut-être augmenter la taille de la pile pour les grands nombres en fonction de votre interprète ruby.
la source
Groovy, 47
la source
Python 45
51la source
+chr(65+i%26)
à l' intérieur et en testanti>=0
, vous économisant 1 caractère :)f=lambda i:
plutôt quedef f(i):return
f = lambda i: i >= 0 and f(math.floor(i / 26 - 1)) + chr(int(round(65 + i % 26))) or ''
Scala, 62 caractères
Usage:
Retour:
Vous pouvez l'essayer sur Simply scala . Copiez et collez la fonction et utilisez
f(some integer)
pour voir le résultat.la source
""+
sur leelse
boîtier.Excel VBA, 31 octets
Fonction de fenêtre immédiate VBE anonyme qui prend les entrées de la cellule
[A1]
et les sorties vers la fenêtre immédiate VBEla source
JavaScript (Node.js) , 50 octets
Essayez-le en ligne!
Voyant que beaucoup de gens ont commencé à répondre à cela, j'ai répondu aussi.
Remarque :
Il s'agit essentiellement d'une arnaque de la réponse de @ kevinCruijssen en Java raccourcie grâce à JS.
la source
PHP, 30 octets
Exécutez en tant que pipe avec `-nr 'ou essayez-le en ligne .
la source
Z
ça irait[
plutôt queAA
.VBA / VB6 / VBScript (non Excel), 73 octets
L'appel
s(16383)
reviendraXFC
.la source
i>675
-s(676)=A@@
(attenduYZ
),s(677)=A@A
(attenduZA
)Javascript, 147 octets
J'avais un problème similaire. C'est le golf de la solution. Les colonnes Excel sont bijectives base-26 .
Développé, sauf en utilisant des indices 1:
la source
Java, 57 octets (récursif)
Essayez-le en ligne.
Explication:
Java 10, 62 octets (itératif)
Essayez-le en ligne.
Explication:
la source
Forth (gforth) , 59 octets
Essayez-le en ligne!
Explication
la source
R , 65 octets
Réponse récursive comme le sont de nombreuses réponses précédentes.
Essayez-le en ligne!
la source
Powershell, 68 octets
Version récursive alternative, 68 octets:
Script de test:
Production:
Remarque: Powershell ne fournit pas d'
div
opérateur.la source
Haskell, 48
Je pensais vraiment que je pourrais battre l'autre entrée de Haskell, mais hélas ...
Je suis certain qu'il est possible de raser quelques personnages, mais je n'ai pas codé en Haskell depuis près d'un an, donc je suis assez rouillé.
Ce n'est pas exactement ce que vous appelleriez élégant.
la source
string f(int n){return n<0?"":f(n/26-1)+(char)(n%26+65);}
57 caractères, donc je me sentirais presque mal en le postant comme réponse.Jq 1,5 , 71 octets
Attend une entrée
N
. par exempleÉtendu:
Essayez-le en ligne!
la source
> <> , 29 octets
Essayez-le en ligne!
la source
Icône , 58 octets
Essayez-le en ligne!
la source