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.

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:







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.





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!


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)


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.


1

REXX, 57 Bytes

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

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!


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

Netter Trick mit dem -bxor1.
AdmBorkBork



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}@'

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!



0

sed, 44 bytes

y/1234567890abcdefghij/abcdefghij1234567890/

Ein bisschen langweilig, gebe ich zu.

Testen:

$ echo 'thisisastring1124' | sed 'y/1234567890abcdefghij/abcdefghij1234567890/'
t89s9s1str9n7aabd
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.