Converti i numeri in lettere e viceversa in una stringa


12

Sulla base di un elenco di numeri e delle loro lettere equivalenti, accetta un input di stringa, sostituisci i caratteri di quella stringa con il numero / lettera equivalente e genera il risultato.

Elenco

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

Ingresso

thisisastring1124

Produzione

t89s9s1str9n7aabd

Regole

  • I numeri equivalgono solo alle lettere minuscole.
  • Qualsiasi carattere esterno all'elenco verrà lasciato così com'è.
  • La stringa di input non deve contenere spazi.
  • È consentito il programma completo o la funzione.
  • Dato che si tratta di code-golf, vince il minor numero di byte.

2
Benvenuti in PPCG. Bella sfida!
Adám,

2
Possiamo invece scambiare lettere maiuscole?
Adám,

Solo le lettere minuscole, le lettere maiuscole sarebbero al di fuori dell'ambito dell'elenco.
Noir Antares,

L'input conterrà solo lettere e numeri o potrebbero essere presenti altri caratteri non spaziali (es. Punteggiatura)?
Sundar - Ripristina Monica il

La stringa di input può contenere qualsiasi altro carattere tranne gli spazi, ma qualsiasi cosa al di fuori dell'elenco rimarrà intatta nella stringa di output.
Noir Antares,

Risposte:





6

05AB1E , 13 9 byte

žmÁAT£J‡

Provalo online!

Spiegazione

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


5

Retina 0.8.2 , 12 byte

T`a-j09-1`Ro

Provalo online! Spiegazione:

T``

Esegui una traslitterazione.

a-j09-1

La lista delle sorgenti sono le lettere a-j, poi 0, poi le cifre 9-1.

Ro

La lista di destinazione è l'elenco di origine invertita, cioè le cifre 1-9, poi 0, poi le lettere j-a.





3

R , 40 byte

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

Provalo online!

Sorprendentemente, R è decente in questo tipo di sfida con le , perché ha una trfunzione simile alla risposta di Bash . Non ho idea del perché esista, ma te ne sono grato!


Sorprendente! Non sapevo che chartr () avesse capito regex.
Snoram

@snoram non abbastanza regex; specifica nella documentazione che "Gli intervalli sono supportati nelle specifiche, ma non le classi di caratteri e i caratteri ripetuti".
Giuseppe,

3

MS-SQL, 71 byte

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

La nuova funzione SQL 2017 TRANSLATEesegue la sostituzione di singoli caratteri, quindi è ideale per questo scopo. Vedi la mia risposta simile in una sfida precedente .

L'input avviene tramite una tabella preesistente t con la colonna varchar v , secondo le nostre regole IO . Per sostituire solo lettere minuscole, la tabella deve essere creata utilizzando una fascicolazione sensibile al maiuscolo / minuscolo :

CREATE TABLE t(v varchar(max) COLLATE Latin1_General_CS_AS)


2

Pyth , 13 byte

Xz+jk+0_S9<GT

Provalo qui!

Spiegazione

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.


1

REXX, 57 byte

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

1

C (gcc) , 81 72 byte

Grazie a Giacomo Garabello per i suggerimenti.

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

Provalo online!


Puoi rimuovere 6 caratteri modificando la stringa di input invece di stamparla putchar(...)-> *s=...e altri 4 sostituendoli *s-48U<11con *s<59 Provalo online!
Giacomo Garabello,

@GiacomoGarabello si *s<59interrompe se nell'input $sono presenti caratteri simili , motivo per cui l'ho fatto *s-48U([0..47] diventa [-48 ..- 1], che diventa un grande valore non firmato.) Poiché la domanda non specificava se non -alluminio erano validi, sono andato con l'interpretazione più conservatrice.
ErikF,

Giusto. L'OP ha recentemente commentato che ogni altro personaggio è valido ma non lo spazio. Ma puoi ancora usare il mio primo suggerimento
Giacomo Garabello,

1

Powershell, 94 byte

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

Script di prova:

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

&$f "thisisastring1124"

Spiegazione

  • $args - stringhe di argomenti
  • $args|% t*y- si espande in |ForEach-Object -Method ToCharArrayequivalente di"$args".ToCharArray()
  • ($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_)- trova un carattere nella stringa, restituisce una posizione o -1 se non trovato. $ S memorizza la stringa che contiene un carattere associato su posizioni vicine che differiscono per l'ultimo bit: 0 + 1, 2 + 3, 4 + 5 ....
  • if(1+($p=...)) - se la posizione è stata trovata
  • $p-bxor1 - posizione bit xo 1

Bel trucco con il -bxor1.
AdmBorkBork,



0

K4 , 38 byte

Soluzione:

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

Spiegazione:

Cerca ogni carattere nell'elenco "abcdefghij1234567890"e quindi indicizza l'elenco "1234567890abcdefghijX"dove si Xtrova il carattere originale.

È necessario trovare un modo più breve per costruire le stringhe ...

{(,/|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

Bonus:

Un'altra soluzione per 38 byte :

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

0

Yabasic , 135 byte

Riceve input dalla console e output alla 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

Provalo online!



0

sed, 44 byte

y/1234567890abcdefghij/abcdefghij1234567890/

Un po 'noioso, lo ammetto.

test:

$ echo 'thisisastring1124' | sed 'y/1234567890abcdefghij/abcdefghij1234567890/'
t89s9s1str9n7aabd
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.