Stellen Sie sich vor, Sie haben ein Array von Ganzzahlen, deren nicht negative Werte Zeiger auf andere Positionen im selben Array sind, nur dass diese Werte Tunnel darstellen. Wenn also der Wert an Position A positiv ist und auf Position B zeigt, dann der Wert an Position B muss ebenfalls positiv sein und auf Position A zeigen, um beide Enden des Tunnels darzustellen. So:
Herausforderung
- Überprüfen Sie bei einem gegebenen Array von Ganzzahlen, ob das Array der Einschränkung entspricht, ein Tunnel-Array zu sein, und geben Sie zwei unterschiedliche, kohärente Werte für truthy und falsey zurück.
- Die Werte im Array liegen für Nicht-Tunnelpositionen unter Null und für Tunnelpositionen über Null. Wenn Ihr Array 1-indiziert ist, repräsentiert der Nullwert eine Nicht-Tunnel-Position. Nicht-Tunnel-Werte müssen nicht überprüft werden.
- Wenn ein positiver Wert in einer Zelle auf sich selbst zeigt, ist das eine Falschmeldung. Wenn A auf B, B auf C und C auf A zeigt, ist das eine Falschmeldung. Wenn ein positiver Wert über die Grenzen des Arrays hinausweist, ist das eine Falschmeldung.
Beispiele
Die folgenden Beispiele sind 0-indiziert:
[-1, -1, -1, 6, -1, -1, 3, -1, -1] Truthy (position 3 points to position 6 and vice versa)
[1, 0] Truthy (position 0 points to position 1 and vice versa)
[0, 1] Falsey (positions 0 and 1 point to themselves)
[4, 2, 1, -1, 0, -1] Truthy
[2, 3, 0, 1] Truthy
[1, 2, 0] Falsey (no circular tunnels allowed)
[-1, 2, -1] Falsey (tunnel without end)
[] Truthy (no tunnels, that's OK)
[-1, -2, -3] Truthy (no tunnels, that's OK)
[1, 0, 3] Falsey (tunnel goes beyond limits)
[1] Falsey (tunnel goes beyond limits)
[1, 0, 3, 7] Falsey (tunnel goes beyond limits)
Das ist Code-Golf , also kann der kürzeste Code für jede Sprache gewinnen!
[0]
?[0,1]
und[0,-1,2]
geben?[0,1]
ist in den Beispielen. „Wenn ein positiver Wert in einer Zelle auf sich selbst, das ist ein Falsey“[2,3,0,1]
Antworten:
R , 47 Bytes
Probieren Sie es online!
Abgerollter Code und Erklärung:
quelle
Python 2 ,
666160 BytesProbieren Sie es online!
quelle
APL (Dyalog Unicode) ,
1924 BytesProbieren Sie es online!
Präfix anonymes Lambda, das 1 für wahr und 0 für falsch zurückgibt. Der TIO-Link enthält eine "hübsche" Version der Ausgabe für die Testfälle.
Grüße an @ngn und @ Adám, weil sie ungefähr eine Milliarde Bytes gespart haben.
Ein zusätzliches Dankeschön an @ngn für die Hilfe beim Beheben der Antwort für einige Testfälle und beim Erstellen eines Zuges.
Die aktualisierten Antwort Anwendungen
⎕IO←0
, die Einstellung der I ndex O Rigin auf 0.Wie:
quelle
0<
→×
Ich denkeJavaScript (ES6), 35 Byte
1 Byte dank @Shaggy gespeichert
Probieren Sie es online!
Kommentiert
quelle
a=>a.every((v,i)=>v<0|v!=i&a[v]==i)
.Python 2 , 65 Bytes
Probieren Sie es online!
quelle
Gelee , 16 Bytes
Probieren Sie es online!
1-indiziert.
quelle
Perl 6 , 36 Bytes
Probieren Sie es online!
Die Grundidee ist zu prüfen, ob die Menge
{ i, a[i], a[a[i]] }
genau zwei unterschiedliche Elemente für jeden Indexi
mit enthälta[i] >= 0
. Wenn ein Element auf sich selbst zeigt, enthält die Menge nur ein einzelnes unterschiedliches Element. Wenn das andere Ende nicht zurück zeigti
, enthält die Menge drei verschiedene Elemente. Wenna[i] < 0
derxx
Faktor Null oder negativ ist, besteht die Menge{ i, a[i] }
ebenfalls aus zwei unterschiedlichen Elementen.quelle
MATL ,
1918 Bytes-1 Byte dank Luis
Probieren Sie es online!, nur für die erste, weil ich nicht weiß, wie ich sie alle machen soll!
Gibt,
0
wenn wahr, eine ganze Zahl ungleich Null, wenn falsch, z. für Testfall 6 gibt4
.Bitte denken Sie daran, dass MATL wie MATLAB 1-indiziert ist, sodass 1 zu den Testfällen hinzugefügt werden muss!
Nie zuvor in einem Esolang Golf gespielt, daher wurden Ratschläge sehr gerne entgegengenommen!
Erklärt:
quelle
05AB1E ,
161514 Bytes-1 Byte dank @Dorian .
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
ε
mit schiebeny
. Also keine Notwendigkeit©
, und jeder®
ersetzt durchy
Japt
-e
, 11 BytesVersuch es
Original (ohne Flag),
14 bis13 ByteProbieren Sie es aus oder führen Sie alle Testfälle aus
quelle
Python
112979686 BytesProbieren Sie es online!
Rückgabe
True
oderFalse
.-10 Bytes dank @Rod und @TFeld.
quelle
K (ngn / k) , 33 Bytes
Probieren Sie es online!
quelle
Haskell , 48 Bytes
Überprüfen Sie alle Testfälle!
Erläuterung
Lassen Sie uns zuerst den Code ein wenig entgolfen. Wie
f =<< g
ist das gleiche\x -> f (g x) x
, ist der Code gleichbedeutend mitDas ist ein bisschen klarer.
Diese Lösung basiert auf einer einfachen Beobachtung: Sei
a
das Eingabearray undu
die Liste der Paare, bei(i, a[i])
deneni
es sich um einen Index handelt. Danna
ist genau dann ein gültiges Array, wenn für jedes(x, y)
inu
mity >= 0
auch das Paar(y, x)
dazugehörtu
.quelle
Java (JDK) , 89 Byte
Probieren Sie es online!
Credits
quelle
r
und aus der Schleife ausbrechen analog hierHolzkohle , 22 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Ausgaben
-
für Wahres und nichts für Falsches. Hinweis: Die Eingabe eines leeren Arrays scheint Charcoal zum Absturz zu bringen, aber Sie können stattdessen ein Leerzeichen eingeben, das nahe genug ist. Erläuterung:quelle
Pascal (FPC) ,
165155153 BytesProbieren Sie es online!
Diesmal funktioniert es, weil die Eingabe ein Array ist. Returns
1
für truthy und0
für Falsey.quelle
Sauber , 60 Bytes
Probieren Sie es online!
Sauber , 142 Bytes
Sehr überkomplizierte Monster-Version:
Probieren Sie es online!
Erklärt:
quelle
Ruby , 44 Bytes
Probieren Sie es online!
quelle
Pyth ,
1716 BytesVersuchen Sie es online hier oder überprüfen alle Testfälle auf einmal hier .
Edit: erkannte, dass das nachgestellte k auch unnötig war
quelle
Groovy , 52 Bytes
Probieren Sie es online!
quelle
Perl 5 , 54 Bytes
Probieren Sie es online!
quelle
C (gcc) 95 Bytes
Probieren Sie es online!
quelle
Mathematica, 42 Bytes
Funktion pur. Nimmt eine 1-indizierte Liste von Zahlen als Eingabe und Rückgabe
True
oderFalse
als Ausgabe. Folgt einfach den Tunneln und stellt sicher, dass0
Maps zu0
keinen 1-Zyklen existieren und alle Zyklen 2-Zyklen sind. (Ich bin mir nicht ganz sicher, ob dies in Randfällen fehlschlägt, aber es gibt die richtigen Ergebnisse für die Beispiele.)quelle
Diese Antwort funktioniert nicht. Hier nur zur Veranschaulichung.
Diese Antwort besteht alle (aktuell) geposteten Testfälle. Es schlägt jedoch bei anderen gültigen Eingaben wie
[1, 2]
oder fehl (löst einen Fehler aus)[1, 0, 3, 7]
.Wie konnte es passieren
[1, 0, 3]
und scheitern[1, 0, 3, 7]
? Nun, es geht durch die Liste, genau wie Sie es erwarten würden. Wenn es ein Elementx
der Liste liesta
, prüft es zuerst, obx
es kleiner als istlen(a)
, und gibt esFalse
, falls dies der Fall ist , sofort zurück . Also kehrt es richtigFalse
weiter[1, 0, 3]
, da3
ist nicht weniger alslen(a)
.Unter der Annahme,
x
dass diese Prüfung bestanden wurde, führt der Code dann einige weitere Prüfungen durch und wird zu einem bestimmten Zeitpunkt ausgewerteta[a[x]]
. Wir haben bereits garantiert, dass die Auswertunga[x]
in Ordnung sein wird ... aber nichta[a[x]]
, was sich in dem Beispiel dahingehend auflöst,a[7]
wann . An diesem Punkt wirft Python ein , anstatt zurückzukehrenx
3
[1, 0, 3, 7]
IndexError
False
.Der Vollständigkeit halber hier die Antwort.
Python 2 , 59 Bytes
Probieren Sie es online!
Ich wollte es tun
x<len(a)and-1<a[x]...
, aber natürlichlen(a)
ist es immer>-1
so, dass das oben Genannte äquivalent ist. Diese Prüfung ist insgesamt 5 gekettet Beziehungen (<
,>
,<
,!=
, und==
), sowie eine separate Prüfung-1<x
imif
Zustand.Python (bequemerweise) schließt verkettete Relationen wie diese kurz. Wenn also zum Beispiel
x>=len(a)
der Scheck zurückkommt,False
bevor er ankommta[x]
(was andernfalls einen auslösen würdeIndexError
).quelle