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.