Konvertieren Sie Zahlen in Buchstaben und umgekehrt in eine Zeichenfolge

12

Nehmen Sie auf der Grundlage einer Liste von Zahlen und ihren entsprechenden Buchstaben eine Zeichenfolge-Eingabe vor, ersetzen Sie die Zeichen dieser Zeichenfolge durch die entsprechende Zahl / den entsprechenden Buchstaben und geben Sie das Ergebnis aus.

Aufführen

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

Eingang

thisisastring1124

Ausgabe

t89s9s1str9n7aabd

Regeln

  • Zahlen entsprechen nur Kleinbuchstaben.
  • Alle Zeichen außerhalb der Liste bleiben unverändert.
  • Eingabezeichenfolge darf keine Leerzeichen enthalten.
  • Es ist entweder ein vollständiges Programm oder eine vollständige Funktion zulässig.
  • Da es sich um Code-Golf handelt, gewinnen die wenigsten Bytes.
Noir Antares
quelle
2
Willkommen bei PPCG. Schöne Herausforderung!
Adám
2
Dürfen wir stattdessen Großbuchstaben tauschen?
Adám
Nur Kleinbuchstaben, Großbuchstaben würden außerhalb des Bereichs der Liste liegen.
Noir Antares
Enthält die Eingabe nur Buchstaben und Zahlen oder sind möglicherweise andere nicht-Leerzeichen (z. B. Interpunktion) enthalten?
Sundar - Reinstate Monica
Die Eingabezeichenfolge kann jedes andere Zeichen außer Leerzeichen enthalten. Alle Zeichen außerhalb der Liste bleiben jedoch in der Ausgabezeichenfolge unberührt.
Noir Antares

Antworten:

14

Bash, 18 Bytes

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

Probieren Sie es online!

Türknauf
quelle
Wie nimmt das Input / Output auf? stdin und stdout?
Fund Monica Klage
@ NicHartley Ja.
Türklinke
6

05AB1E , 13 9 Bytes

žmÁAT£J‡

Probieren Sie es online!

Erläuterung

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

Retina 0.8.2 , 12 Bytes

T`a-j09-1`Ro

Probieren Sie es online! Erläuterung:

T``

Führen Sie eine Transliteration durch.

a-j09-1

Die Quellenliste ist die Buchstaben a-j, dann 0, dann die Ziffern 9-1.

Ro

Die Zielliste ist die Ursprungsliste umgekehrt, die Ziffern , dh 1-9, dann 0, dann die Buchstaben j-a.

Neil
quelle
3

Python 2 , 82 bis 78 Bytes

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

Probieren Sie es online!

-4 mit Dank an @ovs

ElPedro
quelle
3

R , 40 Bytes

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

Probieren Sie es online!

Überraschenderweise ist R bei dieser Art von Herausforderung anständig , da es eine trähnliche Funktion wie in der Bash-Antwort hat . Keine Ahnung warum es existiert, aber ich bin dankbar dafür!

Giuseppe
quelle
Tolle! Wusste nicht, dass chartr () Regex versteht.
Snoram
@ Snoram nicht ganz Regex; es gibt in der Dokumentation an , dass „Bereiche in den Spezifikationen unterstützt werden, sondern Charakterklassen und wiederholte Zeichen sind es nicht.“
Giuseppe
3

MS-SQL, 71 Bytes

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

Die neue SQL 2017-Funktion TRANSLATEführt die Ersetzung einzelner Zeichen durch und ist daher ideal für diesen Zweck geeignet. Siehe meine ähnliche Antwort in einer vorherigen Herausforderung .

Die Eingabe erfolgt über eine bereits vorhandene Tabelle t mit der Spalte varchar v , je unseren IO Regeln . Um nur Kleinbuchstaben zu ersetzen, muss die Tabelle mit einer Sortierung erstellt werden, bei der zwischen Groß- und Kleinschreibung unterschieden wird :

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

Pyth , 13 Bytes

Xz+jk+0_S9<GT

Probieren Sie es hier aus!

Erläuterung

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
quelle
1

REXX, 57 Bytes

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

C (gcc) , 81 bis 72 Bytes

Vielen Dank an Giacomo Garabello für die Vorschläge.

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

Probieren Sie es online!

ErikF
quelle
Sie können 6 Zeichen entfernen , indem Sie die Eingabezeichenfolge zu verändern , anstatt sie drucken putchar(...)-> *s=...und andere 4 durch Austausch *s-48U<11mit *s<59 Online ausprobieren!
Giacomo Garabello
@GiacomoGarabello *s<59bricht ab, wenn Zeichen wie $in der Eingabe sind, weshalb ich dies tat *s-48U([0..47] wird zu [-48 ..- 1], was zu einem großen vorzeichenlosen Wert wird.) Da die Frage nicht angab, ob nicht -Alben galten, ich ging mit der eher konservativen Interpretation um.
ErikF
Meinetwegen. Das OP hat kürzlich kommentiert, dass jedes andere Zeichen gültig ist, jedoch nicht das Leerzeichen. Aber Sie können immer noch meinen ersten Vorschlag verwenden
Giacomo Garabello
1

Powershell, 94 Bytes

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

Testskript:

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

&$f "thisisastring1124"

Erläuterung

  • $args - Argumentstrings
  • $args|% t*y- erweitert auf |ForEach-Object -Method ToCharArrayÄquivalent von"$args".ToCharArray()
  • ($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_)- Findet ein Zeichen in der Zeichenkette, gibt eine Position zurück oder -1, wenn es nicht gefunden wird. $ S speichert den String, der ein gepaartes Zeichen enthält, an Nachbarpositionen, die sich um das letzte Bit unterscheiden: 0 + 1, 2 + 3, 4 + 5 ....
  • if(1+($p=...)) - wenn Position gefunden wurde
  • $p-bxor1 - Bit x positionieren oder 1
mazzy
quelle
Netter Trick mit dem -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)}

Probieren Sie es online!

Erster Versuch, definitiv verbesserungsfähig ...

digEmAll
quelle
chartrIst dein Freund hier, denke ich.
Giuseppe
1
@ Giuseppe: super! Ich wusste nichts über die Chartr-Funktion. Bitte
poste
0

Rust , 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()

Probieren Sie es online!

Nicht Unicode-sicher, wenn es noch länger wäre.

Konrad Borowski
quelle
0

K4 , 38 Bytes

Lösung:

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

Erläuterung:

Suchen Sie jedes Zeichen in der Liste "abcdefghij1234567890"und indexieren Sie dann in der Liste "1234567890abcdefghijX"woX sich das ursprüngliche Zeichen befindet.

Benötigen Sie einen kürzeren Weg, um die Saiten zu bauen ...

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

Eine andere Lösung für 38 Bytes :

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

Yabasic , 135 Bytes

Nimmt Eingaben von der Konsole und Ausgaben an die Konsole.

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

Probieren Sie es online!

Taylor Scott
quelle
0

sed, 44 bytes

y/1234567890abcdefghij/abcdefghij1234567890/

Ein bisschen langweilig, gebe ich zu.

Testen:

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