Converta números em letras e vice-versa em uma string

12

Com base em uma lista de números e suas letras equivalentes, faça uma entrada de sequência, substitua os caracteres dessa sequência pelo número / letra equivalente e produza o resultado.

Lista

  • 1 = a
  • 2 = b
  • 3 = c
  • 4 = d
  • 5 = e
  • 6 = f
  • 7 = g
  • 8 = h
  • 9 = i
  • 0 = j

Entrada

thisisastring1124

Resultado

t89s9s1str9n7aabd

Regras

  • Os números são equivalentes apenas às letras minúsculas.
  • Qualquer caractere fora da lista será deixado como está.
  • A sequência de entrada não deve conter espaços.
  • É permitido o programa ou a função completa.
  • Como é código-golfe, o menor número de bytes vence.
Noir Antares
fonte
2
Bem-vindo ao PPCG. Bom desafio!
Adám 04/07/19
2
Em vez disso, podemos trocar letras maiúsculas?
Adám 04/07/19
Somente letras minúsculas e maiúsculas estariam fora do escopo da lista.
Noir Antares
A entrada conterá apenas letras e números ou outros caracteres não espaciais (por exemplo, pontuação) estarão nela?
sundar - Restabelece Monica
A sequência de entrada pode conter qualquer outro caractere, exceto espaços, mas qualquer coisa fora da lista permanecerá intocada na sequência de saída.
Noir Antares

Respostas:

14

bash, 18 bytes

tr 1-90a-j a-j1-90

Experimente online!

Maçaneta da porta
fonte
Como isso leva a entrada / saída? stdin e stdout?
Fund Monica's Lawsuit
@NicHartley Sim.
Doorknob
10

Python 3 , 76 68 bytes

lambda w:w.translate(dict(zip(s,s[::-1])))
s=b'1234567890jihgfedcba'

Experimente online!

ovs
fonte
6

05AB1E , 13 9 bytes

žmÁAT£J‡

Experimente online!

Explicação

žmÁ         # push 0987654321
   AT£      # push abcdefghij
      J     # join strings
       Â    # bifurcate
        ‡   # transliterate
Emigna
fonte
5

Retina 0.8.2 , 12 bytes

T`a-j09-1`Ro

Experimente online! Explicação:

T``

Realize uma transliteração.

a-j09-1

A lista de fontes são as letras e a-j, em seguida 0, os dígitos 9-1.

Ro

A lista de destino é a lista de origem invertida, ou seja, os dígitos 1-9e, em seguida 0, em seguida, as letras j-a.

Neil
fonte
3

Python 2 , 82 78 bytes

lambda i,l='1234567890jihgfedcba':''.join((x,l[~l.find(x)])[x in l]for x in i)

Experimente online!

-4 com agradecimentos a @ovs

ElPedro
fonte
3

JavaScript (ES6), 66 bytes

s=>s.replace(e=/[1a2b3c4d5e6f7g8h9i0j]/g,c=>e[e.search(c)^1],e+=e)

Experimente online!

Arnauld
fonte
3

R , 40 bytes

function(s)chartr("0-9ja-i","ja-i0-9",s)

Experimente online!

Surpreendentemente, R é decente nesse tipo de desafio de , porque tem uma trfunção semelhante à da resposta do Bash . Não faço ideia do porquê, mas sou grato por isso!

Giuseppe
fonte
Surpreendente! Não sabia que chartr () entendia regex.
Snoram
@snoram não é bem regex; especifica na documentação que "Intervalos são suportados nas especificações, mas classes de caracteres e caracteres repetidos não são".
Giuseppe
3

MS-SQL, 71 bytes

SELECT TRANSLATE(v,'1234567890abcdefghij','abcdefghij1234567890')FROM t

A nova função SQL 2017 TRANSLATErealiza a substituição de caracteres individuais, sendo ideal para esse propósito. Veja minha resposta semelhante em um desafio anterior .

A entrada é feita através de uma tabela preexistente t com a coluna varchar v , de acordo com nossas regras de IO . Para substituir apenas letras minúsculas, a tabela deve ser criada usando um agrupamento que diferencia maiúsculas de minúsculas :

CREATE TABLE t(v varchar(max) COLLATE Latin1_General_CS_AS)
BradC
fonte
2

Pitão , 13 bytes

Xz+jk+0_S9<GT

Experimente aqui!

Explicação

Xz+jk+0_S9<GT – Full program.
       _S9    – Yield [9, 8, 7, ..., 1]
     +0       – Prepend a 0.
   jk         – Join to a single string.
  +       <GT – And append the first 10 letters of the alphabet to it.
                Yields 0987654321abcdefghij.
Xz            – Transliterates the input from the above to the above reversed.
Mr. Xcoder
fonte
2

Haskell , 80 66 bytes

map(!"1a2b3c4d5e6f7g8h9i0j")
e!(a:b:y)|e==a=b|e==b=a|1<2=e!y
e!_=e

