Kommen wir zurück zu den Grundlagen!
- Ihr Code, ein vollständiges Programm oder eine Funktion, muss den offiziellen Unicode-Namen eines druckbaren lateinischen Basiszeichens in das entsprechende Zeichen konvertieren. Zum Beispiel
LOW LINE
muss Ihr Code für die Eingabe ausgegeben werden_
. - Sie müssen nur einen einzelnen Zeichennamen als Eingabe verwenden.
- Sie können keine vordefinierten oder anderweitig vorhandenen Funktionen oder Bibliotheken verwenden, die eine Logik speziell für Unicode-Zeichennamen bieten (z. B. Pythons
unicodedata
, JavasCharacter.getName
usw.). - Für andere Eingaben als einen dieser Namen ist jedes Verhalten akzeptabel.
Dies ist Code Golf: Der kürzeste Code in Bytes gewinnt.
Um Unklarheiten zu vermeiden, ist dies der vollständige Satz der offiziellen Charakternamen, die wir verwenden werden (aus dieser Frage entlehnt ):
SPACE
! EXCLAMATION MARK
" QUOTATION MARK
# NUMBER SIGN
$ DOLLAR SIGN
% PERCENT SIGN
& AMPERSAND
' APOSTROPHE
( LEFT PARENTHESIS
) RIGHT PARENTHESIS
* ASTERISK
+ PLUS SIGN
, COMMA
- HYPHEN-MINUS
. FULL STOP
/ SOLIDUS
0 DIGIT ZERO
1 DIGIT ONE
2 DIGIT TWO
3 DIGIT THREE
4 DIGIT FOUR
5 DIGIT FIVE
6 DIGIT SIX
7 DIGIT SEVEN
8 DIGIT EIGHT
9 DIGIT NINE
: COLON
; SEMICOLON
< LESS-THAN SIGN
= EQUALS SIGN
> GREATER-THAN SIGN
? QUESTION MARK
@ COMMERCIAL AT
A LATIN CAPITAL LETTER A
B LATIN CAPITAL LETTER B
C LATIN CAPITAL LETTER C
D LATIN CAPITAL LETTER D
E LATIN CAPITAL LETTER E
F LATIN CAPITAL LETTER F
G LATIN CAPITAL LETTER G
H LATIN CAPITAL LETTER H
I LATIN CAPITAL LETTER I
J LATIN CAPITAL LETTER J
K LATIN CAPITAL LETTER K
L LATIN CAPITAL LETTER L
M LATIN CAPITAL LETTER M
N LATIN CAPITAL LETTER N
O LATIN CAPITAL LETTER O
P LATIN CAPITAL LETTER P
Q LATIN CAPITAL LETTER Q
R LATIN CAPITAL LETTER R
S LATIN CAPITAL LETTER S
T LATIN CAPITAL LETTER T
U LATIN CAPITAL LETTER U
V LATIN CAPITAL LETTER V
W LATIN CAPITAL LETTER W
X LATIN CAPITAL LETTER X
Y LATIN CAPITAL LETTER Y
Z LATIN CAPITAL LETTER Z
[ LEFT SQUARE BRACKET
\ REVERSE SOLIDUS
] RIGHT SQUARE BRACKET
^ CIRCUMFLEX ACCENT
_ LOW LINE
` GRAVE ACCENT
a LATIN SMALL LETTER A
b LATIN SMALL LETTER B
c LATIN SMALL LETTER C
d LATIN SMALL LETTER D
e LATIN SMALL LETTER E
f LATIN SMALL LETTER F
g LATIN SMALL LETTER G
h LATIN SMALL LETTER H
i LATIN SMALL LETTER I
j LATIN SMALL LETTER J
k LATIN SMALL LETTER K
l LATIN SMALL LETTER L
m LATIN SMALL LETTER M
n LATIN SMALL LETTER N
o LATIN SMALL LETTER O
p LATIN SMALL LETTER P
q LATIN SMALL LETTER Q
r LATIN SMALL LETTER R
s LATIN SMALL LETTER S
t LATIN SMALL LETTER T
u LATIN SMALL LETTER U
v LATIN SMALL LETTER V
w LATIN SMALL LETTER W
x LATIN SMALL LETTER X
y LATIN SMALL LETTER Y
z LATIN SMALL LETTER Z
{ LEFT CURLY BRACKET
| VERTICAL LINE
} RIGHT CURLY BRACKET
~ TILDE
COLON COLON
ausgegeben::
werden oder undefiniertes Verhalten?String.fromCharCode
verboten?CLON
?Antworten:
IA-32 Maschinencode,
161160122 BytesHexdump des Codes:
Dieser Code verwendet etwas Hashing. Durch eine Brute-Force-Suche habe ich festgestellt, dass die folgende Hash-Funktion auf die Bytes der Eingabezeichenfolge angewendet werden kann:
Es multipliziert
x
mit 89, addiert das nächste Byte (ASCII-Code) und nimmt ein Restmodulo 113 an. Dies geschieht für alle Bytes der Eingabezeichenfolge mit Ausnahme der letzten, also z. B.LATIN CAPITAL LETTER A
undLATIN CAPITAL LETTER X
geben Sie denselben Hash-Code an.Diese Hash-Funktion hat keine Kollisionen und die Ausgabe liegt im Bereich von 0 bis 113 (zum Glück ist der Bereich sogar noch enger: 3 bis 108).
Die Hash-Werte aller relevanten Zeichenfolgen füllen diesen Bereich nicht vollständig aus, daher habe ich mich entschieden, diese zu verwenden, um die Hash-Tabelle zu komprimieren. Ich habe eine "Überspringen" -Tabelle (112 Bits) hinzugefügt, die 0 enthält, wenn die entsprechende Stelle in der Hash-Tabelle leer ist, und 1, wenn dies nicht der Fall ist. Diese Tabelle konvertiert einen Hash-Wert in einen "komprimierten" Index, der zum Adressieren einer dichten LUT verwendet werden kann.
Die Zeichenfolgen
LATIN CAPITAL LETTER
undLATIN SMALL LETTER
geben die Hash-Codes 52 und 26 an. Sie werden separat behandelt. Hier ist ein C-Code dafür:Der entsprechende Assembler-Code (MS Visual Studio Inline-Assembler-Syntax):
Einige bemerkenswerte Implementierungsdetails:
CALL
Anweisung, um einen Zeiger auf den Code abzurufen, in dem sich die fest codierte Tabelle befindet. Im 64-Bit-Modus könnterip
stattdessen das Register verwendet werden.BT
Anweisung, um auf die Sprungtabelle zuzugreifeneax
,ecx
,edx
, die verprügelt werden kann - so gibt es keine Notwendigkeit Register zu speichern und wiederherzustellenal
undah
sorgfältig darauf geachtet, dass an der richtigen Stelleah
auf 0 abgenommen wird und das gesamteeax
Register als LUT-Index verwendet werden kannquelle
JavaScript ES6, 228
236 247 257 267 274 287Hinweis: 7 Zeichen sind dank @ ev3commander gespeichert
Anmerkung 2: Besser als JAPT nach 7 Hauptbearbeitungen .
Führen Sie das Snippet zum Testen aus
quelle
Japt , 230 Bytes
Jedes
¿
stellt ein nicht druckbares Unicode-Zeichen dar. Probieren Sie es online!Ungolfed:
Das hat wirklich Spaß gemacht. Ich habe die Charakternamen in mehrere große Teile aufgeteilt:
0. Nimm die ersten beiden Buchstaben
V=Us0,2;
Setzt die VariableV
auf die ersten beiden Buchstaben vonU
der Eingabezeichenfolge. Dies wird später nützlich sein.1. Großbuchstaben
Dies ist am einfachsten: Die Großbuchstaben sind die einzigen, die an Position 21 ein Zeichen haben, was allesamt der richtige Buchstabe und die richtige Groß- und Kleinschreibung sind. Somit
Ug21
ist ausreichend.2. Kleinbuchstaben
Ein anderes ziemlich einfaches; der einzige andere Name, der ein Zeichen auf Position 19 hat, ist
RIGHT SQUARE BRACKET
, also prüfen wir, ob der Name vorR
mit kommtU<'R
, und wenn es (&&
) ist, nehmen wir das 19. Zeichen mitUg19
und setzen es in Kleinbuchstaben mitv
.3. Ziffern
Diese Namen beginnen alle mit
DI
(und glücklicherweise mit keinem der anderen). Wenn alsoV=="DI"
, können wir daraus eine Ziffer machen. Die ersten Buchstaben einiger Ziffernnamen sind identisch, die ersten beiden Buchstaben sind jedoch ausreichend. Wenn wir diese zu einer Zeichenfolge kombinieren, erhalten wirZEONTWTHFOFISISEEINI
. Jetzt können wir nur den Indexb
der ersten beiden Zeichen im Namen der Ziffer mit nehmenUs6,8)
und durch zwei teilen.4.
SIGN
Es gibt sieben Namen, die enthalten
SIGN
:Zuerst prüfen wir, ob der Name das Wort enthält
SIGN
. Es stellt sich heraus,GN
ist ausreichend;Uf"GN"
Gibt alle Instanzen vonGN
im Namen zurück, dhnull
wenn es 0 Instanzen enthält, und wird daher übersprungen.Nun kombinieren wir mit der gleichen Technik wie bei den Ziffern die ersten beiden Buchstaben zu einer Zeichenkette
LEGRPLEQDONUPE
, nehmen dann den Index und dividieren durch zwei. Dies ergibt eine Zahl, aus0-6
der wir das entsprechende Zeichen aus der Zeichenkette entnehmen können<>+=$#%
.5.
MARK
Es gibt drei Zeichen, die Folgendes enthalten
MARK
:Hier verwenden wir die gleiche Technik wie bei
SIGN
.M
reicht aus, um diese drei von den anderen zu unterscheiden. Um in ein Symbol zu übersetzen, reicht es aus, diesmal einen Buchstaben zu markieren: Das Zeichen an Position 2 ist für alle drei Zeichen unterschiedlich. Dies bedeutet, dass wir bei der Auswahl des richtigen Zeichens nicht durch zwei teilen müssen.6.
LEFT/RIGHT
Diese Gruppe enthält die Klammern und Klammern
[]{}()
. Es wäre wirklich kompliziert sowohl zu erfassenLEFT
undRIGHT
, aber zum Glück, sie alle enthalten die ZeichenfolgeT
. Wir überprüfen dies mit der gleichen Technik wie wirSIGN
. Um wie mit in ein Symbol zu übersetzenMARK
, reicht es aus, einen Buchstaben zu markieren. Der Charakter auf Position 6 ist für alle sechs einzigartig.7.
CO
Der Rest der Zeichen ist ziemlich einzigartig, aber nicht einzigartig genug. Drei von ihnen beginnen mit
CO
:COMMA
,COLON
, undCOMMERCIAL AT
. Wir verwenden exakt die gleiche Technik wie wir mit den Klammern haben, das richtige Symbol Auswahl auf der Grundlage der Zeichen an Position 4 (A
,N
oderE
).8. Alles andere
Inzwischen unterscheiden sich die ersten beiden Zeichen für jeden Namen. Wir kombinieren sie alle zu einer großen Zeichenfolge
SPAMAPASHYFUSORESETICIGRLOVE
und ordnen jedem Paar die entsprechenden Zeichen zu&'*-./\;~^`_|
.9. Letzte Schritte
Jeder der Teile gibt eine leere Zeichenfolge zurück oder
null
wenn es nicht die richtige ist, können wir sie alle von links nach rechts mit verknüpfen||
. Der||
Operator gibt das linke Argument zurück, wenn es wahr ist, und das rechte Argument, wenn es falsch ist. Japt hat auch eine implizite Ausgabe, was auch immer das Ergebnis ist, es wird automatisch an das Ausgabefeld gesendet.Fragen, Kommentare und Vorschläge sind willkommen!
quelle
MARK
Zeichen hinzugefügt .spamapashyfusoreseticigrlove
= Spam ein Pashy für so zurückgesetzt eisige Mädchen Liebe ... +1Python 2, 237 Bytes
Holen Sie sich den Hash des Strings und dividieren Sie ihn durch 535. Konvertieren Sie ihn anschließend in ein Unicode-Zeichen mit dieser Nummer. Die Position des Unicode-Zeichens in einer vorkompilierten Liste von Unicode-Zeichen wird anschließend in das ASCII-Zeichen konvertiert.
quelle
Javascript,
501499469465451430 BytesErläuterung:
Diese lange Zeichenfolge ist eine komprimierte Liste.
a.length.toString(36)+a[0]+a.slice(-3)
Legt fest, wie die Zeichenfolge in der Liste dargestellt wird, wenn überhaupt. Auch spezielle Logik für Briefe. (mit Streichern,a[0]
ist übrigens eine eingebaute Abkürzung füra.charAt(0)
)quelle
_
mit+
Base64 komprimieren.btoa("abc")
Text um 25% komprimieren (sofern es sich um gültigen Basis-64-Text handelt, den Sie nach dem Ersetzen_
durch verwenden würden-
), dannatob("compressed stuff")
in Ihrem tatsächlichen Code.PowerShell,
603547464 Byte(
LineFeed
Zählt dasselbe Byte wie;
, daher lasse ich die Pausen zur besseren Lesbarkeit ein.)Bearbeiten 1 - Entfernt viele Elemente aus der switch-Anweisung und füllt stattdessen eine Hash-Tabelle für Lookups.
Edit 2 - Oh ja ... Indizieren in einen String, das ist der richtige Weg ...
Nimmt im Wesentlichen die Eingabe, teilt sie in Leerzeichen auf und setzt
switch
beim ersten Wort einen Platzhalter , um die doofen herauszufiltern. Setzt das Ergebnis auf$b
. Falls$b
nicht vorhanden, wird der String$c
mit den ersten drei Buchstaben des ersten Wortes ausgewertet und gibt das unmittelbar folgende Zeichen aus, ansonsten geben wir aus$b
.Einige Tricks beinhalten das,
LATIN CAPITAL LETTER R
was in ein Array indiziert, basierend darauf, ob das zweite Wort istCAPITAL
, und das Ausgeben des entsprechenden Groß- / Kleinbuchstabens. Der andere "Trick" ist für dieDIGIT
s, indem in eine Hash-Tabelle indiziert wird. Beachten Sie, dass es nicht kürzer ist, hier denselben Index-in-eine-Zeichenfolge-Trick auszuführen (tatsächlich ist er um ein Byte länger).quelle
Javascript,
416411389 BytesDies ist ein besser lesbares Format (Erklärung folgt später):
Mindestens 5 Byte aus der Kombination von Schlüssel- und Wertzeichenfolgen.
Erläuterung: Die regulären Ausdrücke in der ersten Zeile reduzieren die Eingaben in eindeutige Schlüssel mit 4 Zeichen. Beachten Sie, dass die Eindeutigkeit nur für die in der Challenge angegebenen Namen garantiert ist und dass Duplikate für normales Englisch sehr häufig sind! Selbst für diese Herausforderung musste ich gebräuchliche Wörter wie Klammer und Zeichen entfernen, um ein einzigartiges Set zu erhalten.
Um das Zeichen zurückzugeben, überprüfe ich, ob es ein lateinisches Zeichen ist, indem ich die Zeichenfolgen "SER" und "cer" überprüfe und das letzte Zeichen der Eingabe in Kleinbuchstaben für ser zurückgebe.
Für alles andere beziehe ich mich auf eine Zeichenfolge, die alle 4 Zeichenschlüssel enthält, gefolgt vom richtigen Zeichen. Ich benutze dann IndexOf und
TeilzeichenzeichenIndizes zu ziehen und den Charakter zurück.Bearbeiten: Verwenden Sie mehr Platzhalter, um die Regex-Größe zu reduzieren, ersetzen Sie substr durch Zeichenindizes und entfernen Sie weitere 20 Zeichen. Regelverfasser werden bemerken, dass dieses letzte Update nach dem Ende der Herausforderung veröffentlicht wird, aber ich denke nicht, dass es mein Ranking verändert hat. Dies ist nur eine Übung für einen Anfänger.
quelle
Python 3, 148 Bytes
Zur Vereinfachung der Anzeige habe ich zwei nicht druckbare Bytes durch die oktalen Escape-Codes ersetzt
\32
und ersetzt\34
. Machen Sie dies rückgängig, um die 148-Byte-Funktion zu erhalten.Ich habe Teile dieser Hash-Funktion mit GPerf berechnet .
quelle
Perl 6 ,
348242 BytesVerwendung:
quelle