Substituir números pela respectiva letra

23

Crie uma função ou programa que aceite um número como entrada e emita uma sequência em que os pontos do código ASCII para o alfabeto maiúsculo e minúsculo são substituídos por seus equivalentes de caracteres.

  • O alfabeto maiúsculo usa os pontos de código: 65-90
  • O alfabeto em minúsculas usa os pontos de código: 97-122

Se algum dígito adjacente na entrada for igual ao ponto de código de uma letra, essa letra substituirá os dígitos na string de saída.

Regras:

  • A entrada será um número inteiro positivo com entre 1 e 99 dígitos
  • Você pode assumir que apenas uma entrada válida é fornecida
  • Você começa a substituir no início do número inteiro ( 976-> a6, não 9L)
  • A entrada pode estar em qualquer formato adequado (a representação de sequência é OK)
  • A saída pode estar em qualquer formato adequado
  • Aplicam-se regras padrão

Exemplos:

1234567
12345C

3456789
345CY

9865432
bA432

6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ

6711110010100071111108102
Code000Golf

O código mais curto em bytes ganha!


Entre os melhores

O snippet de pilha na parte inferior desta postagem gera o catálogo a partir das respostas a) como uma lista da solução mais curta por idioma eb) como uma tabela geral de líderes.

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

## Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Stewie Griffin
fonte
2
"A entrada será um número inteiro positivo com entre 1 e 99 dígitos" Em praticamente qualquer linguagem de programação que eu conheça, será uma string com entre 1 e 99 dígitos, já que mesmo um int de 64 bits comporta até 19 decimais digits ...
TJ Crowder
3
@TJCrowder Suponho que ele quis dizer inteiro no sentido matemático, não no tipo de dados.
Dennis
1
@TJCrowder ponto válido :-) Embora, se não me engano, 1e99 ainda é tecnicamente um número inteiro. long intnão é suficiente, você precisa super long int.
Stewie Griffin
1
@StewieGriffin: Hah! :-) Tenho certeza de que existe uma linguagem em algum lugar com essa coisa.
TJ Crowder

Respostas:

2

Jolf, 18 16 bytes

Experimente aqui! Eu sabia que a função upperLower seria útil algum dia! Substitua ópor ΢ou use apenas o link do intérprete. Isso está codificado na ISO 8859-7.

ρiLaΜGpwpuEdóH΅A
      pw           upper and lower
        pu         of the uppercase alphabet
     G    E        split by nothing (E = "")
    Μ      dóH     map each char to its numeric counterpart
  La               regex alternate array (e.g. La[1,2,3] => "1|2|3")
ρi            ΅A   replace input with the character code of the match (΅ is string lambda)
Conor O'Brien
fonte
17

Perl, 39 38 bytes

(1 byte adicionado para o -psinalizador.)

$"="|";s/@{[65..90,97..122]}/chr$&/ge
s/                           /          replace...
  @{[                      ]}           this string, treated as a regex:
     join"|",65..90,97..122             65|66|67|68|...|121|122
                                   /ge  ...with this string, eval()'d:
                                 $&     the entirety of the last match
                              chr       convert to char from ASCII code

Ferramenta certa para o trabalho ™.

A explicação está desatualizada após uma pequena otimização (graças a dev-null !) Que torna um único byte mais curto (mas um pouco menos elegante): a $"variável representa o que fazer joinao interpolar uma matriz em uma string, portanto, a configuração $"="|"elimina a necessidade de join.

Demo:

llama@llama:~$ perl -pe '$"="|";s/@{[65..90,97..122]}/chr$&/ge' 
1234567
12345C
3456789 
345CY
9865432
bA432
6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ
6711110010100071111108102
Code000Golf
Maçaneta da porta
fonte
Eu acho que você pode salvar um único byte, definindo em $"="|"vez de ingressar?
22716 Andlrc
por exemplo. $"="|";s/@{[65..90,97..122]}/chr$&/ge
andlrc
@ dev-null Isso funciona, obrigado!
Maçaneta
11

Javascript, 80 bytes

s=>s.replace(/6[5-9]|[78]\d|9[0789]|1[01]\d|12[012]/g,x=>String.fromCharCode(x))

Veja regex em ação aqui: https://regex101.com/r/iX8bJ2/1

Só por curiosidade, uma coisa que aprendi aqui:

Eu não posso mudar x=>String.fromCharCode(x)a String.fromCharCode porque ...

removido
fonte
6

CJam, 22 bytes