Experimente online!

ovs
fonte
1

REXX, 57 bytes

#=1234567890
a='abcdefghij'
say translate(arg(1),a #,# a)
idrougge
fonte
1

C (gcc) , 81 72 bytes

Obrigado a Giacomo Garabello pelas sugestões.

f(char*s){for(;*s++=*s-97U<11?(*s-6)%10+48:*s-48U<11?(*s-9)%10+97:*s;);}

Experimente online!

ErikF
fonte
Você pode remover 6 caracteres alterando a sequência de entrada em vez de imprimi-la putchar(...)-> *s=...e outras 4 substituindo *s-48U<11por *s<59 Experimente online!
Giacomo Garabello 5/07
@GiacomoGarabello *s<59quebra se caracteres como $estão na entrada, e foi por isso que eu fiz *s-48U([0..47] se torna [-48 ..- 1], que se torna um grande valor sem sinal.) Como a pergunta não especificou se não -alnums eram válidos, eu fui com a interpretação mais conservadora.
ErikF 05/07
Justo. O OP comentou recentemente que todos os outros caracteres são válidos, mas não o espaço. Mas você ainda pode usar a minha primeira sugestão
Giacomo Garabello
1

Powershell, 94 bytes

-join($args|% t*y|%{if(1+($p=($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_))){$s[$p-bxor1]}else{$_}})

Script de teste:

$f = {
-join($args|% t*y|%{if(1+($p=($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_))){$s[$p-bxor1]}else{$_}})
}

&$f "thisisastring1124"

Explicação

  • $args - cadeias de argumentos
  • $args|% t*y- expande para o |ForEach-Object -Method ToCharArrayequivalente a"$args".ToCharArray()
  • ($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_)- encontre um caractere na string, retorne uma posição ou -1 se não for encontrado. Vamos $ s armazena a string que contém um caractere emparelhado nas posições vizinhas que diferem no último bit: 0 + 1, 2 + 3, 4 + 5 ....
  • if(1+($p=...)) - se a posição foi encontrada
  • $p-bxor1 - posição bit xor 1
confuso
fonte
Bom truque com o -bxor1.
AdmBorkBork
0

R , 107 bytes

function(s){a=utf8ToInt(s);l=a>96&a<107;n=a>47&a<58;a[n]=(a[n]-9)%%10+97;a[l]=(a[l]+4)%%10+48;intToUtf8(a)}

Experimente online!

Primeira tentativa, definitivamente improvável ...

digEmAll
fonte
chartré seu amigo aqui, eu acho.
Giuseppe
1
@Giuseppe: awesome! Eu não sabia da função chartr. Por favor, postá-lo como a sua resposta, a abordagem é totalmente diferente;)
digEmAll
0

Ferrugem , 96 bytes

|x|x.bytes().map(|x|match
x{49..=57=>x+48,97..=105=>x-48,48=>106,106=>48,x=>x}as
char).collect()

Experimente online!

Não é seguro para Unicode, se fosse, seria ainda mais longo.

Konrad Borowski
fonte
0

K4 , 38 bytes

Solução:

{(,/|x,a)(,/a:0 1_'10 11#'.Q`a`n)?x}@'

Explicação:

Pesquise cada caractere na lista "abcdefghij1234567890"e depois indexe na lista "1234567890abcdefghijX"onde Xestá o caractere original.

Precisa encontrar uma maneira mais curta de construir as cordas ...

{(,/|x,a)(,/a:0 1_'10 11#'.Q`a`n)?x}@'
{                                  }@' / apply (@) lambda {} to each (')
                                 ?x    / lookup x in
         (                      )      / do this together
                          .Q`a`n       / index into .Q with a (gives a-z) and n (gives 0-9)
                   10 11#'             / take 10 from first list and 11 from second list
              0 1_'                    / drop 0 from first list and 1 from second list
            a:                         / save as a
          ,/                           / flatten
 (      )                              / do this together
     x,a                               / prepend x to a
    |                                  / reverse it
  ,/                                   / flatten

Bônus:

Outra solução para 38 bytes :

{(a,b,x)?[(b:1_11#.Q.n),a:10#.Q.a]x}@'
rua
fonte
0

Yabasic , 135 bytes

Recebe entrada do console e sai para o console.

Input""s$
For i=1To Len(s$)
c$=Mid$(s$,i,1)
n=asc(c$)-96
If-38>n Then?chr$(143+n+11^(n=-48));ElsIf n<11Then?n*(10>n),"";Else?c$;Fi
Next

Experimente online!

Taylor Scott
fonte
0

sed, 44 bytes

y/1234567890abcdefghij/abcdefghij1234567890/

Um pouco chato, eu admito.

Teste:

$ echo 'thisisastring1124' | sed 'y/1234567890abcdefghij/abcdefghij1234567890/'
t89s9s1str9n7aabd
Kusalananda
fonte