Ersetzen Sie die Zahlen durch die entsprechenden Buchstaben

23

Erstellen Sie eine Funktion oder ein Programm, das eine Zahl als Eingabe verwendet und eine Zeichenfolge ausgibt, bei der ASCII-Code-Punkte für das Klein- und Großbuchstaben durch ihre Zeichenäquivalente ersetzt werden.

  • Im Großbuchstaben werden die Codepunkte verwendet: 65-90
  • Das Kleinbuchstaben verwendet die Codepunkte: 97-122

Wenn benachbarte Ziffern in der Eingabe dem Codepunkt eines Buchstabens entsprechen, ersetzt dieser Buchstabe die Ziffern in der Ausgabezeichenfolge.

Regeln:

  • Die Eingabe ist eine positive Ganzzahl mit 1 bis 99 Stellen
  • Sie können davon ausgehen, dass nur gültige Eingaben vorliegen
  • Sie beginnen mit dem Ersetzen am Anfang der Ganzzahl ( 976-> a6, nicht 9L)
  • Die Eingabe kann in jedem geeigneten Format erfolgen (Zeichenfolgendarstellung ist OK)
  • Die Ausgabe kann in jedem geeigneten Format erfolgen
  • Es gelten Standardregeln

Beispiele:

1234567
12345C

3456789
345CY

9865432
bA432

6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ

6711110010100071111108102
Code000Golf

Kürzester Code in Bytes gewinnen!


Bestenliste

Das Stapel-Snippet am Ende dieses Beitrags generiert den Katalog aus den Antworten a) als Liste der kürzesten Lösungen pro Sprache und b) als Gesamt-Bestenliste.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

## Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Stewie Griffin
quelle
2
"Die Eingabe wird eine positive Ganzzahl mit 1 bis 99 Stellen sein." In fast jeder mir bekannten Programmiersprache wird es eine Zeichenfolge mit 1 bis 99 Stellen sein, da sogar eine 64-Bit-Ganzzahl nur bis zu 19 Dezimalstellen enthält Ziffern ...
TJ Crowder
3
@TJCrowder Ich nehme an, er meinte eine Ganzzahl im mathematischen Sinne, nicht den Datentyp.
Dennis
1
@TJCrowder gültiger Punkt :-) Obwohl, wenn ich mich nicht irre, ist 1e99 technisch gesehen immer noch eine ganze Zahl. long intist nicht genug, du brauchst super long int.
Stewie Griffin
1
@ StewieGriffin: Hah! :-) Ich bin mir sicher, dass es irgendwo eine Sprache mit so etwas gibt.
TJ Crowder

Antworten:

2

Jolf, 18 16 Bytes

Probieren Sie es hier aus! Ich wusste, dass die UpperLower-Funktion eines Tages nützlich sein würde! Ersetzen Sie ódurch ΢oder verwenden Sie einfach den Interpreter-Link. Dies ist in ISO 8859-7 kodiert.

ρiLaΜGpwpuEdóH΅A
      pw           upper and lower
        pu         of the uppercase alphabet
     G    E        split by nothing (E = "")
    Μ      dóH     map each char to its numeric counterpart
  La               regex alternate array (e.g. La[1,2,3] => "1|2|3")
ρi            ΅A   replace input with the character code of the match (΅ is string lambda)
Conor O'Brien
quelle
17

Perl, 39 38 Bytes

(1 Byte für das -pFlag hinzugefügt .)

$"="|";s/@{[65..90,97..122]}/chr$&/ge
s/                           /          replace...
  @{[                      ]}           this string, treated as a regex:
     join"|",65..90,97..122             65|66|67|68|...|121|122
                                   /ge  ...with this string, eval()'d:
                                 $&     the entirety of the last match
                              chr       convert to char from ASCII code

Richtiges Werkzeug für den Job ™.

Die Erklärung wird nach einer kleinen Optimierung veraltet (dank dev-null , dass es ein einziges Byte kürzer (aber etwas weniger elegant) macht!): Die $"Variable darstellt , was joinauf , wenn eine arrray in einen String interpoliert, so Einstellung $"="|"entfällt die Notwendigkeit für join.

Demo:

llama@llama:~$ perl -pe '$"="|";s/@{[65..90,97..122]}/chr$&/ge' 
1234567
12345C
3456789 
345CY
9865432
bA432
6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ
6711110010100071111108102
Code000Golf
Türknauf
quelle
Ich vermute, Sie können ein einzelnes Byte speichern, indem Sie festlegen, $"="|"anstatt beizutreten?
andlrc
z.B. $"="|";s/@{[65..90,97..122]}/chr$&/ge
andlrc
@ dev-null Das funktioniert, danke!
Türklinke
11

Javascript, 80 Bytes

s=>s.replace(/6[5-9]|[78]\d|9[0789]|1[01]\d|12[012]/g,x=>String.fromCharCode(x))

Sehen Sie regex hier in Aktion: https://regex101.com/r/iX8bJ2/1

Nur aus Neugier habe ich hier eines gelernt:

Ich kann nicht ändern x=>String.fromCharCode(x), String.fromCharCode weil ...

entfernt
quelle
6

CJam, 22 Bytes

