Laut RollingStone sind im Folgenden die 26 größten Sänger aller Zeiten aufgeführt:
Aretha Franklin Al Green
Ray Charles Robert Plant
Elvis Presley Mick Jagger
Sam Cooke Tina Turner
John Lennon Freddie Mercury
Marvin Gaye Bob Marley
Bob Dylan Smokey Robinson
Otis Redding Johnny Cash
Stevie Wonder Etta James
James Brown David Bowie
Paul McCartney Van Morrison
Little Richard Michael Jackson
Roy Orbison Jackie Wilson
Sie können dies als eine Liste von Strings bekommen hier .
Aufgabe
Bei einem Sängernamen, drucken oder einen Brief Rückkehr aus A
zu Z
dem eindeutig diesen Sänger identifiziert. (Wenn Ihr Code zurückgibt A für Bob Dylan , dann kann es nicht zurück A für andere Sänger.)
Im Gegensatz zu anderen ähnlichen Herausforderungen liegt das Mapping bei Ihnen , solange es kollisionsfrei ist.
Regeln
- Die Eingabe ist garantiert einer der 26 oben aufgeführten Sängernamen mit genau dieser Schreibweise und ohne führende oder nachfolgende Leerzeichen.
- Sie können den Buchstaben in Klein- oder Großbuchstaben ausgeben. Aber es muss konsequent sein.
- Sie werden aufgefordert, eine Testsuite für alle 26 möglichen Eingaben bereitzustellen.
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes!
Antworten:
MATL , 28 Bytes
Probieren Sie es online!
Erläuterung
Ruft implizit die Eingabezeichenfolge ab. Summieren Sie die Zeichen der Eingabezeichenfolge, und führen Sie Modul 98 aus, gefolgt von Modul 40. Ergibt eine der folgenden Zahlen:
38 18 13 34 29 23 27 30 5 28 22 1 0 16 7 32 8 14 3 36 25 4 2 6 24 35
(in der Reihenfolge der Pastebin-Liste).Drücken Sie das (Klein-) Alphabet mit
2Y2
. Dies kümmert sich um die Zahlen im Bereich [1,26]. Einige Zahlen fehlen jedoch, und wir haben Zahlen bis zu 38. Daher hängen wir (h
) eine Zeichenfolge an, die sich um die höheren Zahlen kümmert, indem wir diese Zahlen den 'fehlenden' Buchstaben zuordnen. Die Leerzeichen können beliebig sein. Ich habe in meinem ursprünglichen Programm Großbuchstaben verwendet, um die Eingabe zu vereinfachen.Wir können jetzt die Zahl vom ersten Schritt in den String vom zweiten Schritt mit indizieren
)
. Wir verwendenw
, um die Argumente in der richtigen Reihenfolge zu erhalten. Während es den Anschein hat, als würden wir eine 0-basierte Indizierung verwenden (die Zahlen variieren von 0 bis 38, und die Zeichenfolge ist 39 Zeichen lang), ist die Realität etwas komplizierter: Wir verwenden eine 1-basierte modulare Indizierung, eine Besonderheit MATL. Dies bedeutet, dass1
Indizes zua
,38
tatsächlich zuu
und0
Indizes zum Finalez
der Zeichenfolge erstellt werden.quelle
Python 2 ,
8071 BytesProbieren Sie es online!
Die Summen der Ordnungszahlen geben Zahlen zwischen
0
und an38
Die Zahlen, die größer als 25 sind, werden dann verschoben, um die folgenden Lücken auszufüllen (die sortierte Reihenfolge wird angezeigt):
Subtrahieren Sie,
18
wenni>25
:Hinzufügen,
3
wenni>31
:Subtrahieren Sie,
8
wenni>37
:Welches gibt die Reihenfolge
0..25
Diese werden dann umgesetzt
A-Z
mitchr(i+65)
quelle
(i>31)
aufi/32
usw. verkürzen6502 Maschinencode- Routine (C64), 83 Bytes
Dies ist ein positionsunabhängiger Code, den Sie einfach irgendwo im RAM ablegen und dorthin springen, z
sys
. B. mit dem Befehl.Online-Demo (lädt nach
$C000
/49152
).Verwendung:
sys49152,"[name]"
zBsys49152,"Aretha Franklin"
.Wichtig: Wenn das Programm von der Festplatte geladen wurde (wie in der Online-Demo), geben Sie zuerst einen
new
Befehl aus! Dies ist notwendig, weil das Laden eines Maschinenprogramms einige C64 BASIC-Zeiger in den Papierkorb wirft.Hinweis: Der C64 befindet sich standardmäßig in einem Modus ohne Kleinbuchstaben. Um lesbare Namen eingeben zu können, müssen Sie zuerst in den Kleinbuchstabenmodus wechseln, indem Sie
SHIFT
+ drückenCBM
.Erläuterung
Die Herausforderung besteht darin, für diese Namen eine minimale perfekte Hash-Funktion zu finden. Für den C64 musste ich einen finden, der mit einfachen 8-Bit-Operationen leicht zu berechnen ist. Hier ist eine kommentierte Auflistung der Demontage:
Testsuite (C64 BASIC, enthält die Maschinencode-Routine in
data
Zeilen)Online-Demo der Testsuite .
quelle
Python 2 , 68 Bytes
Probieren Sie es online!
quelle
chr(65+i-i/25*2-i/29*21+i/35*2)
) ähnelt der Antwort von TFelds . Die Modulo-Operationen werden durch ein Skript, das ich hier und hier bereits verwendet habe, brachial verstärkt .Javascript,
138132 ZeichenDa alle Initialen außer
MJ
= M ichael J ackson / M ick J agger eindeutig sind, überprüfe ich speziell Michael Jackson (der einzige mit einemh
auf der 4. Position) und für alle anderen Namen habe ich eine Zeichenfolge mit den folgenden Initialen erstellt durch einen eindeutigen Buchstaben.Code-Auszug
Probieren Sie es hier aus:
quelle
Java (OpenJDK 8) ,
128126115113 BytesNicht zu schäbig für eine Java-Vorlage!
Vielen Dank an Kevin, der mir mit den Lambda-Ausdrücken eine Menge Bytes erspart hat!
Probieren Sie es online!
quelle
{a+=i;}
zua+=i;
char g(String s)
aufs->
. Ich habe Ihr TIO geändert, um zu zeigen, wie dies gemacht wird, falls Sie nur an Java 7-Methoden gewöhnt sind.Python 3,
1329996 BytesProbieren Sie es online!
Nicht brillant golfen, aber ich dachte, ich würde es versuchen.
-33 Bytes dank Modifikationen von TFeld.
-3 Bytes durch Verwendung von
find
anstelle vonindex
Dank an Ovs.quelle
sum(map(ord,m))
, außerdem habe ich Aretha Franklin für 128 Byteschr(97+...)
anstelle vonascii_lowercase
: 99 Bytes verwendensum(map(ord,m))
Addiert die ASCII-Werte der Zeichen in der Zeichenfolgem
(gibt Ganzzahlen im Bereich von 702 bis 1506 an). Wennchr
Sie es dann aufrufen , wird es in ein (Unicode-) Zeichen mit dieser Nummer konvertiert:chr(702)
istʾ
zuchr(1506) = ע
und Lose dazwischen. Diese Lösung sucht dieses Zeichen einfach in einer Liste aller möglichen (26) derartigen Zeichen nach, um den Index (0–26) zu erhalten, und gibt dann ein Zeichen mit dem ASCII-Code 97 + diesem Index zurück (also 'a' bis 'z').PHP,
90 88 8672 + 1 Byteskönnte mit einem anderen Modulo noch kürzer werden.
In Datei speichern und als Pipe mit ausführen
-nF
oder online ausprobieren .quelle
W
Ihre Testfälle aus, und es gibt keineX
Ausgabe. Ich weiß nicht, ob es sich um einen Fehler im Code selbst handelt oder nur um eine Online-Konvertierung :)<?=
Teil nicht. Und die "Run as Pipe" werde ich nicht arbeiten. Außerdem erhalte ich Hinweise, wenn ich versuche, es über die Befehlszeile auszuführen.<?=
... Meine Frage lautet also immer noch: Wie führe ich Ihren Code aus (von der Befehlszeile aus)? Ich kann es nicht über die$argn
Befehlszeile eingeben ... Alle meine bisherigen Versuche liefern entweder Artefakte und scheinen immer noch mehr Code zu benötigen, um es zum Laufen zu bringen.echo <input> | php -nF <scriptfilename>
Perl,
56,54,50, 46 + 1 (-p) Bytes$ = crypt $ , DT; / .. (.) /; $ _ = $ 1; y / 01268ADIJNVW / adhilmnpqsux /$ = crypt $ , DT; / .. (.) /; $ = $ 1; y / 01268JVW / hlmpqsux /; $ = lc$ = crypt $ , mO; / .. (.) /; $ = $ 1; y / 035eft / AHPRXZ /; $ = lcDank Doms Kommentar konnten 4 weitere Bytes eingespart werden, die auch in Großbuchstaben geändert wurden, um bessere Anforderungen zu erfüllen.
Probieren Sie es online
quelle
perl -pe '$_=crypt$_,mO;/..(.)/;$_=$1;y/035eft/AHPRXZ/;$_=lc'
Hinzufügen eines Links zu tio$1^$2
aber nicht daran gedacht, ihn zu verwendencrypt
... Sie können 4 Bytes sparen , wenn Sie etwas nachbestellen: Probieren Sie es online aus!Python 2,
5043 BytesDank an Japh für die neue Version
Probieren Sie es online!
Hinweis: Dies ist vom
hash
eingebauten System abhängig und funktioniert nicht in allen Implementierungenquelle
lambda n:chr(hash(n)%2354%977%237%54%26+65)
Ruby, 63 Bytes
Addiert die ASCII-Codes der Eingabe, nimmt sie mit Mod 98 und dann mit Mod 66, um eine von 26 eindeutigen Zahlen
n
im Bereich 0..65 zu erhalten. Die riesige hexadezimale Zahl enthält1
an jeder dieser 26 Stellen ein Bit. Wenn Sie also die Rechte verschieben,n
erhalten Sie eine Zahl mit 1..261
Bits. Wir zählen die1
Bits, indem wir die ASCII-Codes addieren und Mod 48 nehmen, dann 64 addieren und in einen ASCII-Code konvertieren.Testprogramm
das
map
iteriert durch die Sänger, die den Buchstabencode und den Sänger drucken. Anschließend wird ein Array der Buchstabencodes zurückgegeben, umsort
zu demonstrieren, dass jeder Buchstabe einmal verwendet wird.Ausgabe
quelle
Oktave ,
85 83 8074 BytesDieses Durcheinander eines Anonymen ist das Ergebnis von einigem Durcheinander in MATLAB, das versucht, einen guten Weg zu finden, um die Daten zu verschlüsseln.
Grundsätzlich werden nach einer schnellen Analyse nur die Buchstaben 1,2 und 8 der Eingabezeichenfolge (die kleinste Zeichenfolge besteht aus 8 Zeichen, wir sind also gut) benötigt, um aus jeder Eingabe einen eindeutigen Wert zu erzeugen. Der schwierige Teil ist dann, diesen einzigartigen Wert in etwas Nutzbares umzuwandeln.
MATLAB ist schrecklich in der Komprimierung von Daten, daher musste ich nach einer anderen Möglichkeit suchen, um das Lookup-Mapping zu erstellen. Ich habe versucht, eine Funktion für die drei Eingabebuchstaben zu finden, die zu einem eindeutigen Wert führte, der auch als druckbarer ASCII-Wert fungierte, sodass ich die Zuordnung in eine Zeichenfolge mit einem Zeichen pro Eingabe einbetten konnte.
Es stellt sich heraus, dass eine Matrix, die die Zeichen am Index
[1 2 8]
mit der Ganzzahlmatrix multipliziert[1;15;47]
und dann Mod 124 ausführt, eindeutige Werte ergibt, die alle druckbaren ASCII-Werte enthalten (und keines ist ein'
Zeichen, das Zeichenfolgenliterale nervt). Erfreulicherweise endet das Mapping mitTIO
dem völlig zufällig. Interessanterweise ist dies die einzige Zuordnung für diese Gleichung, die 26 eindeutige druckbare ASCII-Zeichen ergibt.Das ist also im Grunde meine Lookup-Zuordnung und Berechnung. Bei der Suche wird lediglich die Berechnung durchgeführt und mit dem Mapping verglichen. Das Hinzufügen
'A'-1
zu dem Index in der Karte führt zu einem Buchstaben AZ.Sie können es online bei TIO ausprobieren , wo die vollständige Zuordnung der Ein- und Ausgänge angezeigt wird. Der Vollständigkeit halber ist das vollständige Mapping auch unten aufgeführt:
+32
.'A':'Z'
statt find gemacht wurde.quelle
JavaScript (Chrome), 102
Hinweis Leider funktioniert es nur in Chrome, da implementierungsabhängige Approximationen in parseInt () (danke @Arnauld)
Ich suchte nach einer Hash-Funktion, nahm ein Stück von jedem Namen, konvertierte mit Basis 36 in Zahlen und wandelte dann ein Modulo an.
Mit diesem Code habe ich nach dem besten Hash gesucht:
Und die Ergebnisse:
Die beste Hash-Funktion gibt 26 verschiedene Werte zwischen 0 und 50, aber ich habe einen anderen verwendet, mit 1 Duplikat, aber einem kleineren Bereich.
Prüfung
quelle
parseInt()
.C
655549 Bytesh(char*s){return*s<77?(*s^s[5]+40)%13+65:(s[5]&s[4]+s[1])%13+78;}
h(char*s){return*(long*)s%887%392%224%120%67%40%26+65;}
Gleicher Ansatz wie die Antwort von KSab . C bietet keine String-
hash
Funktion wie Python. Oder doch?Probieren Sie es online!
h
Gibt einen zurück,int
dessen Werte die ASCII-Codes für sindA .. Z
.quelle
Javascript, 98 Bytes
Ich fand heraus, dass die Kombination des 2. und 4. Zeichens der Namen für jeden von ihnen einzigartig ist.
Deshalb erstelle ich eine Zeichenkette mit den Kombinationen
name[4] + name[2]
, nichtname[2] + name[4]
oder ich hätte eine Wiederholung der Zeichengruppeeh
des Vornamens Aretha Franklineh
und wenn Smokey Robinson und Johnny Cashoehn
verkettet sind.Ich könnte Johnny Cash einfach an eine andere Position des Strings verschieben und eine andere Zuordnung erhalten, aber die Verkettung des 4. und 2. Zeichens in dieser Reihenfolge vermeidet die Kollision und lässt die Datensatzreihenfolge intakt, ohne der Lösung mehr Länge hinzuzufügen. Also habe ich beschlossen, diesen Weg zu gehen (es ist nur eine persönliche Präferenz)
Ich suche die Position der Verkettung des 4. und 2. Buchstabens des angegebenen Parameters in der Zeichenfolge und dividiere sie durch 2, sodass ich eine Zahl zwischen 0 und 25 erhalte. Dann addiere ich 10 und konvertiere sie von Basis 36 in Zeichenfolge. wo 10 entspricht
a
und 35 zuz
quelle
Wolfram-Sprache (Mathematica) , 101
126Bytes+32
scheint zur kürzesten stirng hashtable in Mathematica zu führenInputForm
.Probieren Sie es online!
quelle
///
390231 BytesProbieren Sie es online!
231 Bytes nach dem Entfernen der Zeilenumbrüche.
Das ist sehr lang, aber /// kann nicht generisch mit verschiedenen Zeichen umgehen. Mit anderen Worten, /// unterstützt Regex nicht.
quelle
Excel, 96 Bytes
Nachdem Sie zu viel Zeit damit verbracht haben, andere Ansätze auszuprobieren, haben Sie den Ansatz von @Eduardo Paez implementiert:
quelle