Inspiriert von dieser Kommentarkette ...
Ich möchte
enklact
aus dieser Herausforderung herauskommen, aber ich kann nicht ...@ETHproductions to enklact (v): Implementieren einer Nachschlagetabelle unter Verwendung eines Unterabschnitts, der aus eindeutigen Elementen besteht.
Enklacting ist eine sehr nützliche Methode zum Komprimieren einer Nachschlagetabelle. Angenommen, Sie hatten die folgende Liste von Farben:
red
green
blue
yellow
purple
orange
Wenn Sie in der Lage sein möchten, eine Farbe als Eingabe zu verwenden und ihren Index in dieser Liste zurückzugeben, gibt es offensichtlich den direkten Weg:
["red", "green", "blue", "yellow", "purple", "orange"].index(input())
Aber es gibt eine Möglichkeit, wie wir dies mit weniger Bytes erreichen können:
"rgbypo".index(input()[0])
Dies funktioniert, weil der erste (oder 0.) Index jeder Zeichenfolge eindeutig ist. Dieses Beispiel ist offensichtlich, aber manchmal ist es etwas schwieriger. Was wäre, wenn wir eine Nachschlagetabelle für diese Liste erstellen wollten?
Sweet Onion Chicken Teriyaki
Oven Roasted Chicken
Turkey Breast
Italian BMT
Tuna
Black Forest Ham
Meatball Marinara
In diesem Fall können wir das nicht tun:
"SOTITBM".index(input()[0])
weil es zwei verschiedene Eingänge gibt, die mit einem beginnen 'T'
, nämlich "Thunfisch" und "Truthahn". Wir müssen uns einen anderen Index ansehen. Wenn Sie sich den 4. Index jeder Zeichenfolge ansehen, werden Sie feststellen, dass sie alle eindeutig sind. Also können wir das machen ...
"enklact".index(input()[3])
In diesem Fall lautet die "Enklaktionszeichenfolge" "enklact".
Das führt uns zur heutigen Herausforderung ...
Wenn Sie eine Liste von Zeichenfolgen angegeben haben, geben Sie eine gültige Enklaktionszeichenfolge zurück. Mit anderen Worten, wenn Sie eine Liste von Zeichenfolgen haben, geben Sie jede neue Zeichenfolge zurück, bei der jeder Buchstabe eindeutig ist, und die Zeichenfolge wird durch Verbinden des i-ten Buchstabens jeder Zeichenfolge gebildet.
Wenn es keine gültige Enklaction-Zeichenfolge gibt, muss Ihre Übermittlung stattdessen eine leere Zeichenfolge oder einen konsistenten falschen Wert zurückgeben. Wie üblich sind entweder Funktionen oder vollständige Programme zulässig, und die Eingabe- / Ausgabeformate sind (innerhalb des zulässigen Rahmens) zulässig.
Jede Zeichenfolge enthält nur druckbares ASCII, und bei dieser Abfrage wird die Groß- und Kleinschreibung beachtet.
Das ist Code-Golf , also versuchen Sie, das kürzestmögliche Programm in der Sprache Ihrer Wahl zu schreiben!
Testfälle
Input:
Programming
Puzzles
Code
Golf
Output (any one of these):
"ozdl"
"gzef"
Input:
the quick
brown fox
jumped over
lazy dogs
Output:
"tbjl"
"hrua"
"eomz"
" wpy"
"qne "
"if o"
"kxvs"
Note that "u dd" and "coog" are not valid.
Input:
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Output:
""
Input:
AbC
aBc
bbC
Output:
"Aab"
Input:
@#$%^_
Hello_World
How are you?
Output:
"#eo"
"$lw"
"%l "
"^oa"
Input:
a
ab
ac
Output:
""
Antworten:
Python3, 59 Bytes
Gibt einen String mit dem Enklact zurück, ansonsten None
quelle
Python 2 ,
686761 BytesProbieren Sie es online!
Verbesserungen
Wenn die Ausgabe keine Zeichenfolge sein müsste:
Python 3 , 49 Bytes
Probieren Sie es online!
quelle
max(`j`[2::5]for j in[""]+zip(*a)if len(set(j))==len(j))
funktioniert, um ein Byte zu sparen.Retina ,
4332 BytesProbieren Sie es online! Bearbeiten: 11 Bytes dank @MartinEnder gespeichert. Erläuterung:
Wiederholen, während sich die Eingabe ändert ...
... nur wenn eine Zeile leer ist oder zwei Zeilen mit dem gleichen Zeichen beginnen ...
... löscht das erste Zeichen jeder Zeile. Die Wiederholung stoppt daher, wenn entweder a) alle Zeilen mit unterschiedlichen Zeichen beginnen, in welchem Fall die Bedingung fehlschlägt und die Eingabe nicht geändert wird, oder b) mindestens eine Zeile leer wird, in welchem Fall alle Zeichen schließlich gelöscht werden, Ab diesem Zeitpunkt ändert sich der Eingang nicht mehr.
Sammle das erste Zeichen jeder Zeile. (Wenn es keine Lösung gab, hat die obige Schleife alles gelöscht und es gibt nichts zu sammeln.)
quelle
m
eine Gruppe angewendet werden, da die bedingte Stufe die Option anscheinend nicht weitergibt ).Haskell , 71 Bytes
Probieren Sie es online!
BMO sparte 3 Bytes mit
any null x
→elem""x
.Ørjan Johansen hat ein Byte mit
sum[1|b<-y,a==b]<2
→ gespeichertfilter(==a)[y]==[a]
.Erläuterung
Wenn beim Auslösen eines Fehlers (
Prelude.head: empty list
) keine Lösung gefunden wird,|elem""x=""
kann dieser für 61 Byte gelöscht werden .quelle
filter(==a)y==[a]
Ruby , 38 Bytes
Probieren Sie es online!
Vielen Dank an GB für den Hinweis auf einen Fehler.
quelle
Pyth , 6 Bytes
Testsuite.
Die Ausgabe ist standardmäßig eine Singleton-Liste . Die Liste [] (leere Liste, falsch) wird zurückgegeben, falls der String nicht enklaktifiziert werden kann .
Erläuterung
Pyth , 5 Bytes
Dies wäre gültig gewesen, wenn Abstürze als falscher Wert gewertet worden wären.
Testsuite.
quelle
Haskell ,
7674 BytesProbieren Sie es online! Gibt die letzte gültige Suchzeichenfolge oder eine leere Zeichenfolge zurück, wenn keine solche Zeichenfolge vorhanden ist.
7169 BytesWenn das Auslösen einer konsistenten Ausnahme als falscher Wert zulässig ist:
Probieren Sie es online! Löst eine
empty list
Ausnahme aus, wenn keine Zeichenfolge gefunden wird. Anderenfalls wird die erste gültige Zeichenfolge zurückgegeben.-2 Bytes dank Ørjan Johansen
quelle
notElem x
kann auf gekürzt werdenall(/=x)
.Gelee , 7 Bytes
Gibt die Ganzzahl 0 zurück, wenn die Zeichenfolgen nicht enklaktifiziert werden können.
Probieren Sie es online!
Wie es funktioniert
quelle
Perl 5 , 61 Bytes
Probieren Sie es online!
quelle
Stax ,
98 BytesFühren Sie es aus und debuggen Sie es
Erklärung (ausgepackt):
quelle
R , 127 Bytes
Probieren Sie es online!
sapply
Gibt normalerweise a zurück,matrix
wenn allelength(FUN(X[[i]]))
Werte gleich sind, außer wennlength(FUN(X[[i]]))==1
in diesem Fall a zurückgegeben wirdvector
. Um die Matrixoperationen verwenden zu können, müssen wir alsosubstring
eine weitere Operation ausführen, als wir garantieren müssenmatrix
, weshalbx
sich diese auf erstrecktmax(nchar(S)+1)
.Wir filtern dann nach Zeilen, die keine Duplikate und keine leeren Zeichenfolgen enthalten. Da wir nur eine einzige Zeichenfolge zurückgeben können, nehmen wir die erste, mit der Ausnahme, dass wir, wenn keine Zeilen vorhanden sind, die Kriterien erfüllen, einen Fehler auslösen und eine zusätzliche Zeile
""
an das Ende anhängen .Dann drucken wir die
enklact
obied Zeichenfolge oder die leere Zeichenfolge aus.quelle
R ,
11610795 BytesR + pryr
Probieren Sie es online!
Basis R
Probieren Sie es online!
Diese beiden Varianten sparen dank Giuseppe 9 Bytes .
Erläuterung:
Dadurch werden alle Zeichenfolgen im Vektor effektiv
v
auf die kürzeste Länge gekürzt und nachfolgende Indizes durchlaufen. Anschließend wird geprüft, ob Duplikate in ausgewählten Buchstaben enthalten sind. Wenn nicht, werden diese zusammengefügt und mit gedrucktcat
. Wenn alle Indizes doppelte Ergebnisse liefern, wird eine leere Zeichenfolge ausgegeben.Alle in eine anonyme
pryr
Funktion eingeschlossenbreak
, um die Schleife anzuhalten , oder die Basis-R-Funktion, um den Vektor auf Null zu setzen, um die Schleife zu unterbrechen .quelle
R+pryr
oder 107 Bytes in der Basis R golfen werden .Japt, 9 Bytes
Nimmt Eingaben als Array von Zeichenarrays entgegen, gibt ein Array von Zeichen zurück oder
undefined
Probieren Sie es aus (Fügen Sie zu Beginn des Programms eine neue Zeile mit dem Code hinzu
qR mq
, um die Eingabe als durch neue Zeilen getrennte Zeichenfolge zu akzeptieren, damit Sie die mühsame Erstellung der Arrays vermeiden.)Erläuterung
quelle
z æ_¬eZ¬â
05AB1E , 7 Bytes
Probieren Sie es online!
Erläuterung
quelle
Python 3 , 75 Bytes
Funktioniert mit Zeichenlisten anstelle von Zeichenfolgen. Gibt False zurück, wenn keine gültige Enklaktionszeichenfolge vorhanden ist.
Probieren Sie es online!
quelle
f=
enthalten ist.C (gcc) 161 Bytes
Probieren Sie es online!
Jede Zeichenposition wird auf Duplizierung geprüft und übersprungen, wenn ein Duplikat erkannt wird. Dies wird fortgesetzt, bis die kürzeste Zeichenfolge endet. Es ist leider nur ASCII: DBCS / UTF-8-Strings brechen diese Funktion stark!
quelle
Japt , 12 Bytes
Gibt
undefined
für nicht-enklaktische Zeichenfolgen zurück.Probieren Sie es online!
Erläuterung:
quelle
split
s loswerden .Wolfram Language (Mathematica) , 54 Byte
Probieren Sie es online!
Nimmt eine Liste mit Zeichen als Eingabe und gibt eine Liste mit Zeichen zurück. Enthält U + F3C7, entsprechend dem Operator "Transponieren".
Gibt
#1
eine Reihe von ignorierbaren Fehlern zurück und löst sie aus, wenn keine geeignete Zeichenfolge vorhanden ist.Erläuterung:
Füllen Sie die Eingabe so auf, dass jede "Zeichenfolge" (Liste der Zeichen) gleich lang ist. Hiermit wird die Ganzzahl
0
s (nicht die Zeichenfolge"0"
s) angehängt . Dann transponieren.Wählen Sie die Zeichenfolgen aus, die keine Ganzzahlen enthalten
0
und alle eindeutigen Zeichen enthalten.Holen Sie sich den ersten.
quelle
JavaScript (ES6), 66 Byte
Gibt entweder eine Zeichenfolge zurück oder
undefined
wenn keine Lösung vorhanden ist.Probieren Sie es online!
Kommentiert
quelle
Holzkohle ,
2321 Bytes-2 Bytes dank @Neil !
Probieren Sie es online!
quelle
q
a) aufgehört, immer ein String zu sein b) hat StringMap angefangen, an Nicht-Strings zu arbeiten? Wie auch immer, esRange
ist unnötig, Sie sparen 2 Bytes.Schale , 9 Bytes
Probieren Sie es online!
Erläuterung
quelle
←ġLT
overḞz:∞ø
sollte ein Byte gespeichert werden.Netzhaut ,
8156 BytesProbieren Sie es online!
-25 Bytes dank @Neil
Das Transponieren von rechteckigem Text in Retina ist überraschend schwierig.
quelle
Perl 6 , 27 Bytes
Probieren Sie es online!
Nachdem ich gesehen habe, dass die Ruby-Version verbessert wurde, habe ich den Ansatz kopiert und Zeichenlisten anstelle von Zeichenfolgen verwendet. Es gefällt mir nicht
Meine ältere und korrektere Einsendung ist wie folgt:
Perl 6 , 38 Bytes
Teilen, Reißverschluss ziehen, Eindeutigkeit prüfen, beitreten.
Probieren Sie es online!
quelle
C (gcc) ,
121113110 BytesProbieren Sie es online!
Ungolfed
-3 dank ceilingcat
Dies missbraucht die Möglichkeit, einem String-Zeiger in C nur 1 hinzuzufügen, um den 'Schwanz' des Strings zu erhalten. Die wichtigsten Bytesparer sind:
d+=x[y[i++]=*(*_)++]++
die anhängt das erste Zeichen der ersten Zeichenfolge_
zuy
, rückt die erste Folge von_
seinen ersten Zeichen zu entfernen, die fügtx
zu dieser Zeicheneingabe zud
und inkrementiert denx
Eintrittq=d?*x:puts(y)
Dies gibt aus,y
ob der Wertd
ungleich Null ist, während derq
Wert ungleich Null ist, oderq
ob der Wert ungleich Null ist, wenn das erste Element vonx
ungleich Null ist. Null)Bearbeiten: Rasierte Bytes durch Umschalten von while-Schleife auf rekursiven Tail-Aufruf und Entfernen von Klammern aus for-Schleife.
quelle
for(d=i=0;*_;)
stattfor(d=0,i=0;*_;++_)
und*(*_++)++]++;d=d?!*x*f(s)
statt*(*_)++]++;d=d?*x?0:f(s)
Pyth, 13 Bytes
Probieren Sie es hier aus
quelle
Rot , 139 Bytes
Probieren Sie es online!
Erläuterung:
Nimmt die Eingabe als Block (Liste) von Zeichenfolgen. Gibt die Enklaction- Zeichenfolge oder eine
none
andere zurück.quelle
Röda ,
8077 BytesProbieren Sie es online!
-1 Byte dank Kühe quaken
Erläuterung:
Das
try
Schlüsselwort wird verwendet, um Fehler zu verwerfen, die auftreten, wenni
die Länge der kleinsten Zeichenfolge überschrittena
wird oder wenn keine Antworthead
vorliegt und ein Fehler auftritt .quelle
seq
, um ein Byte zu speichernJava 10, 106 Bytes
Gibt einen Fehler aus, anstatt einen leeren String zurückzugeben, wenn keine Lösung gefunden werden kann. Die Eingabe ist eine Zeichenmatrix.
Probieren Sie es online aus.
Erläuterung:
quelle
Clojure, 59 Bytes
Gibt eine Liste mit Listen von Zeichen zurück.
quelle
APL + WIN,
3533 Bytes2 Bytes gespart dank Adám
Fordert zur Eingabe der Textzeilen als Zeichenmatrix auf:
Probieren Sie es online! Mit freundlicher Genehmigung von Dyalog Classic
Erläuterung:
quelle
⊂[1]
→,⌿