Napisz program, który pobiera pojedynczy ciąg wiersza, o którym można założyć, że będzie zawierał tylko znaki /\_‾
. (Jest to ukośnik do przodu i do tyłu, podkreślenie i overline . Możesz użyć ~
zamiast overline, jeśli potrzebujesz, ponieważ overline nie jest wygodnym ASCII.)
Na przykład jednym z możliwych danych wejściowych jest:
__/‾‾\/\_/‾
Twój program musi wypisać wartość prawdy lub fałszu w zależności od tego, czy lewa krawędź łańcucha jest „połączona”, że tak powiem, z prawą krawędzią łańcucha za pomocą wierszy znaków. Tak więc, jeśli kerning byłby nieco mniejszy, istniałaby stała czarna (choć perwersyjna) linia od lewej krawędzi do prawej, jak nieprzerwany kawałek sznurka lub sznurka.
Wynik dla powyższego przykładu byłby prawdziwy, ponieważ krawędzie są połączone:
Aby wyjaśnić połączenia:
/
łączy w lewym dolnym i prawym górnym rogu\
łączy w lewym górnym i prawym dolnym rogu_
łączy w lewym dolnym i prawym dolnym rogu‾
(lub~
) łączy się w lewym górnym i prawym górnym rogu
Również:
Nie ma znaczenia, czy krawędzie struny zaczynały się na górze, czy na dole, liczy się tylko to, że łączą się poziomo na całej długości struny.
Możesz założyć, że łańcuch wejściowy jest niepusty i oczywiście tylko jeden wiersz.
Oto kilka przykładów, po których następuje 1 (prawda), jeśli są połączone, lub 0 (fałsz), jeśli nie:
__/‾‾\/\_/‾
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
Najkrótszy kod jest zwycięzcą.
źródło
Odpowiedzi:
Galaretka , 9 bajtów
-1 bajt dzięki @EriktheOutgolfer
Spodziewaj się0 1
~
zamiast‾
. Zwraca lub .Wypróbuj online! , Zestaw testowy Truthy , zestaw testowy Falsy
Za pomocą tej formuły (ale poza tym podobna do 11-bajtowej wersji poniżej):
Przejście jest poprawne, jeśli jest nieparzyste, lub niepoprawne, jeśli jest parzyste.n n
Skomentował
Galaretka ,
14 1211 bajtówObsługuje (i oczekuje)0 1
‾
znak w ciągu wejściowym. Zwraca lub .Wypróbuj online! , Zestaw testowy Truthy , zestaw testowy Falsy
W jaki sposób?
Biorąc pod uwagę dwa kolejne znaki kodów ASCII i , chcemy funkcję, która sprawdza, czy stanowią one ważny przejście.x y
Potrzebujemy operacji nieprzemiennej, ponieważ wynik może ulec zmianie po odwróceniu znaków. Na przykład
_/
jest poprawny, ale/_
nie jest.Używając potęgowania, możliwa formuła 1 to:
jest ważne, jeśli , lub nieprawidłowe, jeśli .n ≤ 1 n > 1
1. Znaleziono przy wyszukiwaniu metodą brute-force w Node.js (przy użyciu BigInts)
Skomentował
źródło
⁽"O
jest taki sam jak9580
.Rubin -n , 30 bajtów
Wypróbuj online!
Zmniejsza wszystkie sekwencje rozdzielające ciąg do dwóch przypadków przy użyciu klas znaków Regex.
źródło
~
zamiast‾
. Nie jestem pewien, czy ma to znaczenie dla tego wyzwania, ponieważ liczba postaci jest taka sama./
s, mimo że są w nawiasach kwadratowych?JavaScript (ES6), 45 bajtów
Naiwny sposób.
Wypróbuj online!
źródło
s=>!/[~\/][\/_]|[_\\][\\~]/.test(s)
. Sprawdza,\/
czy~
kończy się w\/
lub_
. A następnie sprawdza,\\
czy_
kończy się na\\
lub~
.R ,
89 87 8178 bajtów-2 bajty dzięki @Giuseppe
-6 bajtów dzięki @Nick Kennedy
-3 bajtów wymiana
1:length(y)
zseq(a=y)
, gdziea
jest skrótemalong.with
wykorzystuje
\ / _ ~
. Prawdopodobnie nie jest to tak krótkie jak rozwiązanie oparte na wyrażeniach regularnych, ale chciałem zrobić coś innego niż wszyscy inni.Znaki mniejsze niż 93 przełączają stan z góry na dół (lub odwrotnie) i jako takie zachowują się tak
-1
, jak inni nic nie robią i zachowują się tak1
, jak cumprod śledzi stan w odniesieniu do początku. Liczby parzyste są na górze (reprezentowane przez-1
), liczby nieparzyste są na dole (1
). Jeśli ciąg nie zostanie przerwany, śledzony stan pomnożony przez pozycję góra / dół nie powinien się zmienić, zawsze będzie to warunek początkowy (-1
lub1
)Wypróbuj online
źródło
()
około,y%%2
aby zaoszczędzić 2 bajty, ponieważ operatory specjalne%(any)%
mają raczej wysoki priorytet.!
Python , 46 bajtów
Wypróbuj online!
Potwierdza, że każda sąsiadująca para znaków łączy się, sprawdzając, czy pojawiają się one kolejno23=8
__/~~\/\_
. Ten ciąg może być traktowany jako ciąg De_Bruijn_sequence na potrójnych wysokich / niskich pozycjach.Próbowałem innych mniej nieprzyzwoitych metod, aby sprawdzić pary znaków, ale wszystkie one były dłużej twarde kodujące wszystkie legalne pary takie jak ten.
źródło
C (gcc) , 93 bajty
Wypróbuj online!
źródło
w,o,r;k
.Chip
-z
, 17 bajtówWypróbuj online! (TIO obejmuje
-v
ułatwienie zrozumienia wyników.)Oczekuje
_/~\
zestawu. Zwraca albo\x00
(fałsz), albo\x01
(prawda).Strategia dla mojej odpowiedzi wykorzystuje następujące informacje:
A
: Ta pozycja bitowa zdarza się,1
gdy lewa strona symbolu jest niska, a0
gdy jest wysokaF
: Ta pozycja bitowa dzieje się,0
gdy prawa strona symbolu jest niska, a1
gdy jest wysokaC
: Ta pozycja bitowa ma miejsce zawsze będzie1
Korzystając z tych informacji, muszę po prostu sprawdzić, czy
F
każda postać pasujenot A
do następnej.xor
Brama jest wygodnym sposobem do osiągnięcia tego celu.Poniższy kod to robi, ale podaje dane wyjściowe dla każdej pary (plus dodatkową
1
na początku) (7 bajtów):Chcemy zatrzymać się przy pierwszym niepowodzeniu, a także wypisać, czy zatrzymaliśmy się w ciągu, czy na terminatorze zerowym (dodajemy również,
-z
aby dać nam terminator zerowy). Możemy użyćnot C
do wskazania miejsca zatrzymania, a to daje nam ten program (13 bajtów):Ale nadal mamy „wiodące zera” (np.
\_/\
Daje00 00 00 00 01
), więc jest to przekształcane na odpowiedź podaną u góry.źródło
05AB1E ,
29149 bajtówPort odpowiedzi Galaretki @Arnauld , więc upewnij się, że go również głosujesz!
Wprowadź za pomocą
‾
.Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Oryginalna odpowiedź 29 bajtów :
Wprowadź za pomocą
~
zamiast‾
.W mojej głowie zabrzmiało to krócej.
Spróbuję stąd zagrać w golfa.Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Objaśnienie: „
Zapoznaj się z moją wskazówką 05AB1E (sekcje Jak zestawiać duże liczby całkowite? I Jak kompresować listy liczb całkowitych? ), Aby zrozumieć, dlaczego
•6_üê{↕
jest1781179816800959
,ƵΔ
jest180
i•6_üê{↕ƵΔв
jest[52,66,69,100,103,131,179]
.Dodatkowe wyjaśnienie:
Istnieje 16 ( ) możliwych par znaków, które musimy zweryfikować. Jeśli przekonwertujemy każdy znak na jego wartość Unicode i obliczymy różnice, otrzymamy te różnice . Ponieważ skompresowane listy liczb całkowitych w 05AB1E muszą mieć tylko dodatnie liczby całkowite, do każdego dodam 100 . Nieprawidłowe pary i odpowiadające im wartości są wówczas: ; , , , , , , , Dlatego mam sprężonego listy całkowitą w moim kodu zawierającego te wartości. Ponieważ i po prostu polubię i spowoduję (lub po dodaniu 100), najpierw usuwam wszelkie sąsiadujące duplikaty i24
["/_", 52]
["\~", 66]
["_~", 69]
["//", 100]
["\\", 100]
["_\", 103]
["~_", 131]
["~/", 179]
__
~~
//
\\
0
100
~
_
w ciągu wejściowym, przed obliczeniem i weryfikacją różnic par.źródło
Python 3 ,
797063 bajtyZaoszczędź 16 bajtów dzięki Arnauldowi i Jo Kingowi, dzięki!
Wypróbuj online!
Python 3 ,
6760 bajtów z ~ zamiast ‾Wypróbuj online!
źródło
Python 3, 126 bajtów
źródło
Haskell , 70 bajtów
Ten wariant wykorzystuje
~
zamiast overline. Pobiera wszystkie osiem poprawnych par i sprawdza, czy ciąg zawiera tylko te:Wypróbuj online!
Nie golfowany:
źródło
Perl 6 , 32 bajty
Wypróbuj online!
Rozwiązanie wyrażenia regularnego, które po prostu sprawdza, czy ciąg nie zawiera niepoprawnych sekwencji.
Wyjaśnienie:
źródło
R , 43 znaki, 47 bajtów
Jest to ten sam regex, którego używają inne odpowiedzi, ale dostosowany do R.
Wypróbuj online!
I obowiązkowe xkcd .
źródło
~
zamiast‾
do uzyskania 43 bajtów, 43 znaków.Dalej (gforth) ,
10098 bajtówWypróbuj online!
Wyjaśnienie
Przejdź przez ciąg i określ, czy każdy znak zaczyna się na tej samej pozycji (górnej lub dolnej), co przed końcem. Odejmij 1 od licznika, jeśli się nie zgadzają. Na koniec, jeśli zmienił się licznik, łańcuch nie jest łańcuchem.
Pozycja końcowa jest wysoka, jeśli char wynosi
/
(47) lub~
(126). W przeciwnym razie jest niskiPozycja początkowa jest wysoka, jeśli char wynosi
\
(92) lub~
(126). W przeciwnym razie jest niskiObjaśnienie kodu
źródło
Python 3 ,
8078 bajtówNaprawdę nie gram w golfa w Pythonie, ale pomyślałem, że mogę spróbować
Wypróbuj online!
Python 3.8 (wersja wstępna) , 71 bajtów
Chciałem wypróbować nowe
:=
przypisanie wyrażeńWypróbuj online!
źródło
Galaretka ,
13 1211 bajtówMonadyczny link akceptujący listę znaków korzysta
~
z‾
opcji zamiast .Wypróbuj online! Lub zobacz zestaw testowy (... w którym zamówiłem 8 falsey na końcu)
Ta formuła została znaleziona przez ręczne kręcenie się: p (jak te poniżej)
W tym przypadku ja również wszystkie 16 par rzędnych postaci traktowanych jako potęgowanie i szukałem dużego modułu, który zmieści się w trzech bajtach, a następnie w jednym bajcie modulo (1,2,3,4,5,6,7,8 , 9,10,16,256), który podzielił 16, tak że wszystkie dopuszczalne wyniki były równe 1 lub 0 („nieznaczne”), ponieważ wiem, że
Ị
jest on krótszy niż<5
w moim poprzednim rozwiązaniu, w którym wszystkie akceptowalne wyniki były mniejsze niż wszystkie niedopuszczalne.Możliwe sąsiednie postacie i ich wewnętrzne oceny:
Poprzedni @ 12:
Wypróbuj online!
Poprzedni @ 13:
Wypróbuj online!
źródło
Ị
toabs(x)<1
raczej testowanie niżabs(x)≤1
. Daje to znacznie więcej możliwości. :) (Na razie utknąłem też na 11 bajtach.)Ị
przydaje się to bardzo często.perl 5,
2625 bajtówużywając
;
jako separatora separator końcowy można usunąćTIO
26 bajtów
źródło
Excel, 150 bajtów
Usuwa wszelkie nieprawidłowe pary, a następnie zwraca,
true
jeśli spowoduje to powstanie oryginalnego ciągu.źródło
Haskell, 42 bajty
używa tego rozwiązania
~
, a funkcją do wywołania jest h (tzn.h string
daje odpowiedź)Rozwiązanie wykorzystuje funkcję g, która dała listę, zwraca wszystkie krotki sąsiednich wartości na liście.
Następnie używamy g, aby wygenerować listę dozwolonych sąsiadów (in
g"__/~~\\/\\_"
), a także listę wszystkich sąsiednich par na liście wejściowej. Następnie sprawdzamy, czy każda sąsiednia para jest dozwoloną parą.źródło
C (gcc) ,
4136 bajtówWypróbuj online!
-5 wyeliminowano,
&1
zaczynając od pomysłu Petera Cordesa ; zmieniono operatory (pierwszeństwo), aby usunąć nawiasyWykorzystuje
~
. Sprawdza pierwszy i szósty bit reprezentacji binarnej pierwszych dwóch znaków:i rekurencyjnie przechodzi przez ciąg.
(*_ / 32) & 1
jest prawdziwe tylko dla znaków kończących się na wysokim poziomie, podczas gdy*_ & 1
jest prawdziwe tylko dla znaków rozpoczynających się na niskim poziomie.(x&1) ^ (y&1) == (x+y)&1
. XOR to add-without-carry, a carry nie przeszkadza najniższemu bitowi.1
Pochodzi odf(_)
zwracanej wartości, jeśli reszta ciąg był żylasty.źródło
c&32
Dotyczy to znaków, które kończą się na wysokim poziomie, ac&1
dotyczy tylko znaków, które zaczynają się na niskim poziomie).*_ ^ *++_
jest to niezdefiniowane zachowanie:^
nie jest punktem sekwencyjnym, więc nie ma relacji sekwencyjnej gwarantującej, że otrzymają różne postacie. Oczywiście brakuje również znaku areturn
, więc działa tylko wgcc -O0
przypadku, gdy ciało funkcji jest wyrażeniem wyrażenia.&1
dwa razy jest zbędne.(x^y)&1 == (x&1) ^ (y&1)
. Ale biorąc pod uwagę pierwszeństwo operatora C, gdzie&
ma wyższy priorytet niż^
(w przeciwieństwie do operatorów arytmetycznych, gdzie + i - mają ten sam priorytet), musielibyśmy dodać()
2 bajty, aby usunąć&1
2 bajty, ponieważ(x&1) ^ y
nie jest to równoważne. Ale może użycie parens stwarza możliwości innych oszczędności. Na szczęście nie stanowi problemu dla wersji tego kodu maszynowego x86, w której manipulacja bitami jest bardzo kompaktowa ...Bash, 30 bajtów
Dane wejściowe to STDIN. Kod zakończenia to 1, jeśli jest ważny, 0, jeśli jest nieprawidłowy.
źródło
SNOBOL4 (CSNOBOL4) , 58 bajtów
Wypróbuj online!
Nie podaje nic dla prawdy, a dodatnia liczba całkowita (wskazująca pozycję pierwszego przerwania łańcucha) dla fałszu.
źródło
Węgiel drzewny ,
3218 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
źródło
kod maszynowy x86, 13 bajtów.
(Lub 11 bajtów bez obsługi ciągów jednoznakowych, które są trywialnie ciągłe).
Wykorzystuje kontrolę pozycji bitów z odpowiedzi C @ attinat
Ten sam kod maszynowy działa w trybach 16, 32 i 64-bitowych. Źródłem jest NASM dla trybu 64-bitowego.
Można
unsigned char string_connected(int dummy_rdi, const char *s, int dummy_rdx, size_t transitions);
wywoływać z C jak w konwencji wywoływania Systemu x86-64. Niebool
dlatego, że przypadek przejścia = 0 zwraca kod ASCII, a nie 1.RCX = len = strlen(s) - 1
. tzn. liczba granic znaków = przejścia w celu sprawdzenia ciągu o wyraźnej długości.Dla
transitions > 0
zwraca 0 (niedopasowania) lub 1 (podłączony) i pozostawia ZF ustawić odpowiednio. Dlatransitions == 0
zwraca się jeden bajt na sznurkiem (który jest różny od zera, a tym samym również truthy). Gdyby nie ten specjalny przypadek, moglibyśmy porzucić JRCXZ z wczesnego wyjścia. Jest w pętli tylko dlatego, że AL jest tam niezerowe.Logika pozycji bitowej opiera się na obserwacji, że bit 0 kodu ASCII mówi o wysokości początkowej, a bit 5 o wysokości końcowej.
Uprząż testowa (zmodyfikowana z łącza TIO attinat, strzeż się UB punktu sekwencji C w tej funkcji odniesienia C). Wypróbuj online! . Ta funkcja działa we wszystkich 30 przypadkach. (W tym przypadki jednoznakowe, w których zwracana wartość nie pasuje: oba są zgodne z różnymi wartościami niezerowymi w tym przypadku).
źródło
Excel, 79 bajtów
Komórka
A1
jako dane wejścioweźródło
Dart , 94 bajty
Wypróbuj online!
źródło
C ++,
132110 bajtów-22 bajty dzięki tylko ASCII
Używa maski bitowej, aby wiedzieć, czy początek i koniec są w górę, czy w dół
źródło
Siatkówka , 26 bajtów
Wypróbuj online!
Używa
~
raczej niż‾
, ponieważ ułatwiło to pisanie.źródło
Regex, 34 bajty
Nie mogłem znaleźć zasad używania Regex jako języka. Daj mi znać, jeśli będę musiał to zmienić.
Wypróbuj tutaj: https://regex101.com/r/s9kyPm/1/tests
źródło
‾
na~
APL + WIN, 58 bajtów
m ← 2 2⊤ '_ / \ ~' ⍳s ←, ⎕⋄ (1 + ⍴s) = + / ((↑ m [0;]), m [1;]) = m [0;], ¯ 1 ↑ m [1;]
Monituje o wprowadzenie ciągu znaków, początek indeksu 0 i używa ~ dla znaku górnego
Wypróbuj online! Dzięki uprzejmości Dyalog Classic
źródło