q{+'[,_el^{_is@\/*}/}*

Experimente online!

fundo

Simplesmente substituir todas as ocorrências de grupos de dígitos pelas letras correspondentes (em qualquer ordem que possamos escolher) não cumprirá a regra da esquerda para a direita.

Em vez disso, podemos gerar todos os prefixos da string de entrada e tentar fazer todas as substituições possíveis enquanto as estivermos gerando. Como nenhum ponto de código está contido em outro ponto de código, a ordem dessas tentativas não é importante.

Por exemplo:

67466

6     -> 6
67    -> C
 C4   -> C4
 C46  -> C46
 C467 -> C4B

C4B

Como funciona

q                       Read all input from STDIN.
 {                  }*  Fold; push the first character, and for each subsequent
                        character, push it and do the following:
  +                       Append the character to the string on the stack.
   '[,_el^                Push the string of all ASCII letters.
                          See: http://codegolf.stackexchange.com/a/54348
          {       }/      For each ASCII letter:
           _                Push a copy of the letter.
            i               Convert to integer, i.e., compute its code point.
             s              Cast to string.
              @\            Rotate and swap.
                /           Split the modified input characters at occurrences (at
                            most one) of the string repr. of the code point.
                 *          Join, separating by the corresponding letter.
Dennis
fonte
4

PHP, 110 102 101 68 67 bytes

Desafio bastante difícil. Este é o melhor que eu poderia inventar. Esta é uma versão completamente nova.

for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);

Execute assim:

php -r 'for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);' 6711110010100071111108102;echo
> Code000Golf
  • 8 bytes salvos usando ctype_alpha vez de preg_match, thx para manatwork
  • Guardou 1 byte ao anexar 0 a string em vez de verificar uma string não vazia: quando o último caractere da entrada é 0, a substring que eu estou usando seria "0", que é falso, enquanto "00" é verdadeiro, para que não pule a impressão do último 0.
  • Salva 33 bytes maciços usando strtr depois de criar uma matriz com pares de conversão
  • Salvou um byte usando uma marca de impressão curta
aross
fonte
1
Você precisará alterar a expressão regular para, #[A-Z]#ipois a atual permitirá que "92" seja transformado em "\". Ou tente em ctype_alpha()vez de preg_match(). Até agora parece funcionar.
11386 manatwork
"0", which is falsy, whereas "00" is truthyBem, PHP.
cat
3

Python 3, 211 189 188 bytes

def f(c,i=0,n=""):
 while i<len(c):a=1;x=int(c[i:i+2]);a=2 if 64<x<91 or 96<x<100 else a;x=int(c[i:i+3]) if a<2 else x;a=3 if 99<x<123 else a;x=chr(x) if a>1 else c[i];n+=x;i+=a
 return n
  • Economizou 23 bytes substituindo \ n por; graças a Dennis

Teste

insira a descrição da imagem aqui

Argenis García
fonte
1
Se você usar em ;vez de quebras de linha, poderá colocar o loop while inteiro em uma única linha. Além disso, a primeira linha pode se tornar def f(c,i=0,n=""):.
Dennis
1
a=1;a=2 if 64<x<91 or 96<x<100 else a-> a=1+(64<x<91or 96<x<100)etc
ver
2

Pitão, 20 18 bytes

.Uu:G`CHHsrBG1+bZz

O mesmo algoritmo que o @Dennis. É muito mais fácil codificar em Pyth no meu telefone do que em Jelly.

                implicit: z=input
.U              Reduce the following lambda b, Z over z
                b is the string being built; z is the next char
   u                Reduce the following lambda G,H over +bZ
                    G is the string, H is the next letter to match
     :                  Replace
       G                in G
       ` C H            the char code of H
       H                with H
     s rB            where H takes on values:
          G              the lowercase alphabet (that's the global value of G)
          1              concatenated to its uppercased self.
     +          
       b
       Z
   z

Obrigado @isaacg

Experimente aqui .

lirtosiast
fonte
Você simplesmente não pode ficar de fora deste site no seu telefone, pode ...?
Conor O'Brien
1
Especialmente quando eu tenho o luxo de codificação em tudo ASCII imprimíveis: D
lirtosiast
1
Isso é verdade, provavelmente bom fazer uma pausa de toda essa geléia ... Você sabe, uma dieta equilibrada;)
Conor O'Brien
0

05AB1E , 12 bytes

õsvy«žnvyÇy:

Experimente online ou verifique todos os casos de teste .

Explicação:

õ             # Push an empty string ""
 sv           # Swap to get the (implicit) input-string, and loop over its characters:
   y«         #  Append the current character to the string
     žn       #  Push builtin "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
       v      #  Inner loop over each of these letters:
           :  #   Replace in the string all occurrences (should be either 0 or 1 occurrence)
        yÇ    #   of the ordinal value of the current letter
          y   #   by this letter
              # (after the loops, implicitly output the top of the stack as result)

Alternativa de 12 bytes usando redução por:

Å»«žnvyÇy:]θ

Experimente online ou verifique todos os casos de teste ou veja uma redução passo a passo com apenas os 10 primeiros bytes .

Kevin Cruijssen
fonte