Gere o nome da coluna do Excel a partir do índice
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:
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.
Você tem certeza de que 16383 deve ser XFD? O que você ganha com 676 e 702?
Bem, é isso que o Excel mostra, e eu achei na web que ele tem 16384 colunas. Vou testá-lo amanhã com nosso código (conhecido por funcionar) (está tarde da noite no momento em que moro).
Além disso, o teste com o próprio Excel revela que 676 = ZA e 702 = AAA.
A razão que eu peço é que eu escrevi algum código simples base-26, obtive resultados que se ajustam a sua precisão, mas quebrou em 676 e 702.
Sim. Não é a Base-26. Esse é o problema. ;)
Perl 6 ,16 14 bytes
Funciona mesmo além do XFD. Graças às listas infinitas no Perl 6, isso não leva uma eternidade (e meia) para ser executado.
Fórmula do Excel :), 36 caracteres
Arghh! Eu realmente pensei em proibir isso, mas esqueci de mencionar no post! : D Ainda assim, as fórmulas do Excel não são uma linguagem de programação (e sim, o Excel VBA também está fora dos limites). : P
@ Vilx- Graças a Deus alguém veio com uma solução mais curta. Não quero entrar na história, sendo a única pessoa que venceu um concurso de golfe usando as fórmulas do Excel :)
Eu ainda posso aceitar sua resposta. >: D
Você pode eliminar 2 bytes substituindo "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 que strict subsesteja no escopo, as palavras de barra Ae XFDsã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. )
Como é a resposta mais curta até agora, acho que merece ser marcada como "aceita" até que uma solução mais curta seja encontrada (provavelmente disponível apenas no JonSkeetScript): P Ironic.
Como a pergunta é vaga sobre como as entradas e saídas são feitas, isso permite encurtar isso consideravelmente. Por exemplo, se a entrada está dentro $_e a saída é o valor da expressão, (A..XFD)[$_]resolve o desafio com apenas 12 caracteres .
Desculpe como isso deve ser executado? Com o perl 5.18, ele não imprime nada quando apresentado como argumento para -E.
@ EdAvis: Está esperando você digitar um número. Ou você pode colocar o número em um arquivo e fazer perl -E 'say[A..XFD]->[<>]' < number.txt. Ou, nos shells que o suportam, basta fornecer a entrada na linha de comando com perl -E 'say[A..XFD]->[<>]' <<< 123.
Eu acho que isso pode ser otimizado parasay+(A..XFD)[<>]
C, 53 caracteres
É como jogar golfe com um martelo ...
O sequencecombinador de Haskell pega uma lista de ações e as executa, retornando o resultado de cada ação em uma lista. Por exemplo:
No Haskell, as ações são tratadas como valores e coladas usando o >>=(bind) e o returnprimitivo. 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 sequencecom listas. O acima pode ser expresso como:
Assim, sequencenos dá combinações de graça!
Assim, para construir a lista:
Eu só preciso criar listas para passar para sequence
Em seguida, use concatMappara aplicar sequence- 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.
Perl, 26 caracteres
Ruby, 35 caracteres
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.
você pode remover 2 parênteses puxando +chr(65+i%26)para dentro e testando para i>=0, poupando-lhe um caráter :)
Você também pode raspar 4 caracteres off usando f=lambda i:, em vez dedef f(i):return
na verdade, isso não funciona bem para os números 37 e acima. Eu tive que atualizar este código um pouco:f = lambda i: i >= 0 and f(math.floor(i / 26 - 1)) + chr(int(round(65 + i % 26))) or ''
— user007 11/11
Scala, 62 caracteres
Você pode tentar isso no Simply scala . Copie e cole a função e use f(some integer)para ver o resultado.
Você não precisa ""+do elsecaso.
Função de janela imediata VBE anônima que recebe entrada da célula [A1]e sai para a janela imediata VBE
JavaScript (Node.js) , 50 bytes
Vendo que muitas pessoas começaram a responder a isso, eu também respondi.
Isso é basicamente um roubo da resposta de @ kevinCruijssen em Java, encurtado graças ao fato de ser JS.
Execute como pipe com `-nr 'ou tente online .
Tenho certeza de que isso não faz o que é necessário. Depois Zque iria, em [vez de AA.
@ Vilx- Tomo isso como prova de que você não conhece muito PHP. Eu adicionei um TiO; Veja por si mesmo.
Santo ... você está certo! Eu sei muito bem o PHP, mas é tão cheio de coisas estranhas que é impossível saber tudo. Essa singularidade em particular me excitou. Aqui, tenha um voto positivo e minhas desculpas!
VBA / VB6 / VBScript (não Excel), 73 bytes
A chamada s(16383)retornará XFC.
Bem-vindo ao PPCG! Você pode adicionar uma explicação para usuários não familiarizados com o VB?
— AdmBorkBork 17/10
@AdmBorkBork Não há muito a acrescentar às respostas anteriores, apenas a ligação do idioma!
Este parece falhar em todos os casos em que i>675 - s(676)=A@@(esperados YZ), s(677)=A@A(espera ZA)
@TaylorScott Você está certo. Trabalhando nisso ...
@TaylorScott corrigido, +6 bytes ... Obrigado.
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:
Você pode adicionar um link TIO. Fora isso, uma ótima primeira resposta. Bem-vindo também ao PPCG.
Também responder a uma pergunta feita há 7 anos não é realmente uma ótima idéia.
Ok, NVM isso é errado em tantos níveis como é que eu já não vejo isso
Eu queria fazer essa pergunta, mas era uma duplicata. Não tenho certeza do que você está recebendo no @MuhammadSalman
Entrarei em contato em breve. Seja bem-vindo ao PPCG. boa resposta. Observe que, ao escrever uma resposta, você deve fornecer um programa ou uma função completa
Java, 57 bytes (recursivo)
Java 10, 62 bytes (iterativo)
Oi. Desculpe, mas roubei seu código: Aqui . :)
@MuhammadSalman Hehe, não há problema. Na verdade, eu recebi o meu da resposta Scala . ;)
Quarto (gforth) , 59 bytes
Resposta recursiva, como muitas respostas anteriores.
Versão recursiva alternativa, 68 bytes:
Nota: O PowerShell não fornece um divoperador.
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.
Não é ruim! :) Mas Ha - depois de mais de 3 anos, ainda não há solução C #. : D
Haha, de fato. Mas uma solução C # é trivial para escrever usando esse mesmo método. 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.