Basierend auf Practical Golf - US-Bundesstaaten
Ihre Aufgabe ist es, die Abkürzung (Symbol) eines Elements mit dem angegebenen Elementnamen bis einschließlich Ununoctium (118) zu finden. Verwenden Sie das Periodensystem auf Wikipedia .
Dank Squeamish Ossifrage finden Sie eine vollständige Liste der Elemente zu Abkürzungen unter http://pastebin.com/DNZMWmuf .
Sie dürfen keine externen Ressourcen verwenden. Darüber hinaus dürfen Sie keine eingebauten Daten speziell zu den Elementen des Periodensystems verwenden. Es gelten Standardlücken.
Eingang
Eingang kann von stdin, eine Datei sein prompt
, input
usw.
Eingabeformat:
Bei allen folgenden Angaben handelt es sich um gültige Eingaben:
Carbon
carbon
CARBON
cArBOn
Im Wesentlichen wird beim Elementnamen die Groß- / Kleinschreibung nicht berücksichtigt.
Sie müssen keine Rechtschreibfehler oder ungültige Elementnamen verarbeiten. Ungültige Eingabe ist undefiniertes Verhalten.
Ausgabe :
Das Symbol für das Element. Das erste Zeichen muss aktiviert sein und der Rest muss klein geschrieben werden.
Beispielausgabe: C
Testfälle:
Carbon -> C
NiTROGen -> N
Sodium -> Na
Gold -> Au
Silver -> Ag
Tin -> Sn
Es gibt viel mehr Elemente als Staaten, daher denke ich, dass es schwieriger sein wird, eine allgemeine Regel für diese zu finden.
Das ist Code Golf. Kürzester Code gewinnt!
quelle
Au
oder was immer Sie wollen. @Paul R Wenn es viele Möglichkeiten gibt, ein Element zu buchstabieren (z. B. Schwefel gegen Schwefel oder Aluminium gegen Aluminium), verwenden Sie, was auch immer Ihr Programm kürzer macht. Sie müssen nicht beide Fälle behandeln.Antworten:
CJam,
337297293232220201200 BytesDer obige Code verwendet die Caret-Notation, da er Steuerzeichen enthält.
Auf Kosten von 24 zusätzlichen Bytes (für insgesamt 224) können diese Zeichen vermieden werden.
Sie können diesen Code im CJam-Interpreter ausprobieren .
Testfälle
Wie es funktioniert
Der erste Schritt besteht darin, den Elementnamen aus STDIN zu lesen und eine ziemlich ausgefeilte Hash-Funktion anzuwenden, die alle Elementnamen im Bereich [0, 225] abbildet :
Viele Elementsymbole werden durch das erste und zweite, erste und dritte, erste und vierte, erste und fünfte oder erste und zehnte (nur das erste) Zeichen des englischen Namens des Elements gebildet. Wir werden diese Elemente durch Zahlen von 0 bis 4 darstellen. Alle verbleibenden Elemente (dargestellt durch 5) erfordern eine Nachschlagetabelle.
Die resultierende Tabelle kann wie folgt verschoben werden:
Das Array von Zeichencodes wird von der Basis 256 in die Basis 7 konvertiert, und die 6 werden durch Reihen von drei Nullen ersetzt.
Dies ist die Entscheidungstabelle D:
Die notwendige Aktion für das Element mit Hash 1 entspricht zB dem ersten Element dieses Arrays. Array-Elemente, die keinem Element-Hash entsprechen, sind ebenfalls Null, was die (0 0 0) ↦ 6- Komprimierung ermöglicht.
Nun interpretieren wir D für Hash H.
Als nächstes verschieben wir die Nachschlagetabelle. Wenn wir j an Einzelzeichensymbole anhängen und Uu durch Q ersetzen , ist jedes Symbol genau zwei Zeichen lang. Es kann wie folgt verschoben werden:
Das Array von Zeichencodes wird von der Basis 256 in die Basis 25 konvertiert, der Zeichencode von A wird zu allen Ziffern hinzugefügt (dabei wird auf Zeichen gewandelt ) und das Ergebnis wird in Abschnitte der Länge zwei aufgeteilt.
Dies ist die Nachschlagetabelle L:
Nun werden mögliche Elementnamen berechnet.
Der Stapel enthält jetzt
wobei B der Boolesche Wert D [H-1] / 5 ist , M der aus der Nachschlagetabelle abgerufene Name ist und N der Elementname ist, der durch Auswahl von Zeichen aus E gebildet wird.
Wir sind fast fertig:
quelle
C 452
Eine gute Hash-Funktion hilft. Es kann bessere geben. (Verbesserungen vorgeschlagen von @ugoren et al.)
Ungolfed mit Kommentaren:
Ich habe rohe Gewalt angewendet, um diesen Hash zu finden. Dies war die einzige mit einer Hash-Größe von ≤512, die keine Kollisionen aufwies. Ich habe jedoch keine alternativen Schreibweisen überprüft, und es gibt möglicherweise bessere Funktionen mit unterschiedlichen Algorithmen (z. B. Verwendung von XOR anstelle von Addition).
Die Hash-Funktion ordnet Textzeichenfolgen Werten von 0 bis 440 zu. "Tin" hascht auf Null, sodass "Sn" am Anfang der Tabelle steht. Die nächsten 7 Positionen sind leer. Um den Code kompakt zu halten, wird dies durch den ASCII-Wert 34 + 7 = 41 (")") angezeigt. Als nächstes folgen "Kupfer" (8), vier leere Zellen (34 + 4 = 38 = "&") und "Vanadium" (13). Nach der Berechnung eines Hashs durchläuft das Programm die Tabelle, subtrahiert 1 für jeden Großbuchstaben, gefolgt von 0 oder mehr Kleinbuchstaben, und subtrahiert (ASCII-WERT) -34 für jedes Nicht-Alphabet-Zeichen. Wenn der Wert Null erreicht, haben wir das richtige Ergebnis gefunden.
quelle
(h+c%32+74)*311%441
. 2. Tropfenp
und verwendens
. 3.main(c)
speichert ein Komma.JavaScript ES6, 690
708BytesDas erste Array enthält die Symbole, und das zweite Array enthält die Mindestbuchstaben, die erforderlich sind, um anzugeben, auf welches Element verwiesen wird. Vielen Dank an core1024 und edc65 für die Hilfe bei der Verkürzung. Test unter http://jsfiddle.net/xjdev4m6/2/ . Etwas besser lesbar:
quelle
Neo
bevor sie trifft,Neon
weil sie weniger Buchstaben enthält.if
Anweisung loswerden können (es ist eine perfektefor
Bedingung) und auch die Positionen einiger Variablen inline oder verschieben können, um den Code zu verkürzen;)).toLowerCase(
)[L='toLowerCase'](
a.toLowerCase(
a[L](
Ruby 1.9+,
565 471 447444Ein Einzeiler. Weil nichts "unmöglich ist, mit regulären Ausdrücken zu tun" ...
(Nur 94 Zeichen durch Hinzufügen eines weiteren regulären Ausdrucks gespeichert) ((und 24 durch Vereinfachung))
(Neue Zeile nach der Zeichenfolge für "Lesbarkeit" hinzugefügt, zum Testen entfernen)
Verwendung:
ruby periodic.rb aluminum
$>Erläuterung: Durch
Aufteilen der Zeichenfolge auf führende Großbuchstaben wird ein Regex-Array zurückgegeben, das mit Elementnamen übereinstimmt. Zulässig sind jeweils nur die Buchstaben aus der Abkürzung *. Sie sind so angeordnet, dass die erste Übereinstimmung, die beim Vergleich mit dem Befehlszeilenargument gefunden
*$*
wird, die richtige ist. Das nachfolgende gsub entfernt die Nicht-Alpha-Zeichen vor dem Drucken.* Ungerade Abkürzungen wie "Fe" für "Iron" werden von einem
|
Element behandelt: "Iro | Fe". Die erste Wahl ist, was wirklich zusammengebracht wird; Das Gsub entfernt dann alle Zeichen bis zum '|', wobei die eigentliche Abkürzung erhalten bleibt.Testframework (erfordert die Liste von @ squeamish: heruntergeladen als 'table.txt' im Arbeitsverzeichnis).
quelle
Ruby, 1068 Bytes
Eingabe über STDIN.
Die kürzesten eindeutigen Teilzeichenfolgen der Elementnamen sind das zweite bis sechste Zeichen (oder das Ende des Namens, wenn es zu kurz ist). Also hole ich diese einfach und suche sie in einem Hash nach. Ich habe den Hash auch komprimiert, weil das weitere 200 Bytes spart. So sieht der Hash selbst aus:
quelle
CJam,
462 449 434 401 391 384382Mit Hilfe von Dennis.
Code
Geschachtelte ternäre ifs sind wahrscheinlich nicht der richtige Weg, um dies in CJam zu tun.
Mit Einrückungen:
Viele der Symbole sind nur die ersten beiden Buchstaben des Elementnamens. Diese werden in der zweittiefsten Schicht verschachtelter if-Anweisungen behandelt. Viele andere sind der erste und dritte Buchstabe oder der erste und vierte Buchstabe - diese werden in aufeinanderfolgenden äußeren Schichten behandelt. Symbole, bei denen nur der erste Buchstabe erscheint, und vollständige Unregelmäßigkeiten werden in der fünften bzw. dritttiefsten Ebene behandelt.
Es gibt einige, bei denen es verwirrt wird (
TelLurium
vsThaLlium
, orSILicon
vsSILver
oderRUThenium
vsRUTherfordium
). Diese werden separat behandelt.Hier könnte viel Golf gespielt werden, hauptsächlich durch die Wiederverwendung von Codeblöcken und die Verbesserung des Umgangs mit Unregelmäßigkeiten.
quelle
"RUTHENIUM"=
kann nicht verwendet werden"RUTHEN"#!
. 2. Sie müsseno
vor dem eigentlichen Elementnamen ( ) weder explizit drucken ( ) noch etwas entfernen (;"Si"
). Hänge einfach]W=
an das Ende deines Codes an, um alles außer dem obersten Stack-Element zu entfernen. 3. Das macht ein paar Blocks leer. IfB
ist ein Boolescher Wert,B{...}{}?
undB{...}*
erreichen Sie dasselbe. 4. Die ternäre wenn nimmt Blöcke oder Stapelelemente, so dass Sie verkürzen{"Si"}
zu"Si"
._
und;
überallPHP,
507485476466 ZeichenVerwendung: Geben Sie den Elementnamen als GET-Parameter '0' ein - elements.php? 0 = carbon
Algorithmus: Durchlaufen Sie die Datenzeichenfolge und ziehen Sie Teilzeichenfolge- und Abkürzungscodepaare heraus. Wenn die Teilzeichenfolge mit dem Anfang des übergebenen Elements übereinstimmt, bestimmen Sie anhand des Abkürzungscodes, was ausgegeben werden soll: Wenn der Code mit einem Buchstaben beginnt, geben Sie ihn als Zeichenfolge aus. Wenn es sich um eine Zahl N handelt, geben Sie den ersten Buchstaben des Elements + den N-ten Buchstaben aus. Die Unun-Elemente sind mit dem Code '|' Wenn keine Unterzeichenfolge gefunden wird, die mit dem übergebenen Namen übereinstimmt, geben Sie die ersten beiden Zeichen des Namens als Abkürzung aus.
Lesbarer Code:
Kondensiert:
quelle
JavaScript (1100)
Naive Umsetzung strahlt in ihrer Einfachheit. Eine eindeutige Unterzeichenfolge ab dem Beginn des Namens wird einfach dem Symbol zugeordnet.
quelle
Python -
652 649637Meine Hash-Tabelle basiert auf der Kombination von jedem zweiten und jedem dritten Zeichen des Großbuchstabennamens:
Hier ist der entsprechende Generator:
Es gibt wahrscheinlich Raum für Verbesserungen, insbesondere für das Komprimieren der beiden langen Saiten.
Getestet mit:
quelle
Golfscript -
1052821Erläuterung:
quelle
n/
Haskell,
920817807776 ZeichenNachdem ich viel zu lange daran gearbeitet hatte, ein Regelsystem für die Zeichen eines Elementnamens in seinem Symbol zu erstellen, und ein wenig gebastelt hatte, gelang es mir, ein Skript zu schreiben, das Element in Symbol umsetzt. Eisen war ein Problem für mich, da ich bestimmte Zeichen aus GOLD, SILVER, TIN, LEAD, SODIUM, MERCURY, ANTIMONY, POTASSIUM und TUNGSTEN in ein nicht verwendetes periodisches Symbol umwandeln konnte (ich entschied mich für eine Stichprobe, die die Integration am einfachsten machte) sie in die bestehenden Regeln einbinden) und dann nach symbolischer Konvertierung übersetzen; Eisen war jedoch ein Problem, da Ir, Io und In bereits verwendet werden. Das waren ursprünglich 920 Zeichen, aber ich erkannte, dass die letzte Musterübereinstimmung (die größte) nicht vorhanden sein musste, da sie entweder die Dinge durchgehen ließ (was sie nicht tat) oder mit allen übereinstimmte. deshalb, Ich habe es durch ein Sammelzeichen ersetzt. Danach spielte ich weiter von 817 auf 808, indem ich einige Muster mit Platzhaltern so abkürzte, dass sie für diesen Elementnamen immer noch eindeutig waren (z. B. ist Lawrencium das einzige Element mit einem 'w' im Namen, also "* w "entspricht 1 Zeichen weniger als" Law ").
Hier ist mein Code. Ich habe es für alle Elemente getestet und es so codiert, dass es seine Eingabe automatisch in titlecase konvertiert, also keine Probleme mit der Groß- und Kleinschreibung.
EDIT 1
Ich reduzierte es weiter auf 776 Zeichen, indem ich den case-Ausdruck in t durch eine Musterübereinstimmung ersetzte (dies ist sinnvoll, weil der case-Ausdruck den rohen Operanden im Gegensatz zu einem Ausdruck im Sinne des Operanden testete), unnötige Klammern entfernte und Ausdrücken
e
als durch neue Zeilen getrennte Zeichenfolge anstelle einer Liste von Zeichenfolgen und später Aufteilen in die Hauptfunktion. Da es sich bei diesen Änderungen nur um Golf handelt, habe ich die für Menschen lesbare Version unverändert gelassen.Vom Menschen lesbare Version (Zeilenumbrüche, Abstände, ausführliche Namen, Kommentare: 2311 Zeichen)
Wenn jemand an einer Erklärung für irgendeinen Teil interessiert ist, kann er sich gerne erkundigen.
quelle
C # (826)
nicht die größte, aber ich dachte, ich würde es mit dem Handicap von c # versuchen.
Deshalb habe ich ein Programm geschrieben, um den vollständigen Namen von Elementen (z. B. Carbon) in die kleinste, aber immer noch eindeutige Zeichenfolge umzuwandeln, und dies für alle Elemente in Bezug auf alle anderen eindeutigen Zeichenfolgen. Ich habe das dann zu einer großen hässlichen Zeichenkette serialisiert, in der Großbuchstaben den Beginn von "Chunks" bezeichnen, wobei Chunks zwischen Schlüsseln und Werten wechseln. Wie KeyValueKey2Value2 usw.
Dieses Skript desterilisiert diese große Zeichenfolge und schneidet ein Zeichen am Ende der eingegebenen Zeichenfolge ab, bis es im Wörterbuch aus der großen Zeichenfolge gefunden wird.
(Ich sollte hinzufügen, dass mein Wissen über C # nicht erstaunlich ist und die ursprüngliche Einreichung, die ich machte, nur Dinge verwendete, die ich wusste, aber ich hatte anschließend einige Tricks, die mir von anderen gezeigt wurden.)
quelle
var
. Sie können ein paar weitere speichern, indem Sie nach der Einzelanweisung if blocks die geschweiften Klammern entfernen. Wenn Sie einem zuweisent.Substring(int, int)
,Func<int, int, string>
können Sie ein anderes Paar speichern.var
Drücken derstring[] r
und weitere 3 durchvar
Drücken der rasieren . Schließlichstring t = Console....
sparen Sie weitere 7, indem Sie ganz am Endereturn new string[]
in wechselnreturn new[]
.if(...) break;
Logik in die for-Schleifen-Ausgangsbedingungen. Eine Reihe anderer logischer Inversionen kann angewendet werden, z. B. einedo { } while(..)
in Ihrer Extraktionsmethode. Dies ist kürzer als das Hinzufügen einer separaten logischen Operation für den Eingabefall. Ich habe eine Änderung an Ihrem Code veröffentlicht, die aufgrund meiner geringen Anzahl an Mitarbeitern auf dieser Website noch überprüft / akzeptiert werden muss. Ich habe es auf 870 Zeichen gebracht.JavaScript (E6) 1433
Hier ist eine Obergrenze
Test in der FireFox / FireBug-Konsole
Ausgabe
quelle
SmileBASIC,
1763141812041128 BytesIch habe 3 Charaktere ausgewählt, die größtenteils einzigartig sind (das 0., 2. und 3.), was zwei Sonderfälle hinterlässt: Cer / Curium sind beide "Ciu" und Ruthenium / Rutherfordium sind beide "Rhe". Bei Ciu überprüfe ich, ob das zweite Zeichen des Namens "e" oder "E" ist, und bei "Rhe" überprüfe ich die Länge des Namens.
VAR(name)
gibt die Variable mit diesem Namen zurück. Variablennamen unterscheiden nicht zwischen Groß- und Kleinschreibung.quelle
T-SQL,
900 894676 BytesRückgaben dienen nur der Lesbarkeit. Die zweite Zeile ist eine sehr lange Zeichenfolge.
STRING_SPLIT
wird in SQL 2016 und höher unterstützt.Die Eingabe erfolgt über eine bereits vorhandene Tabelle entnommen t mit varchar Feld e , je unseren IO - Standards . Die Ausgabe wird mit Leerzeichen auf 3 Zeichen aufgefüllt. Die Regeln waren unklar, ob das in Ordnung war. Bei Bedarf kann ich eine hinzufügen
TRIM
.Die Eingabetabelle wird mit einer Tabelle verknüpft, die eine Liste aller Elementsymbole (aufgefüllt mit 3 Zeichen) mit dem kürzesten eindeutigen Präfix für jeden Elementnamen enthält (
X
reicht für Xenon aus , Rutherfordium mussRuther
es jedoch von Ruthenium unterscheiden ).EDIT 1 : 218 Zeichen wurden gespeichert, indem die 44 Einträge aus der Liste entfernt wurden, deren Symbol die ersten beiden Buchstaben ihres Namens sind. Die
ISNULL
Funktion wird verwendet, um festzustellen, ob die erste Abfrage keine Zeile zurückgibt. In diesem Fall wird aus dem Namen des Eingabeelements das Symbol (ordnungsgemäß in Groß- und Kleinschreibung) generiert.quelle