Problem:
Ihre Aufgabe ist es, zu entscheiden, ob in einer Folge von Zahlen jede Zahl mindestens eine der Ziffern der vorangegangenen Zahl enthält.
Beispielsweise sollte Folgendes als wahr zurückgegeben werden:
[1, 12, 203, 0, 30]
^ ^ Contains a 0
^ Contains a 2
^ Contains a 1
Folgendes sollte Falschgeld zurückgeben:
[1, 32, 23, 34]
^ Doesn't contain a 1, therefore false
Ihre Einreichung kann eine Funktion oder ein vollständiges Programm sein.
Eingang:
Die Eingabe kann eine beliebige sinnvolle Sequenz sein. Ein Array von Zahlen, ein Array von Zeichenfolgen, eine begrenzte Zeichenfolge von Zahlen usw.
Die Reihenfolge ist jedoch von Bedeutung. Unabhängig von der Struktur, die Sie als Eingabe akzeptieren, muss die Reihenfolge eindeutig festgelegt sein.
Die Eingabe kann über die Standardeingabe oder als Argument erfolgen.
Sie können annehmen:
Alle Zahlen sind nicht negative ganze Zahlen
Die Eingabe enthält immer mindestens 2 Zahlen
Eingabenummern beginnen nicht mit einer 0
Ausgabe:
Die Ausgabe ist ein Wahrheits- oder Falschwert (wie in Ihrer Sprache definiert), der angibt, ob die oben angegebene Spezifikation erfüllt ist oder nicht.
Wahrheits- / Falschheitswerte müssen zwischen den Tests nicht konsistent sein.
Es kann entweder auf die Standardausgabe ausgegeben oder zurückgegeben werden.
Testfälle:
True cases:
[1, 1, 1, 11, 111, 11, 1]
[12, 23, 34, 45, 56]
[65, 54, 43, 32, 21]
[123, 29, 9, 59, 55, 52, 2017, 2]
[1234567890, 19, 95, 5012, 23]
False cases:
[1, 2, 3, 4, 5, 1, 11] (2 doesn't contain a 1)
[12, 23, 33, 45] (45 doesn't contain a 3)
[98, 87, 76, 11, 12, 23] (11 doesn't contain a 7 or 6)
Das ist Code-Golf, also gewinnt die geringste Anzahl von Bytes.
JavaScript (ES6),
4744 *43 ByteEin Byte dank @Neil gespeichert
Übernimmt die Eingabe als Liste von Zeichenfolgen.
Testschnipsel
Code-Snippet anzeigen
* ( durchgestrichen 44 ist immer noch regulär 44 )
quelle
`[${p}]`
nichta=>a.reduce((l,r)=>`${l}`.match(`[${r}]`)&&r)
(was auch für die numerische Eingabe funktioniert).p&&
wenn du das setztp=1/19
?05AB1E , 10 Bytes
Probieren Sie es online! oder als Testsuite
Erläuterung
quelle
€Sü.å
- Ich wünschte, das würde so funktionieren, wie ich es mir vorgestellt hatte.ü.å
oder€Süå
.CJam ,
181514 Bytes4 Bytes gespart dank Martin Ender
Probieren Sie es online!
Erläuterung
quelle
Haskell,
514835 Bytes-3 Bytes dank @NickHansen! Ich muss wirklich besser mit diesen Monadenoperatoren werden
-4 und -9 Bytes dank @Laikoni bzw. @nimi!
In dieser Version wird die Eingabe als ein Array von Zeichenfolgen interpretiert, so dass dies nicht mehr erforderlich
show
ist. Soweit ich jedoch sehe, funktioniert dies weitgehend wie in der älteren Version:(Ich bin mir ziemlich sicher, dass ich eine anonyme Funktion wie diese einreichen darf, aber ich werde es bei Bedarf beheben.)
Zuerst werden die Zahlen in Strings umgewandelt. Dann erstellt die Monadenmagie
zip=<<tail
eine Funktion, die die Liste mit sich selbst komprimiert und jeden Eintrag mit seinen Nachbarn koppelt. Dannall
ordnet einen Lambda jedes Paar , dass überprüft , ob eine Zeichenfolge enthält keine Zeichen von der anderen und schließlich überprüft , dass sie alle kommenTrue
.Alte Version, die im Prinzip genauso funktioniert:
quelle
and.(zipWith(any.flip elem)=<<tail).map show
["1234567890", "19", "95", "5012", "23"]
um die zu löschen.map show
.Mathematica
62 4735 BytesMit 12 Bytes dank MartinE gespart.
quelle
Ruby,
4948 BytesDie Ausgabe ist
nil
für false und eine "zufällige" Ganzzahl für true.quelle
Java 8,
949087 BytesDie Eingabe ist ein Array von Zeichenfolgen, die die Zahlen darstellen. Beginnend mit der zweiten Folge, führt er einen regulären Ausdruck Vergleich gegen jede vorherige Zeichenfolge zu sehen , ob es irgendwelche seiner Zeichen enthält:
.*[previous string].*
.Golf gespielt:
Ungolfed:
quelle
a->{for(int i=1;i<a.length;)if(!a[i].matches(".*["+a[i++-1]+"].*"))return 0>1;return 1>0;}
( 90 Bytes )a->{int r=1;for(int i=0;++i<a.length;)r*=a[i].matches(".*["+a[i-1]+"].*")?1:0;return r>0;}
a->{int r=1,i=0;for(;++i<a.length;)r*=a[i].matches(".*["+a[i-1]+"].*")?1:0;return r>0;}
Gelee , 6 Bytes
Probieren Sie es online!
Erläuterung
Es ist am offensichtlichsten, hier zu versuchen
2/
, aber das führt eine unäre Funktion auf allen Slices der Größe 2 aus. Führt"Ḋ
effektiv eine binäre Funktion auf allen Paaren benachbarter Elemente aus, was bedeutet, dass wir sief
direkt verwenden können (anstatt sie in eine unäre umwandeln zu müssen) funktionieren alsf/
). Dies führt dazu, dass das letzte Element der Eingabe nicht geändert wird. Glücklicherweise wird jedoch nicht einmal eine Eingabe von 0 zu einer leeren Liste, wenn sie in eine Dezimalzahl konvertiert wirdẠ
.quelle
Python 3 , 48 Bytes
Probieren Sie es online!
quelle
Gelee , 8 Bytes
Probieren Sie es online!
Wie?
quelle
05AB1E , 5 Bytes
Code:
Verwendet die CP-1252- Codierung. Probieren Sie es online! oder Überprüfen Sie alle Testfälle! .
Erläuterung:
quelle
RüÃõå_
war das, was ich mir ausgedacht habe. Es ist mir eine Ehre, Ihrer besten Antwort so nahe gewesen zu sein und meine gelöscht zu haben. Warum brauchst du das aber nichtR
?R
denn? : pPowerShell , 87 Byte
Probieren Sie es online!
In jeder Hinsicht nicht die kürzeste, aber ein etwas anderer Ansatz als die anderen, der die raffinierte
|?{}
Funktionalität demonstriert .Dies nimmt die Eingabe als ein Array von Strings auf
$n
und führt dann eine Schleife von1
oben nach unten durchlength-1
. MitWhere-Object
(the|?{...}
) ziehen wir die Indizes heraus, die für eine bestimmte Bedingung zutreffend sind. Sie können sich das wie eine Kombinationsschleifefor
mit einerif
Klausel vorstellen.Die Klausel hier ist
[char[]]$n[($i=$_)-1]|?{$n[$i]-like"*$_*"}
. Das heißt, wir nehmen den aktuellen Index$_
, setzen ihn auf$i
und subtrahieren ihn1
und verwenden ihn, um ihn zu indizieren$n
(dh wir erhalten das vorherige Element in unserem Eingabearray). Das wird dann alschar
-array geworfen und durch ein anderesWhere-Object
Verfahren geschickt.Die innere Klausel
$n[$i]-like"*$_*"
gibt an, dass die Zeichenkette auf dem aktuellen Index$i
ist-like
das aktuelle Zeichen$_
aus dem vorhergehenden Index. Dadurch werden alle Zeichen ausgegeben, die zwischen den beiden Array-Elementen gemeinsam sind. Daher ist die äußere Klausel nur dann wahr, wenn ein Zeichen gemeinsam ist (da ein leeres Array in PowerShell falsch ist), und der Index wird nur dann ausgewählt, wenn Zeichen gemeinsam sind.Danach sammeln wir alle Indizes bis dass die Kriterien abgestimmt, und verifizieren , dass die
.count
davon-eq
UAL der Länge des Eingangsfeldes. Dieses boolesche Ergebnis verbleibt in der Pipeline, und die Ausgabe ist implizit.quelle
Perl 5 , 31 Bytes
Ein Hafen von Martin Enders schöner Antwort .
30 Byte Code +
-p
Flag.Probieren Sie es online!
quelle
APL (Dyalog APL) , 9 Bytes
Probieren Sie es online!
∧/
sind alle in der Liste von×
die Zeichen≢
der Bilanz von¨
jeder von2∩/
die paarweisen Schnittpunkte von⎕
die Eingabe?quelle
PHP,
6568iterieren Sie über alle Zahlen und entfernen Sie alle Ziffern, die in der vorherigen erschienen sind. Zählen Sie, wie oft es der Zahl selbst entspricht (keine Ziffer entfernt). Wenn mindestens einer gleich war, hatten wir keine Übereinstimmung in einem der Paare.
Ein Fehler mit
trim
insted von wurde behobenstrtr
. Danke an @ JörgHülsermannquelle
["filename",1,11,414]
funktioniert nichttrim
nur für die führenden und nachfolgenden Zeichen. Behoben.a&
anstelle vonnull!==
(-5 Bytes) verwenden.$argv[$i]
, da "Wenn von und unterschiedliche Längen verwendet werden, werden die zusätzlichen Zeichen in der längeren der beiden ignoriert." (aus dem Handbuch)PHP, 75 Bytes
Nimmt Zahlen aus Befehlszeilenargumenten. Ausgänge mit
1
für falsch, mit0
für wahr.Laufen Sie mit
-r
oder testen Sie es online .$b
= eine Zahl, die alle Ziffern enthält$b
aus dem Argument$b
1
0
quelle
PHP, 77 Bytes
quelle
foreach($argv as$k=>$v)$t=$k--?$t*preg_match("#[{$argv[$k]}]#",$v)):1;echo$t;
77 Bytes (ungetestet).$k--
zu--$k
und ein Tropfen) nach , dass Ihr Ansatz funktionieren sollte und Sie müssen ein @ für die Warnung hinzufügen$k--
. Ich habe es speziell verwendet, damit $ k beim ersten Durchlauf immer noch 0 ist. Und Warnungen sind ignorierbar. Das heißt, der Code ist jetzt 76 Bytes, aber noch ungetestet.foreach($argv as$k=>$v)$t=$k--?$t*preg_match("#[{$argv[$k]}]#",$v):1;echo$t;
es funktioniert, wie es sollte. Testen mit$argv = array(1, 12, 123, 3, 34, 45, 5, 5);
Displays1
und Testen mit$argv = array(1, 12, 123, 3, 34, 45, 5, 6);
Displays0
, wie erwartet.MATL , 14 Bytes
Probieren Sie es online!
Vielen Dank an @LuisMendo für das Speichern eines Bytes. Erläuterung:
quelle
1)VG
durch1&)
(und dies vermeidet die Wiederholung der ersten Zahl) ersetzen)
die ausgewählten Werte als erste Ausgabe und dann die verbleibenden Werte als zweite Ausgabe ausClojure, 71 Bytes
Eine anonyme Funktion, die eine Folge von Zahlen akzeptiert. Rückgabe
true
/false
.Ich mag, wie es liest. Es gibt definitiv ein paar Bereiche, die hier verbessert werden können. Meine Funktion, an die übergeben wird,
map
kann nicht einfach geändert werden, sodass das Funktionsmakro nicht erforderlich ist. Dies bedeutet, dass die gesamte Funktion das Makro nicht verwenden kann, das wahrscheinlich einige Bytes hinzugefügt hat. Es wäre auch schön, wenn ich einen besseren Weg finden könnte, die Werte imevery?
Prädikat zu entpacken.quelle
SimpleTemplate, 124 Byte
Wow, das war ein Training!
Dies macht "einfach"
1
einen regulären Ausdruck unter Verwendung des alten Elements, der als wahrer Wert oder nichts anderes angezeigt wird.Ungolfed:
quelle
JavaScript (ES6), 37 Byte
Akzeptiert Eingaben als eine Folge von durch Zeilenumbrüche getrennten Zahlen. Basierend auf der ausgezeichneten Antwort von @ MartinEnder ♦ auf Retina, jedoch wird der gesamte Test in einem einzigen regulären Ausdruck durchgeführt, da er in JavaScript auf diese Weise kürzer ist.
quelle
Pip ,
1210 BytesNimmt Eingaben als eine Reihe von Befehlszeilenargumenten auf. Die Ausgabe ist eine nicht leere Liste für Wahrheiten und eine leere Liste für Falseys. Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
Röda ,
4535 BytesProbieren Sie es online!
Dies ähnelt der Perl 5-Lösung, die ein Port der Retina-Lösung von Martin Ender ist. -10 Bytes dank @Neil.
Hier ist eine andere Lösung (
73 bis72 Bytes):Es ist eine anonyme Funktion, die Zeichenfolgen aus dem Stream abruft und überprüft, ob die aufeinander folgenden Zeichenfolgen dieselben Zeichen enthalten. Erläuterung:
Es könnte möglicherweise mehr Golf gespielt werden ...
quelle
^(\S*(\S)\S* (?=\S*\2))+\S+$
.Bash + Unix-Dienstprogramme,
71 bis69 ByteProbieren Sie es online!
Die Eingabe erfolgt stdin, eine Nummer pro Zeile.
Die Ausgabe erfolgt im Exit-Code: 0 für wahrheitsgemäß, 1 für falsch.
Damit kann wohl mehr golfen werden.
Damit der obige Code funktioniert, darf sich im aktuellen Verzeichnis keine Datei mit einem einstelligen Namen befinden. Wenn dies nicht akzeptabel ist, ersetzen Sie
[\1]
im Programm durch'[\1]'
(für 2 zusätzliche Bytes).Probelauf (letzter Testfall der Challenge):
(1 hier ist falsey.)
Wie es funktioniert:
Ich werde oben auf dem Probelauf demonstrieren.
Der sed-Befehl konvertiert die Eingabe in:
Der Befehl tr konvertiert dies dann in die Zeichenfolge:
Diese Zeichenfolge ist ein Shell-Befehl zum Ausführen der gewünschten Operation. Ich übergebe das an sh und bin fertig.
quelle
Q, 57 Bytes
Hinweis: 0 wird an den Beginn des Eingabearrays innerhalb der Funktion angehängt. Dies geschah, damit der Vergleich des ersten Elements eingetragen erfolgen konnte. Andernfalls wird das letzte Zeichen des ersten Elements zum Vergleich abgerufen. Könnte jedoch eine Typprüfung durchführen, die 7 Bytes über die aktuelle Anzahl hinzufügt.
quelle