Montag Minigolf: Eine Reihe von kurzen Code-Golf- Herausforderungen, die (hoffentlich!) Jeden Montag veröffentlicht werden.
(Sorry, das ist ein bisschen spät.)
Ich bin sicher, die meisten von Ihnen haben von Levenshtein distance gehört , einem Algorithmus zur Berechnung des Abstands zwischen zwei Saiten. Nun, bei dieser Herausforderung geht es darum, einen ähnlichen Algorithmus meiner eigenen Erfindung *, genannt Anagramm-Distanz, zu implementieren . Der wesentliche Unterschied besteht darin , dass die Reihenfolge der Zeichen keine Rolle spielt; Stattdessen werden nur die Zeichen gemessen, die für die eine oder die andere Zeichenfolge eindeutig sind.
Herausforderung
Das Ziel der Herausforderung ist es, ein Programm oder eine Funktion zu schreiben, die zwei Zeichenfolgen enthält und den Anagrammabstand zwischen ihnen zurückgibt. Der wichtigste Weg, dies zu tun, ist die folgende Logik zu verwenden:
- Konvertieren Sie beide Strings in Kleinbuchstaben und (optional) sortieren jeweils alphabetisch Charaktere ein.
- Während die Saiten mindestens ein Gleichheitszeichen enthalten, aus jeder Zeichenfolge, die die erste Instanz dieses Zeichen entfernen.
- Addieren Sie die Längen der verbleibenden Zeichenfolgen und geben Sie das Ergebnis aus.
Beispiel
Wenn die Eingaben sind:
Hello, world!
Code golf!
Dann kleingeschrieben und sortiert, diese werden: (von JS-Standard Art, beachten Sie die führenden Leerzeichen)
!,dehllloorw
!cdefgloo
Entfernen alle Zeichen, die in beiden Strings sind wir am Ende mit:
,hllrw
cfg
Somit wird das anagramm Abstand zwischen den ursprünglichen beiden Strings = 6 + 3 = 9.
Einzelheiten
- Die Zeichenfolgen können in jedem vernünftigen Format aufgenommen werden.
- Die Zeichenfolgen bestehen nur aus druckbarem ASCII.
- Die Zeichenfolgen selbst enthalten keine anderen Leerzeichen als normale Leerzeichen. (Keine Tabulatoren, Zeilenumbrüche usw.)
- Sie müssen nicht genau diesen Algorithmus verwenden, solange die Ergebnisse die gleichen sind.
Testfälle
Eingang 1:
Hello, world!
Code golf!
Ausgang 1:
9
Eingang 2:
12345 This is some text.
.txet emos si sihT 54321
Ausgang 2:
0
Eingang 3:
All unique characters here!
Bdfgjkmopvwxyz?
Ausgang 3:
42
Eingang 4:
This is not exactly like Levenshtein distance,
but you'll notice it is quite similar.
Ausgang 4:
30
Eingang 5:
all lowercase.
ALL UPPERCASE!
Ausgang 5:
8
Wertung
Dies ist Code-Golf , so kürzester gültigen Code in Bytes gewinnt. Tiebreaker geht an Unterwerfung , die zuerst seine letzte Byte - Zählung erreicht. Der Gewinner wird am kommenden Montag, den 12. Oktober, ermittelt. Viel Glück!
Bearbeiten: Herzlichen Glückwunsch an den Gewinner, @isaacg, mit Pyth (wieder) für erstaunliche 12 Bytes!
* Wenn dieser Algorithmus an anderer Stelle verwendet wurde und / oder einen anderen Namen hat, lassen Sie es mich bitte wissen! Ich konnte es mit einer 20-minütigen Suche nicht finden.
Antworten:
Pyth, 12 Bytes
Testsuite
Die fragliche Operation ist äquivalent zu Pyths bagwise Subtraktionsoperator
.-
, der in beide Richtungen angewendet wird. Man könnte es bagwise xor nennen, nehme ich an.Die Lösung ist:
.z
: Eingabe als Liste von 2 Zeichenketten erhalten.rR0
: beide in Kleinbuchstaben umwandeln..p
: Bilden Sie alle Permutationen, dh normal und umgekehrt..-M
:.-
Ordnen Sie den Vorgang jeder Bestellung zu.s
: Verketten Sie die Ergebnisse.l
: Länge drucken.quelle
JavaScript (ES7), 92 Byte
Definiert eine anonyme Funktion.
Führen Sie zum Testen das folgende Snippet aus. Sie können den Code bearbeiten und auf "Testen" klicken, um die Ausgabe mit dem Original zu vergleichen. (Hinterlasse einen Kommentar, wenn du eine Verbesserung findest!) Die Eingabe erfolgt wie
"Hello, world!", "Code golf!"
im Eingabefeld.Vielen Dank an @ETHproductions für die Einsparung von 6 Bytes!
Mehr zur Testsuite
Wie es funktioniert
quelle
.join("")+b
mit.join``+b
ohne Wirkung.CJam,
2319 BytesVersuchen Sie es online in dem CJam Dolmetscher .
Wie es funktioniert
quelle
Rubin, 62
Es muss einen besseren Weg geben.
Edit: 57 Zeichen dank iamnotmaynard, der einen Pfad untersucht, zu dem ich zu faul war.
quelle
sub
kann Saiten nehmen. Könnten Sie nichtc.downcase
anstelle von verwenden/#{Regexp.escape c}/i
?Python,
9087818079 BytesPython <3.5-Version, 80 Byte
Erläuterung
Zählen Sie für jedes Zeichen in a oder b die Anzahl der Vorkommen in jeder Zeichenfolge auf und addieren Sie die (positive) Differenz.
Bearbeiten: Regeln neu lesen, erkannte anonyme Funktionen sind akzeptabel, verbesserte Antwort durch Wegfall von raw_input. Erster Golf, bitte sei sanft!
Dank an sp3000 für die Verbesserung der Neudefinition von str.lower und die Erkenntnis, dass das Drucken unnötig war. Auch Leerzeichen. Ich lerne immernoch.
Mit python> = 3.5 können Sets auf kürzere Weise definiert werden, sodass ein Byte gegenüber früheren Versionen gespeichert werden kann.
quelle
Retina,
40 bis20 Bytes20 Bytes gespart dank Martin Büttner.
Platzieren Sie jede Zeile in einer eigenen Datei und ersetzen Sie die
\n
durch eine wörtliche neue Zeile.quelle
pb , 648 bytes
Nimmt Eingaben mit einem Tabulatorzeichen vor, das die beiden Zeichenfolgen voneinander trennt.
Dieser war ein Trottel. Den Algorithmus tatsächlich zu implementieren, war nicht der schwierige Teil, der relativ einfach zu bewältigen war. Aber ich musste zwei Dinge tun, die in pb schwierig zu tun sind: Groß- und Kleinschreibung und itoa. Ich hatte zufällig ein Programm zum Konvertieren in Kleinbuchstaben, das nur herumlag (selbst 211 Bytes lang), und alles andere wurde ans Ende geheftet, um die Arbeit speziell für diese Herausforderung zu erledigen.
Sie können dieses Programm auf YouTube sehen! Es gibt ein paar Dinge, die Sie beachten sollten, wenn Sie dies tun:
chr(-1)
der Interpreter beim Versuch, zu drucken, abstürzt, wenn er im Überwachungsmodus ausgeführt wird.Hello, world!
undCode golf.
. Dies unterscheidet sich geringfügig von einem der Beispieleingaben in der Challenge. Ich habe es verwendet, weil es kurz war, aber es so modifiziert, dass die richtige Ausgabe 10 statt 9 ist. Dies soll nur zeigen, dass die Zahl korrekt gedruckt wird, auch wenn es sich um mehrere Ziffern handelt, was in pb hart ist.chr(10)
wird nicht richtig gehandhabt macht sie hier weitgehend unbrauchbar. Trotzdem finde ich es fast schön, das zu sehen. Es ist ein riesiges Durcheinander von schrecklichem Code, der anderen schrecklichen Code interpretiert, Teile davon werden vor Ihren Augen zerstört, und doch funktioniert alles gerade genug, um die richtige Antwort zu erhalten. Es sieht so aus, als würde Müll gedruckt, aber wenn Sie mit Kenntnis der Quelle genau hinschauen, können Sie jederzeit erkennen, was er tut und warum. Ich fühle mich wie Cypher, wenn ich dieses Video anschaue:I... I don’t even see the code. All I see is blonde, brunette, red-head.
Ohne weiteres ist hier der Code ungolfed.
quelle
C ++ 199 Bytes
Verwendet ein Array, um die Anzahl der Zeichen in der ersten Zeichenfolge zu speichern, und minimiert die Anzahl in der zweiten Zeichenfolge. Als nächstes wird die Summe der absoluten Werte der Elemente des Arrays ermittelt: Dies ist der Abstand.
Golf gespielt:
Ungolfed:
quelle
PowerShell, 79 Byte
Fast derselbe Code wie meine Antwort auf Anagram Code Golf ... aber ... ich bekomme ein seltsames Verhalten, wenn ich
-eq0
die Antwort einfach abschneide , so dass ich es nötig habe,.ToLower()
außerhalb derparam
Deklaration explizit eine Neufassung vorzunehmen . +Erklärung auch (meistens) aus dieser Antwort kopiert - Nimmt die beiden Zeichenfolgeneingaben auf, macht sie klein und wandelt sie in Zeichen-Arrays um. Die
diff
Funktion (ein Alias fürCompare-Object
) nimmt die beiden Arrays und gibt Elemente zurück, die sich zwischen den beiden unterscheiden. Wir nutzen dies, indem wir die Rückgabe als Array mit umwandeln()
und dann ihre Länge überprüfen.+ Ich habe zum Beispiel falsche Ergebnisse
param([char[]]$a,[char[]]$b)(diff $a $b).length
für denall lowercase.
/ALL UPPERCASE!
-Test erhalten. Wenn ich die Arrays manuell aussortierte (z. B. lief(diff ('a','l','l'...
), funktionierte es einwandfrei, schlug jedoch jedes Mal fehl, wenn sich das Casting mit Groß- / Kleinschreibung überschnitt. Alles, was ich in der Dokumentation lesen kann, besagt, dassdiff
standardmäßig zwischen Groß- und Kleinschreibung unterschieden wird. Also ... Achselzucken ???quelle
Bash,
6867 BytesIch denke das funktioniert. Beachten Sie das nachstehende Leerzeichen in der zweiten Zeile.
Testfälle
quelle
Perl,
5246 Bytes + 3 Schalter (a, F, n) =5549 BytesÜbernimmt die Eingabe von STDIN mit den Eingabezeichenfolgen in ihren eigenen Zeilen, die von EOF abgeschlossen werden.
Schalter:
Code:
quelle
Bash + GNU-Utils, 53
sed
Wandelt in Kleinbuchstaben um und teilt die Zeichenfolge in Zeilen fürsort
. Da wir das zweimal machen müssen, habe ich es in eine Funktion eingefügt.comm3 -3
filtert die relevanten Zeilen heraus undwc -l
erzeugt die Nummer.Die Eingabe erfolgt über
STDIN
; Da zwei Befehle nacheinander gelesen werden, müssen SieEOF
zweimal (Strg-D) zwischen den Zeichenfolgen und am Ende senden . Überschreibt die Datei1
, falls vorhanden.quelle
Matlab, 91 Bytes
Probieren Sie es online aus .
Das funktioniert wie folgt:
quelle
Gelee , 6 Bytes
Probieren Sie es online!
quelle
F #,
134126 BytesErklärung :
a
und vorkommtb
getrennt .Reduzieren Sie jede Gruppe mit dem
-
Operator, was folgende Auswirkungen hat:Summieren Sie den absoluten Wert der Werte aus dem vorherigen Schritt.
quelle
Scala ,
13481 BytesDanke @ ASCII-only für die Arbeit.
Probieren Sie es online!
quelle