Es gibt 97 ASCII- Zeichen, die Menschen regelmäßig begegnen. Sie fallen in vier Kategorien:
Buchstaben (52 gesamt)
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
Zahlen oder Ziffern (10 insgesamt)
0123456789
Symbole & Interpunktion (32 insgesamt)
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
Leerzeichen (3 insgesamt)
Raum
\t
und Newline\n
. (Wir behandeln Zeilenumbruchvarianten\r\n
als ein Zeichen.)
Der Einfachheit halber werden wir diese Kategorien L, N, S und W nennen.
Wählen Sie eine der 24 Permutationen der LNSW
gewünschten Buchstaben aus und wiederholen Sie sie auf unbestimmte Zeit, um eine eigene Programmiervorlage zu erstellen.
Beispielsweise könnten Sie die Permutation auswählen NLWS
, sodass Ihre Programmiervorlage wie folgt lautet:
NLWSNLWSNLWSNLWSNLWS...
Sie müssen ein Programm oder eine Funktion basierend auf dieser Vorlage schreiben, wobei:
Jeder
L
wird durch einen Buchstaben (ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
) ersetzt.Jedes
N
wird durch eine beliebige Zahl ersetzt (0123456789
).Jedes
S
wird durch ein beliebiges Symbol (!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
) ersetzt.Jedes
W
Zeichen wird durch ein Leerzeichen (\t\n
) ersetzt.
Grundsätzlich muss Ihr Code dem Muster folgen
<letter><number><symbol><whitespace><letter><number><symbol><whitespace>...
Wie aus dem Fragentitel hervorgeht, können Sie bei Bedarf eine andere Reihenfolge der vier Zeichenkategorien auswählen.
Beachten Sie, dass:
Ersetzungen für eine Kategorie können unterschiedliche Zeichen sein. zB
9a ^8B\t~7c\n]
passt sich gültig an die Schablone anNLWSNLWSNLWS
(\t
und\n
würde ihre wörtlichen Zeichen sein).Es gibt keine Code-Längenbeschränkungen. zB
1A +2B -
und1A +2B
und1A
und1
alle entsprechen der VorlageNLWSNLWSNLWS...
.
In Ihrem vorlagenkonformen Code muss lediglich ein nicht erweitertes ASCII- Zeichen verwendet und eine Zahl von 0 bis 4 ausgegeben werden, je nachdem, zu welcher Kategorie er in der obigen Kategorisierung gehört. Das heißt, es wird ausgegeben, 1
wenn die Eingabe ein Buchstabe, 2
eine Zahl, 3
ein Symbol und ein 4
Leerzeichen ist. Ausgabe, 0
wenn die Eingabe keine davon ist (ein Steuerzeichen ).
Zur Eingabe können Sie alternativ eine Zahl von 0 bis einschließlich 127 eingeben, die den Code des eingegebenen ASCII-Zeichens darstellt.
Die Eingabe- (als Zeichencode) und Ausgabepaare, die Ihr Code haben muss, lauten genau wie folgt:
in out
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 4
10 4
11 0 or 4
12 0 or 4
13 0 or 4
14 0
15 0
16 0
17 0
18 0
19 0
20 0
21 0
22 0
23 0
24 0
25 0
26 0
27 0
28 0
29 0
30 0
31 0
32 4
33 3
34 3
35 3
36 3
37 3
38 3
39 3
40 3
41 3
42 3
43 3
44 3
45 3
46 3
47 3
48 2
49 2
50 2
51 2
52 2
53 2
54 2
55 2
56 2
57 2
58 3
59 3
60 3
61 3
62 3
63 3
64 3
65 1
66 1
67 1
68 1
69 1
70 1
71 1
72 1
73 1
74 1
75 1
76 1
77 1
78 1
79 1
80 1
81 1
82 1
83 1
84 1
85 1
86 1
87 1
88 1
89 1
90 1
91 3
92 3
93 3
94 3
95 3
96 3
97 1
98 1
99 1
100 1
101 1
102 1
103 1
104 1
105 1
106 1
107 1
108 1
109 1
110 1
111 1
112 1
113 1
114 1
115 1
116 1
117 1
118 1
119 1
120 1
121 1
122 1
123 3
124 3
125 3
126 3
127 0
Die Eingänge 11, 12 und 13 entsprechen den Zeichen, die manchmal Leerzeichen betrachtet, so kann ihre Ausgaben sein 0
oder , 4
wie Sie wünschen.
Der kürzeste Code in Bytes gewinnt.
quelle
Antworten:
Haskell 300 Bytes
Dieser Code sollte keine nachgestellte Newline haben. Die Funktion
m1
nimmt die Eingabe alsChar
und gibt die Antwort als zurückChar
.Ich konnte einer Herausforderung nicht widerstehen, von der jemand behauptete, dass sie für "konventionelle" Sprachen unmöglich sei.
Sie können darüber streiten, ob Haskell zählt, aber die Mehrzahl der Schlüsselwörter und Bezeichner besteht aus mehreren Zeichen und kann nicht verwendet werden. Funktionsdefinitionen auf oberster Ebene, Listen, Zeichenfolgenliterale, strenge Vergleiche, Mustervergleiche und Verzweigungen mit Wächtern funktionieren jedoch, solange Buchstaben direkt vor Ziffern und Symbole direkt vor Buchstaben vor
\t
und stehen\r
. Leider erlauben die Permutationen, die für die allgemeine Programmierung funktionieren, keine numerischen Literale, so dass ich keine nützlichen Zahlen erhalten konnte.Wie es funktioniert:
m1
.x1
ist der Charakter, der analysiert wird.f1
Funktion unterbricht die Zeichenfolge mit Listenmusterabgleich und verfügt über drei Zweige: Wenn die Grenzen Symbole sind, die größer als Leerzeichen sind, Steuerzeichen, die kleiner als Leerzeichen sind, und für den endgültigen Vergleich mit Leerzeichen. Die Namen der Listenelemente sind für den ersten Zweig mnemonisch: Buchstabe, Zahl, sPace, sYmbol, Rest.b1
Funktion verarbeitet die Verzweigung für zwei Begrenzungszeichens1 < b1
gleichzeitig.Probieren Sie es online aus
quelle
Netzhaut , 113 Bytes
Buchstabe, Zahl, Leerzeichen, Symbol, Wiederholung
Probieren Sie es online!
Teste es selbst!
Retina scheint ein gutes Werkzeug für diesen Job zu sein: Wir können alle Arten von Zeichen flexibel in der Bühnenkonfiguration verwenden und wir haben einige vordefinierte Zeichenklassen, die nützlich sein können.
Ich denke, dass dieses Problem entweder mit Ersatzphasen oder mit Transliterationsphasen gelöst werden könnte; Ich habe die Transliterationen ausgewählt, weil sie flexibler sind und die nützlichsten Zeichenklassen haben. In Bezug auf das
\n
Quellmuster war ich gezwungen, Symbole direkt vor Buchstaben zu setzen, um sie für Zeilenumbrüche zu verwenden (ich hatte tatsächlich eine kürzere Lösung, indem ich das praktischere ¶ für Zeilenumbrüche verwendete, aber Nicht-ASCII-Zeichen sind verboten).Erläuterung
Die ersten Schritte sind Transliterationen. Wir verwenden
+
und1
als Optionen, um das Muster am Laufen zu halten, aber sie haben keinen Einfluss auf das Bühnenergebnis. Die Syntax besteht darinT`from`to
, jedes Zeichenfrom
auf das Zeichen an derselben Position in abzubildento
. Wennto
kürzer als istfrom
, wird das endgültige Zeichen so oft wie nötig wiederholt. Wennfrom
Zeichen wiederholt wurden, wird nur das erste Vorkommen jedes Zeichens berücksichtigt. Einige Buchstaben entsprechen Zeichenklassen, zBd
entspricht0123456789
.Damit ordnen wir einige Zeichen anderen Zeichen der gleichen Klasse zu, um "etwas Platz" für nachfolgende Transliterationen zu schaffen. (
a
->b
,0
->1
,space
->tab
,@
->;
). Das Finale:D0
ist nur ein Smiley: D0Wir beginnen mit Ziffern,
d
ist die Zeichenklasse0-9
, hier transformieren wir0
->a
,1-9
->2
,space
->2
: die Transliterationen für0
undspace
sind falsch, aber diese Zeichen wurden durch die vorherige Transliteration eliminiert.Whitespace - Transformation
a
->a
(9
,tab
,\n
,space
) ->4
.9
wurde bereits in der vorherigen Stufe entfernt.Buchstaben, hier verwenden wir zwei verschiedene Zeichenklassen (aus Mangel an einer vollständigeren):
l
für Kleinbuchstaben undL
für Großbuchstaben. Sie alle1
werden zusammen mit einigen anderen Charakteren abgebildet , die in den vorherigen Phasen behandelt wurdenSymbole. Da jede andere Klasse hat sich zu einer Ziffer verwandelt, hier bilden wir alle Stellen , um sich mit
d
->d
und dann alle druckbaren Zeichen3
mitp
->3
. Ziffern gehören ebenfalls zu den druckbaren Zeichen, aber die erste Transliteration gewinnt.Jetzt müssen wir
0
Steuerzeichen zuweisen , aber ich habe keine gültige Möglichkeit gefunden, diese Klasse explizit anzusprechen. Stattdessen konvertieren wir jede Ziffer in eine unäre: Steuerzeichen sind keine Ziffern und werden daher als leere Zeichenfolge betrachtet, was einer0
unären entspricht. Leider ist der unäre Konvertierungsbefehl in der Netzhaut$*
, das sind zwei Symbole in der Nähe, also konvertieren wir stattdessen "manuell" mit Hilfe von Substitutionen.Unsere unäre Ziffer ist
$n
, was ein Ersatzmuster für Zeilenumbrüche ist.\b
Entspricht einer "Grenze", an der ein alphanumerisches Wort beginnt oder endet. In unserem Fall steht dies immer vor einer beliebigen Zahl. Grundsätzlich ersetzen wir jede Nummern
durch ein Zeilenvorschubplusn-1
.Am Ende zählen wir die Anzahl der Zeilenumbrüche und erhalten das gewünschte Ergebnis.
quelle
Kardinal
22402224 BytesVorlage verwendet LSNW
Der Code hat eine nachgestellte Newline.
Wie es funktioniert:
Dieser Code enthält viele Zeichen, die nicht verwendet werden.
% gibt einen Zeiger in alle Richtungen frei. 3 von ihnen treffen einfach das Ende einer Linie und sterben.
Der letzte Zeiger nimmt eine Eingabe an:
Diese Eingabe wird dann mit jedem Wert von 0 bis 127 verglichen.
Drucke:
0 für 0-8
4 für 9-12
0 für 13-31
4 für 32
3 für 33-47
2 für 48-57
3 für 58-64
1 für 65-90
3 für 91-96
1 für 97-122
3 für 123-126
0 für 127
Verwendete Operationen:
J = Nächste Operation überspringen, wenn nicht Null
^ = Richtung nach oben
ändern> = Richtung nach links ändern
- = Dekrementieren
+ = Inkrementieren
: = Eingabe übernehmen
% = Zeiger beim Programmstart
erzeugen x = Zeiger entfernen
0 = Aktiv setzen Wert des Zeigers auf 0
Probieren Sie es online aus
quelle
Perl 5 , 293 Bytes
291 Byte Code + 2 für
-0p
.Ich wurde darauf hingewiesen, dass die Befehlszeilen-Flags kostenlos sind, aber ich habe sie hier
-0
zur besseren Übersicht hinzugefügt, da der TIO-Link keine enthält , um das Testen zu vereinfachen.Probieren Sie es online!
Dies ist eine besonders knifflige Herausforderung, die in fast jeder Sprache zu lösen ist. Ich bin also ziemlich froh, dass ich in der Lage war (endlich eine ganze Reihe von Bastelarbeiten durchzuführen), dies in Perl zum Laufen zu bringen. Hoffentlich ist das zusätzliche Leerzeichen vor und nach der Nummer kein Problem.
Die Auswahl der Sequenz , um besonders heikel, aber forunately
s///
undy///
kann ein anderes Zeichen als Trennzeichen akzeptieren , so war es möglich , Brief, Raum, Zahl, ein Symbol zu verwenden, die für erlaubts 0...0...0;
undy 0...0...0;
.Das erste, was für die Annäherung erforderlich war, war das Ersetzen
_
mit,!
so dass\w
nur Übereinstimmungen erzielt wurden[0-9a-zA-Z]
, und dann alle Leerzeichen (\s
) mit\t
, alle Ziffern mit\r
und alle verbleibenden Wortzeichen (\w
) mit,\n
um später eine einfache Zuordnung zu ermöglichen. Dann werden die unter Verwendung desy///
Bedieners, werden alle verbleibenden Symbole zu Wort - Zeichen umgewandelt!
zu_
und alle anderen Zeichen (zwischen9
unda
) nach unten verschoben werden 9 Plätze, um sie in Buchstaben oder Zahlen drehen. Diese werden dann durch\w
mit ersetzt,3
und die anderen zuvor vorgenommenen Ersetzungen werden durch ihre nummerierten Werte ersetzt.quelle
Leerzeichen , 1332 Bytes
Reihenfolge ist
1234
/LNSW
(Buchstabe, Ziffer, Symbol, Leerzeichen).Probieren Sie es online aus (Eingabe als Ganzzahl, die den Unicode eines Zeichens darstellt).
Erläuterung:
Whitespace ist eine stapelbasierte Sprache, bei der alle Zeichen außer Leerzeichen, Tabulatoren und Zeilenumbrüchen ignoriert werden. Hier ist das gleiche Programm ohne die
YO!
( 333 Bytes ):Buchstaben
S
(Leerzeichen),T
(Tabulator) und (Zeilenvorschub) werdenN
nur als Hervorhebungen hinzugefügt.[..._some_action]
nur als Erklärung hinzugefügt.Probieren Sie es online aus.
Programm in Pseudocode:
quelle