q{+'[,_el^{_is@\/*}/}*

Probieren Sie es online!

Hintergrund

Das einfache Ersetzen aller Vorkommen von Zifferngruppen durch die entsprechenden Buchstaben (in beliebiger Reihenfolge) entspricht nicht der Links-Rechts-Regel.

Stattdessen können wir alle Präfixe der Eingabezeichenfolge generieren und versuchen, alle möglichen Ersetzungen vorzunehmen, während wir sie generieren. Da kein Codepunkt in einem anderen Codepunkt enthalten ist, ist die Reihenfolge dieser Versuche nicht wichtig.

Beispielsweise:

67466

6     -> 6
67    -> C
 C4   -> C4
 C46  -> C46
 C467 -> C4B

C4B

Wie es funktioniert

q                       Read all input from STDIN.
 {                  }*  Fold; push the first character, and for each subsequent
                        character, push it and do the following:
  +                       Append the character to the string on the stack.
   '[,_el^                Push the string of all ASCII letters.
                          See: http://codegolf.stackexchange.com/a/54348
          {       }/      For each ASCII letter:
           _                Push a copy of the letter.
            i               Convert to integer, i.e., compute its code point.
             s              Cast to string.
              @\            Rotate and swap.
                /           Split the modified input characters at occurrences (at
                            most one) of the string repr. of the code point.
                 *          Join, separating by the corresponding letter.
Dennis
quelle
4

PHP, 110 102 101 68 67 Bytes

Ziemlich schwere Herausforderung. Das ist das Beste, was ich mir einfallen lassen konnte. Dies ist eine völlig neue Version.

for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);

Laufen Sie wie folgt:

php -r 'for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);' 6711110010100071111108102;echo
> Code000Golf
  • 8 Bytes gespart, indem man ctype_alphaanstelle von preg_match, thx verwendet, um zu manatworken
  • 1 Byte durch Voranstellen 0der Zeichenfolge gespeichert , anstatt eine nicht leere Zeichenfolge zu überprüfen: Wenn das letzte Zeichen der Eingabe eine 0 ist, ist die Teilzeichenfolge, die ich nehme, "0", was falsch ist, während "00" wahr ist. Damit wird das Drucken der letzten 0 nicht übersprungen.
  • Durch die Verwendung strtreines Arrays mit Konvertierungspaaren wurden massive 33 Bytes gespart
  • Ein Byte wurde mit einem kurzen Drucktag gespeichert
aross
quelle
1
Sie müssen den regulären Ausdruck in ändern, #[A-Z]#ida der aktuelle froh ist, dass "92" in "\" umgewandelt wird. Oder versuchen Sie es ctype_alpha()statt preg_match(). Soweit scheint das zu funktionieren.
Manatwork
"0", which is falsy, whereas "00" is truthyGut gemacht, PHP.
Katze
3

Python 3, 211 189 188 Bytes

def f(c,i=0,n=""):
 while i<len(c):a=1;x=int(c[i:i+2]);a=2 if 64<x<91 or 96<x<100 else a;x=int(c[i:i+3]) if a<2 else x;a=3 if 99<x<123 else a;x=chr(x) if a>1 else c[i];n+=x;i+=a
 return n
  • 23 Byte durch Ersetzen von \ n durch; danke an Dennis

Prüfung

Bildbeschreibung hier eingeben

Argenis García
quelle
1
Wenn Sie ;anstelle von Zeilenumbrüchen verwenden, können Sie die gesamte while-Schleife in eine einzelne Zeile einfügen. Auch die erste Zeile kann werden def f(c,i=0,n=""):.
Dennis
1
a=1;a=2 if 64<x<91 or 96<x<100 else a-> a=1+(64<x<91or 96<x<100)etc
siehe auch
2

Pyth, 20 bis 18 Bytes

.Uu:G`CHHsrBG1+bZz

Gleicher Algorithmus wie @Dennis. Es ist viel einfacher, in Pyth auf meinem Handy zu programmieren als in Jelly.

                implicit: z=input
.U              Reduce the following lambda b, Z over z
                b is the string being built; z is the next char
   u                Reduce the following lambda G,H over +bZ
                    G is the string, H is the next letter to match
     :                  Replace
       G                in G
       ` C H            the char code of H
       H                with H
     s rB            where H takes on values:
          G              the lowercase alphabet (that's the global value of G)
          1              concatenated to its uppercased self.
     +          
       b
       Z
   z

Danke @isaacg

Probieren Sie es hier aus .

Lirtosiast
quelle
Sie können auf Ihrem Handy einfach nicht von dieser Website fernbleiben, oder ...?
Conor O'Brien
1
Vor allem , wenn ich den Luxus in allen druckbaren ASCII - Kodierung: D
lirtosiast
1
Das ist wahr, wahrscheinlich schön, um eine Pause von all dem Gelee zu machen ... Sie wissen, eine ausgewogene Ernährung;)
Conor O'Brien
0

05AB1E , 12 Bytes

õsvy«žnvyÇy:

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

õ             # Push an empty string ""
 sv           # Swap to get the (implicit) input-string, and loop over its characters:
   y«         #  Append the current character to the string
     žn       #  Push builtin "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
       v      #  Inner loop over each of these letters:
           :  #   Replace in the string all occurrences (should be either 0 or 1 occurrence)
        yÇ    #   of the ordinal value of the current letter
          y   #   by this letter
              # (after the loops, implicitly output the top of the stack as result)

12 Byte- Alternative mit Reduction-By:

Å»«žnvyÇy:]θ

Probieren Sie es online aus oder überprüfen Sie alle Testfälle oder sehen Sie eine schrittweise Reduzierung mit nur den ersten 10 Bytes .

Kevin Cruijssen
quelle