Este vem de um problema da vida real. Resolvemos isso, é claro, mas continua a parecer que poderia ter sido feito melhor, que é uma solução muito longa e indireta. No entanto, nenhum dos meus colegas pode pensar em uma maneira mais sucinta de escrevê-lo. Portanto, eu a apresento como código-golfe.
O objetivo é converter um número inteiro não negativo em uma seqüência de caracteres da mesma forma que o Excel apresenta seus cabeçalhos de coluna. Portanto:
0 -> A
1 -> B
...
25 -> Z
26 -> AA
27 -> AB
...
51 -> AZ
52 -> BA
...
16,383 -> XFD
Tem que funcionar pelo menos até 16.383, mas além disso também é aceitável (sem pontos de bônus). Estou ansioso pela solução C #, mas, de acordo com as tradições do code-golf, qualquer linguagem de programação real é bem-vinda.
code-golf
conversion
Vilx-
fonte
fonte
Respostas:
Perl 6 ,
1614 bytesFunciona mesmo além do XFD. Graças às listas infinitas no Perl 6, isso não leva uma eternidade (e meia) para ser executado.
Experimente online!
fonte
Fórmula do Excel :), 36 caracteres
Uso:
Desculpe, não pude resistir ...
fonte
<laughter type="evil">Muhahahahaha!</laughter>
"1"
por1
Perl, 17 caracteres
O
..
operador faz a mesma coisa que o incremento automático mágico, mas sem a necessidade da variável temporária e do loop. A menos questrict subs
esteja no escopo, as palavras de barraA
eXFD
são interpretadas como seqüências de caracteres.( Esta resposta foi sugerida por um usuário anônimo como uma edição para uma resposta existente . Eu senti que ela merece ser uma resposta separada e a criei. Uma vez que não seria justo eu obter representantes dela, eu " tornamos o Wiki da Comunidade. )
fonte
$_
e a saída é o valor da expressão,(A..XFD)[$_]
resolve o desafio com apenas 12 caracteres .perl -E 'say[A..XFD]->[<>]' < number.txt
. Ou, nos shells que o suportam, basta fornecer a entrada na linha de comando comperl -E 'say[A..XFD]->[<>]' <<< 123
.say+(A..XFD)[<>]
C, 53 caracteres
É como jogar golfe com um martelo ...
Versão normal:
E o uso é assim:
fonte
Haskell, 48
Menos golfe:
Explicação
O
sequence
combinador de Haskell pega uma lista de ações e as executa, retornando o resultado de cada ação em uma lista. Por exemplo:é equivalente a:
No Haskell, as ações são tratadas como valores e coladas usando o
>>=
(bind) e oreturn
primitivo. Qualquer tipo pode ser uma "ação" se implementar esses operadores tendo uma instância do Monad .Aliás, o tipo de lista possui uma instância de mônada. Por exemplo:
Isso é igual
[(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)]
. Observe como a compreensão da lista é surpreendentemente semelhante:Como listas são um tipo de "ação", podemos usar
sequence
com listas. O acima pode ser expresso como:Assim,
sequence
nos dá combinações de graça!Assim, para construir a lista:
Eu só preciso criar listas para passar para
sequence
Em seguida, use
concatMap
para aplicarsequence
- se às listas e concatenar as listas resultantes. Coincidentemente,concatMap
é a=<<
função das listas; portanto, a mônada da lista também permite que eu raspe alguns caracteres aqui.fonte
Perl, 26 caracteres
fonte
Ruby, 35 caracteres
Uso:
Nota: Também há uma versão mais curta (30 caracteres) usando recursão.
Mas, usando esta função, você pode ter que aumentar o tamanho da pilha para grandes números, dependendo do seu interpretador de ruby.
fonte
Groovy, 47
fonte
Python 45
51fonte
+chr(65+i%26)
para dentro e testando parai>=0
, poupando-lhe um caráter :)f=lambda i:
, em vez dedef f(i):return
f = lambda i: i >= 0 and f(math.floor(i / 26 - 1)) + chr(int(round(65 + i % 26))) or ''
Scala, 62 caracteres
Uso:
retorna:
Você pode tentar isso no Simply scala . Copie e cole a função e use
f(some integer)
para ver o resultado.fonte
""+
doelse
caso.Excel VBA, 31 bytes
Função de janela imediata VBE anônima que recebe entrada da célula
[A1]
e sai para a janela imediata VBEfonte
JavaScript (Node.js) , 50 bytes
Experimente online!
Vendo que muitas pessoas começaram a responder a isso, eu também respondi.
Nota :
Isso é basicamente um roubo da resposta de @ kevinCruijssen em Java, encurtado graças ao fato de ser JS.
fonte
PHP, 30 bytes
Execute como pipe com `-nr 'ou tente online .
fonte
Z
que iria, em[
vez deAA
.VBA / VB6 / VBScript (não Excel), 73 bytes
A chamada
s(16383)
retornaráXFC
.fonte
i>675
-s(676)=A@@
(esperadosYZ
),s(677)=A@A
(esperaZA
)Javascript, 147 bytes
Eu tive um problema parecido. Este é o golfe da solução. As colunas do Excel são bijetivas base-26 .
Expandido, exceto usando índices 1:
fonte
Java, 57 bytes (recursivo)
Experimente online.
Explicação:
Java 10, 62 bytes (iterativo)
Experimente online.
Explicação:
fonte
Quarto (gforth) , 59 bytes
Experimente online!
Explicação
fonte
R , 65 bytes
Resposta recursiva, como muitas respostas anteriores.
Experimente online!
fonte
Powershell, 68 bytes
Versão recursiva alternativa, 68 bytes:
Script de teste:
Saída:
Nota: O PowerShell não fornece um
div
operador.fonte
Haskell, 48
Eu realmente pensei que seria capaz de vencer a outra entrada Haskell, mas infelizmente ...
Estou certo de que é possível raspar alguns caracteres disso, mas não codigo em Haskell há quase um ano, por isso estou bastante enferrujado.
Não é exatamente o que você chamaria de elegante.
fonte
string f(int n){return n<0?"":f(n/26-1)+(char)(n%26+65);}
57 caracteres, então eu quase me sentiria mal por postá-lo como resposta.Jq 1.5 , 71 bytes
Espera entrada
N
. por exemploExpandido:
Experimente online!
fonte
> <> , 29 bytes
Experimente online!
fonte
Ícone , 58 bytes
Experimente online!
fonte