Schreiben Sie ein Programm, das eine einzeilige Zeichenfolge verwendet, von der Sie annehmen können, dass sie nur die Zeichen enthält /\_‾
. (Dies sind Schrägstriche in Vorwärts- und Rückwärtsrichtung, Unterstreichungen und Überstriche . Sie können diese ~
anstelle von Überstrichen verwenden, wenn Sie dies benötigen, da Überstriche kein bequemes ASCII-Format sind.)
Eine mögliche Eingabe ist beispielsweise:
__/‾‾\/\_/‾
Ihr Programm muss einen Wahrheits- oder Falschwert ausgeben, je nachdem, ob der linke Rand des Strings sozusagen über die Zeilen der Zeichen mit dem rechten Rand des Strings "verbunden" ist. Wenn das Kerning also etwas geringer wäre, gäbe es eine durchgehende schwarze (wenn auch verworrene) Linie vom linken Rand bis zum rechten, wie ein ungebrochenes Stück Schnur oder Faden.
Die Ausgabe für das obige Beispiel wäre wahr, da die Kanten verbunden sind:
Um die Verbindungen zu verdeutlichen:
/
verbindet links unten und rechts oben\
verbindet oben links und unten rechts_
Verbindet links unten und rechts unten‾
(oder~
) verbindet oben links und oben rechts
Ebenfalls:
Es ist egal, ob die Kanten der Saite oben oder unten beginnen, es ist nur wichtig, dass sie horizontal über die gesamte Länge der Saite verbunden sind.
Sie können davon ausgehen, dass die Eingabezeichenfolge nicht leer ist, und natürlich nur eine Zeile.
Hier sind einige weitere Beispiele, gefolgt von 1 (wahr), wenn sie verbunden sind, oder 0 (falsch), wenn nicht:
__/‾‾\/\_/‾
1
_
1
\
1
/
1
‾
1
___
1
\/
1
/\/
1
/\/\
1
‾‾‾
1
\\
0
‾‾
1
_‾
0
‾_
0
\_____/
1
\/\\/\\___
0
\/\__/‾‾\
1
______/\_____
1
‾‾‾‾‾‾\\_____
0
‾‾‾‾‾‾\______
1
_____/‾‾‾‾‾
1
\___/‾‾‾\___/‾‾‾
1
\_/_\_
0
\_/\_
1
/\/\/\/\/\/\/\/\/\/\/\/
1
____________________
1
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
1
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾/
0
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾\
1
/\‾/\‾___/\_\/__\/\‾‾
0
Der kürzeste Code ist der Gewinner.
quelle
Antworten:
Gelee , 9 Bytes
-1 Byte dank @EriktheOutgolfer
Erwarten0 oder 1 .
~
statt‾
. GibtProbieren Sie es online! , Wahrheitstestsuite , Falsche Testsuite
Mit dieser Formel (aber ansonsten ähnlich der 11-Byte-Version unten):
Der Übergang ist gültig, wennn ungerade ist, oder ungültig, wenn n ist.
Kommentiert
Jelly ,
14 1211 BytesUnterstützt (und erwartet) das0 oder 1 .
‾
Zeichen in der Eingabezeichenfolge. GibtProbieren Sie es online! , Wahrheitstestsuite , Falsche Testsuite
Wie?
Bei zwei aufeinanderfolgenden Zeichen der ASCII-Codesx und y wollen wir eine Funktion, die prüft, ob sie einen gültigen Übergang bilden.
Wir benötigen eine nicht kommutative Operation, da sich das Ergebnis ändern kann, wenn die Zeichen vertauscht werden. Zum Beispiel
_/
ist gültig, aber/_
nicht.Unter Verwendung der Potenzierung ist eine mögliche Formel 1 :
Der Übergang ist gültig, wennn≤1 , oder ungültig, wenn n>1 .
1. Gefunden mit einer Brute-Force-Suche in Node.js (unter Verwendung von BigInts)
Kommentiert
quelle
⁽"O
ist das Gleiche wie9580
.Ruby -n , 30 Bytes
Probieren Sie es online!
Reduziert alle Zeichenfolgen mit Regex-Zeichenklassen auf zwei Fälle.
quelle
~
anstelle von verwenden‾
. Ich bin mir nicht sicher, ob es für diese Herausforderung wichtig ist, da die Anzahl der Charaktere gleich ist./
s entkommen , obwohl sie in eckigen Klammern stehen?JavaScript (ES6), 45 Byte
Der naive Weg.
Probieren Sie es online!
quelle
s=>!/[~\/][\/_]|[_\\][\\~]/.test(s)
. Es prüft ob\/
oder~
endet in\/
oder_
. Und dann prüft es, ob\\
oder_
endet in\\
oder~
.R ,
89 87 8178 Bytes-2 Bytes dank @Giuseppe
-6 Bytes dank @Nick Kennedy
-3 Bytes ersetzen
1:length(y)
durchseq(a=y)
, wobeia
die Abkürzung für stehtalong.with
verwendet
\ / _ ~
. Dies ist wahrscheinlich nicht so kurz wie eine auf Regex basierende Lösung, aber ich wollte etwas tun, das sich von allen anderen unterscheidet.Die Zeichen unter 93 wechseln den Status von oben nach unten (oder umgekehrt) und verhalten sich als solche,
-1
während die anderen nichts tun und sich als1
solche verhalten . Cumprod verfolgt den Status in Bezug auf den Start. Die geraden Zahlen befinden sich in einem Aufwärtszustand (dargestellt mit-1
), die ungeraden Zahlen in einem Abwärtszustand (1
). Wenn die Zeichenfolge ungebrochen ist, sollte sich der Verfolgungsstatus multipliziert mit der Auf- / Ab-Position nicht ändern. Dies ist immer die Startbedingung (-1
, oder1
).Probieren Sie es online aus
quelle
()
um entferneny%%2
, um 2 Bytes zu sparen, da die speziellen Operatoren%(any)%
eine ziemlich hohe Priorität haben.!
Python , 46 Bytes
Probieren Sie es online!
__/~~\/\_
Ich habe andere weniger einfache Methoden zum Überprüfen von Zeichenpaaren ausprobiert, aber sie waren alle länger als das Hardcodieren aller zulässigen Paare wie dieses.
quelle
C (gcc) 93 Bytes
Probieren Sie es online!
quelle
w,o,r;k
.Chip
-z
, 17 BytesProbieren Sie es online! (TIO enthält
-v
, um das Verständnis der Ausgabe zu erleichtern.)Erwartet das
_/~\
Set. Gibt entweder\x00
(falsch) oder\x01
(wahr) zurück.Die Strategie für meine Antwort verwendet die folgenden Informationen:
A
: Diese Bitposition ist zufällig,1
wenn die linke Seite des Symbols niedrig ist, und0
wenn sie hoch istF
: Diese Bitposition ist zufällig,0
wenn die rechte Seite des Symbols niedrig ist, und1
wenn sie hoch istC
: Diese Bitposition ist zufällig sei immer1
Anhand dieser Informationen muss ich nur überprüfen, ob die
F
Zeichen der einzelnen Zeichen mit denennot A
der nächsten übereinstimmen . Einxor
Tor ist ein bequemer Weg, um dies zu erreichen.Der folgende Code erledigt dies, gibt jedoch für jede Kopplung eine Ausgabe aus (plus eine zusätzliche
1
am Anfang) (7 Bytes):Wir möchten beim ersten Fehler anhalten und auch ausgeben, ob wir in der Zeichenfolge angehalten haben, oder am Nullterminator (wir fügen hinzu
-z
, um uns einen Nullterminator zu geben). Wir könnennot C
angeben, wo wir aufgehört haben, und das gibt uns dieses Programm (13 Bytes):Wir haben aber immer noch "führende Nullen" (zB
\_/\
gibt00 00 00 00 01
), so dass dies in die oben angegebene Antwort umgewandelt wird.quelle
05AB1E ,
29149 BytesAntwort von Port of @Arnauld 's Jelly , also stelle sicher, dass du ihn auch positiv bewertest!
Eingabe mit
‾
.Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Ursprüngliche 29- Byte- Antwort:
Eingabe mit
~
statt‾
.In meinem Kopf klang es kürzer. Ich
werde versuchen, es von hier aus nach unten zu spielen.Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung: "
Sehen Sie diese 05AB1E Spitze von mir (Abschnitte Wie groß ganzen Zahlen comrpess? Und Wie integer Listen komprimieren? ) Zu verstehen , warum
•6_üê{↕
ist1781179816800959
,ƵΔ
ist180
und•6_üê{↕ƵΔв
ist[52,66,69,100,103,131,179]
.Zusätzliche Erklärung:
["/_", 52]
:;["\~", 66]
,["_~", 69]
,["//", 100]
,["\\", 100]
,["_\", 103]
,["~_", 131]
,["~/", 179]
, Weshalb ich die komprimierte integer Liste in meinem Code enthält diese Werte haben.Da
__
und~~
genauso gut gefällt//
und\\
ergibt0
(oder100
nachdem ich 100 addiert habe), entferne ich zuerst alle angrenzenden Duplikate von~
und_
in der Eingabezeichenfolge, bevor die Paardifferenzen berechnet und überprüft werden.quelle
Python 3 ,
797063 BytesDank Arnauld und Jo King 16 Byte gespeichert, danke!
Probieren Sie es online!
Python 3 ,
6760 Bytes mit ~ anstelle von ‾Probieren Sie es online!
quelle
Python 3, 126 Bytes
quelle
Haskell , 70 Bytes
Diese Variante verwendet
~
anstelle von Überstrichen. Es nimmt alle acht gültigen Paare und prüft, ob der String nur diese enthält:Probieren Sie es online!
Ungolfed:
quelle
Perl 6 , 32 Bytes
Probieren Sie es online!
Eine Regex-Lösung, die einfach überprüft, ob die Zeichenfolge keine ungültigen Sequenzen enthält.
Erläuterung:
quelle
R , 43 Zeichen, 47 Bytes
Es ist derselbe reguläre Ausdruck, den die anderen Antworten verwenden, aber für R angepasst.
Probieren Sie es online!
Und obligatorische xkcd .
quelle
~
anstelle von‾
43 Bytes 43 Zeichen verwenden.Viertens (gviertens) ,
100 bis98 BytesProbieren Sie es online!
Erläuterung
Gehen Sie die Zeichenfolge durch und stellen Sie fest, ob jedes Zeichen an derselben Position (oben oder unten) beginnt, an der es endet. Subtrahieren Sie 1 von einem Zähler, wenn sie nicht übereinstimmen. Wenn sich der Zähler am Ende geändert hat, ist die Zeichenfolge keine Zeichenfolge.
Die Endposition ist hoch, wenn char
/
(47) oder~
(126) ist. Ansonsten ist es niedrigDie Startposition ist hoch, wenn char
\
(92) oder~
(126) ist. Ansonsten ist es niedrigCode-Erklärung
quelle
Python 3 ,
8078 BytesIch mache nicht wirklich viele Python-Code-Golfspiele, aber ich dachte, ich könnte es versuchen
Probieren Sie es online!
Python 3.8 (Vorabversion) , 71 Byte
Ich wollte die neue
:=
Ausdruckszuweisung ausprobierenProbieren Sie es online!
quelle
Jelly ,
13 1211 BytesEin monadischer Link, der eine Liste von Zeichen akzeptiert, verwendet die Option
~
anstelle von‾
.Probieren Sie es online! Oder sehen Sie sich eine Testsuite an (... in der ich die 8 Falseys am Ende nachbestellt habe)
Diese Formel wurde gefunden, indem man mit der Hand herumfummelte: p (wie auch die folgenden)
Auch für dieses habe ich alle 16 Paare von Zeichenordnungszahlen als Potenzierung behandelt und nach einem großen Modulo gesucht, das in drei Bytes passt, gefolgt von einem Ein-Byte-Modulo (1,2,3,4,5,6,7,8 , 9,10,16,256), die die 16 so aufteilten, dass alle akzeptablen Ergebnisse entweder 1 oder 0 waren ("unbedeutend"), da ich weiß, dass sie
Ị
kürzer sind als<5
bei meiner vorherigen Lösung, bei der alle akzeptablen Ergebnisse kleiner als waren alle inakzeptabel.Die möglichen Nachbarzeichen und ihre internen Auswertungen:
Vorherige @ 12:
Probieren Sie es online!
Vorherige @ 13:
Probieren Sie es online!
quelle
Ị
Testabs(x)<1
als ein Testabs(x)≤1
. Dies bietet noch einige weitere Möglichkeiten. :) (Ich stecke aber momentan auch bei 11 Bytes fest.)Ị
das sehr oft nützlich ist.Perl 5,
2625 Bytesmit
;
dem endbegrenzer kann der endbegrenzer entfernt werdenTIO
26 Bytes
quelle
Excel, 150 Bytes
Entfernt ungültige Paare und gibt dann zurück,
true
wenn dies zur ursprünglichen Zeichenfolge führt.quelle
Haskell, 42 Bytes
Diese Lösung verwendet
~
, und die Funktion zum Aufrufen ist h (dhh string
gibt die Antwort)Die Lösung verwendet eine Funktion g, die bei einer gegebenen Liste alle Tupel benachbarter Werte in der Liste zurückgibt.
Dann erzeugen wir mit g die Liste der erlaubten Nachbarn (in
g"__/~~\\/\\_"
) und auch die Liste aller benachbarten Paare in der Eingabeliste. Dann prüfen wir, ob jedes benachbarte Paar ein erlaubtes Paar ist.quelle
C (GCC) ,
4136 BytesProbieren Sie es online!
-5 beseitigt aufgrund
&1
einer Idee von Peter Cordes ; Operatoren geändert (Vorrang), um Klammern zu entfernenVerwendet
~
. Überprüft das erste und sechste Bit der Binärdarstellungen der ersten beiden Zeichen:und durchläuft die Zeichenfolge rekursiv.
(*_ / 32) & 1
gilt nur für Zeichen, die hoch enden, während*_ & 1
dies nur für Zeichen gilt, die niedrig beginnen.(x&1) ^ (y&1) == (x+y)&1
. XOR ist Add-without-Carry und Carry stört nicht das niedrigste Bit. Das1
kommt vomf(_)
Rückgabewert, wenn der Rest der Zeichenkette stringy war.quelle
c&32
gilt für Zeichen, die hoch enden, währendc&1
dies nur für Zeichen gilt, die niedrig beginnen.)*_ ^ *++_
es sich um ein undefiniertes Verhalten handelt: Es^
handelt sich nicht um einen Sequenzpunkt, daher gibt es keine Vorher-Sequenz-Beziehung, die garantiert, dass sie unterschiedliche Zeichen erhalten. Natürlich fehlt auch einreturn
, daher funktioniert es nur dort,gcc -O0
wo der Funktionskörper ein Anweisungsausdruck ist.&1
doppelt so groß ist überflüssig.(x^y)&1 == (x&1) ^ (y&1)
. Aber angesichts C Operatorpräzedenz wo&
hat höhere Priorität als^
( im Gegensatz zu arithmetischen Operatoren wobei + und - die gleiche Priorität haben), wir bräuchten hinzufügen()
2 Bytes entfernen&1
2 Bytes, weil(x&1) ^ y
nicht entspricht. Aber vielleicht eröffnet die Verwendung von Parens Möglichkeiten für andere Einsparungen. Zum Glück kein Problem für eine x86-Maschinencode-Version, bei der die Bit-Manipulation sehr kompakt ist ...Bash, 30 Bytes
Die Eingabe ist STDIN. Der Beendigungscode ist 1, wenn er gültig ist, und 0, wenn er ungültig ist.
quelle
SNOBOL4 (CSNOBOL4) , 58 Bytes
Probieren Sie es online!
Gibt nichts für truthy und eine positive Ganzzahl (die die Position des ersten Bruchs in der Zeichenfolge angibt) für falsy aus.
quelle
Kohle ,
3218 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
quelle
x86-Maschinencode, 13 Byte.
(Oder 11 Bytes, ohne einzelne Zeichenfolgen zu verarbeiten, die trivial stringy sind.)
Verwendet die Bitpositionsprüfung aus der C-Antwort von @ attinat
Der gleiche Maschinencode funktioniert im 16-, 32- und 64-Bit-Modus. Die Quelle ist NASM für den 64-Bit-Modus.
Aufrufbar von C wie
unsigned char string_connected(int dummy_rdi, const char *s, int dummy_rdx, size_t transitions);
bei der x86-64-System-V-Aufrufkonvention. Nicht,bool
weil die Übergänge = 0 einen ASCII-Code zurückgeben, nicht 1.RCX = len = strlen(s) - 1
. dh die Anzahl der Zeichengrenzen = Übergänge zum Einchecken der Zeichenfolge mit expliziter Länge.Für
transitions > 0
gibt 0 (nicht übereinstimmend) oder 1 (verbunden) zurück und lässt ZF entsprechend gesetzt. Fortransitions == 0
gibt das einzelne Byte der Zeichenfolge zurück (das nicht Null ist und daher auch wahr ist). Wenn dies nicht der Fall wäre, könnten wir den JRCXZ-Early-Exit fallen lassen. Es ist nur innerhalb der Schleife, weil AL dort ungleich Null ist.Die Bitpositionslogik basiert auf der Beobachtung, dass Bit 0 des ASCII-Codes die Starthöhe und Bit 5 die Endhöhe angibt.
Testkabelbaum (modifiziert von attinats TIO-Link, achten Sie auf den C-Sequenzpunkt UB in dieser C-Referenzfunktion). Probieren Sie es online! . Diese Funktion ist für alle 30 Fälle korrekt. (Einschließlich der Einzelzeichenfälle, in denen der Rückgabewert nicht übereinstimmt: In diesem Fall sind beide mit unterschiedlichen Werten ungleich Null wahr.)
quelle
Excel, 79 Bytes
Zelle
A1
als Eingabequelle
Dart , 94 Bytes
Probieren Sie es online!
quelle
C ++,
132110 Bytes-22 Bytes nur dank ASCII
Verwendet eine Bitmaske, um festzustellen, ob Anfang und Ende nach oben oder unten zeigen
quelle
Netzhaut , 26 Bytes
Probieren Sie es online!
Verwendet
~
eher als‾
, weil dies das Tippen einfacher machte.quelle
Regex, 34 Bytes
Ich konnte keine Regeln für die Verwendung von Regex als Sprache finden. Bitte lassen Sie mich wissen, wenn ich dies anpassen muss.
Versuchen Sie es hier: https://regex101.com/r/s9kyPm/1/tests
quelle
‾
zu~
APL + WIN, 58 Byte
m ← 2 2⊤ '_ / \ ~' s ←, ⎕⋄ (1 + ⍴s) = + / ((↑ m [0;]), m [1;]) = m [0;], 1 ↑ m [1;]
Fordert zur Eingabe eines Strings mit dem Indexursprung 0 auf und verwendet ~ für das obere Zeichen
Probieren Sie es online! Mit freundlicher Genehmigung von Dyalog Classic
quelle