Jeśli wyrazisz pewną liczbę całkowitą dodatnią w postaci binarnej bez zer wiodących i zamienisz każdą na 1
a, (
a każdą na 0
a )
, to czy wszystkie nawiasy się zgadzają?
W większości przypadków nie będą. Na przykład 9 ma 1001
postać binarną, która staje się tym ())(
, gdzie pasują tylko dwa pierwsze nawiasy.
Ale czasami będą pasować. Na przykład 44 ma postać 101100
binarną, co oznacza ()(())
, że wszystkie lewe nawiasy mają pasujący prawy nawias.
Napisz program lub funkcję, która przyjmuje dodatnią liczbę całkowitą dziesiętną i wypisuje lub zwraca prawdziwą wartość, jeśli wersja liczby w nawiasach binarnych ma wszystkie pasujące nawiasy. Jeśli nie, wydrukuj lub zwróć wartość fałszowania .
Najkrótszy kod w bajtach wygrywa.
Prawdziwe przykłady poniżej 100:
2, 10, 12, 42, 44, 50, 52, 56
Przykłady Falsy poniżej 100:
1, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 45, 46, 47, 48, 49, 51, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
Odpowiedzi:
TeaScript , 9 bajtów
16 18 20 22 24Zaoszczędź 2 bajty dzięki @ETHproductions
Łał To krótko. Wykorzystuje podejście @ xnor. Spowoduje to użycie funkcji zastępowania rekurencyjnego (
W
), która zastąpi wszystko10
równe()
zeru. Jeśli łańcuch jest pusty, jest zrównoważony.Używanie wersji TeaScript wykonanej po opublikowaniu tego wyzwania może mieć 7 bajtów:
Nie golfił
Wyjaśnienie
źródło
~--c
fałszowanie odbywa się w dokładnie tym samym scenariuszu coc--
.Pyth, 10 bajtów
Wypróbuj ten zestaw testów w kompilatorze Pyth.
Jak to działa
źródło
!u:G`Tk.BQ
. Prawdopodobnie łatwiejsze do zrozumienia.Python2, 87 bajtów
Straszna implementacja, która nadużywa błędów składniowych.
źródło
JavaScript (ES6),
555451 bajtówZapisane bajty dzięki @ Vɪʜᴀɴ i @xsot !
Wyjaśnienie
źródło
f=
. Możesz także użyć use+c
zamiastc|0
do liczby całkowitej. Możesz także użyć,(+c?d++:d--)
który jest jeszcze krótszyf=
? Ponieważ wiele innych odpowiedzi JavaScript na stronie określa ich funkcje.11
, zwraca,true
kiedy powinien powrócićfalse
n=>![...n.toString(d=2)].some(c=>(d+=c*2-1)<2)*d==2
Python 2, 45 bajtów
Funkcja rekurencyjna. Odczytuje cyfry binarne
n
od końca, zachowująci
bieżący poziom zagnieżdżenia parens. Jeśli spadnie poniżej0
, odrzuć. Kiedy osiągniemy początek, sprawdza, czy liczba jest0
.W rzeczywistości zaczynamy od zliczenia,
i=1
aby ułatwić sprawdzenie, czy do niego doszło0
. Jedynym przypadkiem sukcesu terminalu jestn==0
ii==1
, sprawdzone za pomocąn<i<2
. Wymuszamy sprawdzenie, które nastąpin==0
, lub jeślii
do niego wpadnie0
, w którym to przypadku automatycznie się nie powiedzie.feersum zaoszczędziło dwa bajty, restrukturyzując przypadki nierekurencyjne z nierównościami do zwarcia.
źródło
f=lambda n,i=1:n>0<i*f(n/2,i+(-1)**n) or n<i<2
, przynajmniej oszczędza 1.CJam, 11 bajtów
Jest to odrobinę nieczyste: w przypadku liczb, które można zmienić dla rodzica, wydrukuje jeden lub więcej bloków. W przypadku numerów, które nie podlegają ochronie rodzicielskiej, nastąpi awaria bez drukowania niczego do STDOUT. Jeśli wypróbujesz to online w interpretatorze CJam , pamiętaj, że nie rozróżnia on STDOUT i STDERR.
Ponieważ niepuste / puste ciągi znaków w CJam są zgodne z prawdą / fałszem, a wydruk jest zawsze ciągiem, prawdopodobnie jest zgodny z regułami. Przy dodatkowym koszcie 3 kolejnych bajtów, w sumie 14 bajtów , możemy faktycznie pozostawić ciąg stosu prawdy lub fałszu na stosie, który zostanie wydrukowany:
To nadal zawiesza się w przypadku numerów, które nie podlegają zmianie dla rodzica, co jest domyślnie dozwolone .
Testy przebiegają
Jak to działa
CJam, 15 bajtów
Wypróbuj to skrzypce w interpretatorze CJam lub zweryfikuj wszystkie przypadki testowe jednocześnie .
Jak to działa
źródło
Python, 51 bajtów
Anonimowa funkcja. Ocenia wyrażenie, które wygląda
Każda wymiana usuwa wszystkie
10
, które odpowiadają()
. Po dokonaniu wszystkich zamian funkcja zwraca, czy pozostał tylko binarny prefiks0b
.n
Zastępowanie jest więcej niż wystarczające , ponieważk
cyfra-cyfra wymaga co najwyżej kilkuk/2
kroków, a jej wartość jest największa2**k
.źródło
Ruby, 40
Prosta manipulacja ciągiem. Upuszcza „10”, dopóki nie zostanie żaden.
źródło
Poważnie , 17 bajtów
Dane wyjściowe
0
dla false i1
true. Wypróbuj online .Wyjaśnienie:
źródło
Japt, 23 bajty
Japt to skrócona wersja Ja vaScri pt . Interpretator
To przypomina mi, jak daleko Japt musi jeszcze iść w porównaniu do TeaScript. Po przeróbce interpretera w ciągu najbliższych kilku dni chciałbym dodać znaki „skrótowe”, takie jak Vɪʜᴀɴ.
Jak to działa
Krótko po tym wyzwaniu @ Vɪʜᴀɴ (obecnie znany jako @Downgoat) pomógł mi zaimplementować funkcję zastępowania rekurencyjnego, jak
W
w odpowiedzi TeaScript. Oznacza to, że wyzwanie można teraz wykonać w zaledwie 5 bajtach:Przetestuj online!
źródło
Mathematica, 49 bajtów
źródło
1,0
z listy i sprawdź , czy wynikiem jest pusta lista.Oktawa, 48 bajtów
źródło
C ++,
10494 bajtyUruchom z tym kompilatorem , musi określić standardowe wejście przed uruchomieniem.
Wyjaśnienie
n>>=1
.c+=n&1?-1:1
utrzymuje liczbę otwartych nawiasów)
.n&c>=0
zatrzymuje się, gdy pozostają tylko wiodące zera lub nawias zamyka się bardziej niż otwiera.źródło
Haskell,
4946 bajtówPrzykład użycia:
f 13
->False
.Śledzę poziom zagnieżdżenia,
l
podobnie jak wiele innych odpowiedzi. Jednak przypadek „zrównoważony” jest reprezentowany przez1
, tak więc przypadek „bardziej)
niż niż(
”0
.PS: znaleziono dopasowanie poziomu zagnieżdżenia
l+(-1)^n
w odpowiedzi xnora .źródło
signum
wydaje się zbyt skomplikowane, a może po prostu_#0=1<0
?l>0
zamiastl==1
?l==1
jest zrównoważony. Jeślil>1
nawiasy są niezrównoważone.Python 2,
6057565553525049 bajtówDzięki xnor za zaoszczędzenie dwóch bajtów i feersum za doprowadzenie końcowej liczby bajtów do 49!
Wyjaśnienie
Numer wejściowy
n
, jest przetwarzany z jego najmniej znaczącego bitu.i
jest licznikiem, który śledzi liczbę zer i jedynek. Zauważ, że inicjowanie polega1
na zapisaniu bajtu. Pętla zostanie przerwana, zanimn
osiągnie 0, jeśli liczba 1 przekroczy liczbę 0 (i<=0
).Aby nawiasy były zrównoważone, wymagane są dwa warunki:
i==1
)n==0
). Edycja: Zdałem sobie sprawę, że ten warunek nie jest konieczny, ponieważi
musi być nie dodatni, jeślin!=0
tak, poprzedni warunek jest wystarczający.źródło
i
in
są nieujemne, toi==n==0
jesti+n==0
.i
może być ujemny, jeśli pętla zostanie przerwana przedwcześnie.i|n==0
zawsze powinno działać.while i*n
powinien działaćJavaScript ES5,
11887858277 bajtówCiekawa technika moim zdaniem. Pomijając całe mnóstwo, dzięki @ETHproductions i @NotthatCharles
JavaScript ES6,
77575654 bajtów-21 bajtów do produkcji ETH.
źródło
function p(x){x=x.toString(2);r=/10/;while(x.search(r)>=0){x=x.replace(r,"")}return!x}
x=>([...x=x.toString(2)].map(_=>x=x.replace(/10/,"")),!x)
jest przeniesienie pętli while do.map
, ponieważ nigdy nie ma więcej „10” na wejściu niż jego długość.map
.x=>[...x=x.toString(2)].map(_=>x=x.replace(/10/,""))&&!x
IDK, jeśli można go skrócić.D,
209170 bajtówTo robi dokładnie to, co powinno się robić bez żadnych dodatków i korzyści.
źródło
C, 67 bajtów
Prawie część mojego zgłoszenia w Pythonie.
źródło
Prolog, 147 bajtów
Jak to działa
Konwertuje liczbę dziesiętną N na jej reprezentację binarną jako listę (odwróconą). Znaczenie:
Następnie:
Powtarza się nad listą [H | T], zwiększając N, jeśli element głowicy wynosi 0, w przeciwnym razie zmniejszając go.
Jeśli N w którymkolwiek momencie stanie się ujemne lub jeśli N na końcu nie jest równe 0, zwróć fałsz, w przeciwnym razie prawda.
Wcięcie
Czy istnieje zapobieganie cofaniu się i znajdowaniu niebinarnych rozwiązań
testowania b (N, [N])
Wypróbuj tutaj online
Uruchom go z zapytaniem takim jak:
źródło
PowerShell, 106 bajtów
Na pewno nie wygram żadnych konkursów o najkrótszej długości. Ale hej, przynajmniej wygrywa z Javą?
Używa bardzo długiego wywołania .NET
[convert]::ToString($a,2)
do konwersji naszego numeru wejściowego na ciąg reprezentujący cyfry binarne. Następnie przepuszczamy pętlę przez ten ciąg za pomocą1..$b.length|%{..}
. Każda pętla, jeśli nasza cyfra jest1
(oceniana za pomocą%2
zamiast-eq1
zapisywania kilku bajtów), zwiększamy nasz licznik; w przeciwnym razie zmniejszamy to. Jeśli kiedykolwiek osiągniemy wartość ujemną, oznacza to, że do tej pory było więcej)
niż(
napotkane, więc generujemy0
iexit
. Gdy przejdziemy przez pętlę,$c
mamy jedną0
lub jakąś liczbę>0
, więc logicznie się nie!
przyjmujemy, co daje wynik.Ma to dziwactwo wyprowadzania
0
jeśli nawiasy są niedopasowane ponieważ mamy więcej)
, ale wyprowadzanieFalse
jeśli nawiasy są niedopasowane ponieważ mamy więcej(
. Zasadniczo funkcjonalnie równoważne stwierdzenia fałszowania, po prostu interesujące. Jeśli parens wszystkie pasują, wynikiTrue
.źródło
GNU Sed (z rozszerzeniem eval), 27
Sed tak naprawdę nie ma zdefiniowanego pojęcia „prawda” i „falsey”, więc tutaj twierdzę, że pusty ciąg oznacza „prawda”, a wszystkie inne ciągi oznaczają „falsey”.
Jeśli nie jest to do zaakceptowania, możemy wykonać następujące czynności:
GNU Sed (z rozszerzeniem eval), 44
Daje to 1 dla prawdy i 0 w przeciwnym razie.
źródło
𝔼𝕊𝕄𝕚𝕟 (ESMin), 21 znaków / 43 bajty
Try it here (Firefox only).
Zauważ, że używa to zmiennych predefiniowanych do liczb (w szczególności 2 i 0). Istnieją predefiniowane zmienne liczbowe od 0 do 256.
19 znaków / 40 bajtów, niekonkurencyjny
Try it here (Firefox only).
Podjęto decyzję o wdrożeniu niejawnego wyniku ... Jednak poprzednie formularze wyjściowe są nadal obsługiwane, więc masz kilka opcji wyjściowych!
źródło
Java,
129131 bajtówPrawdopodobnie można go skrócić. Wyjaśnienie, które nastąpi. Dzięki Geobits za 4 bajty!
źródło
int k=0;
się zint j=0;
?int k=0,j=0;for(...
wtedy możesz umieścićchar[]
deklarację w inicjalizatorze pętli, aby zapisać średnik.C ++, 61 bajtów
Myślę, że obecna odpowiedź w C ++ jest niepoprawna: zwraca prawdziwą wartość dla wszystkich liczb parzystych, np. 4. Oświadczenie: Nie byłem w stanie użyć wspomnianego kompilatora, więc użyłem g ++ 4.8.4. Problem polega na użyciu binarnego operatora AND zamiast logicznego AND, który jest używany do przerwania wcześniej, gdy liczba zamykających nawiasów przekroczy liczbę otwierających nawiasów. To podejście może działać, jeśli
true
jest reprezentowane jako słowo z prawdziwym wzorem bitowym. W moim systemie i prawdopodobnie w większości innych systemówtrue
jest to równoważne1
; tylko jeden bit jest prawdziwy. Jest takżen/=2
krótszy niżn>>=1
. Oto ulepszona wersja jako funkcja:źródło
𝔼𝕊𝕄𝕚𝕟 (bardzo niekonkurencyjne), 6 znaków / 8 bajtów
Try it here (Firefox only).
Po bardzo, bardzo długim czasie postanowiłem wrócić do tego wyzwania. 𝔼𝕊𝕄𝕚𝕟 stało się o wiele lepsze.
Jest to osobna odpowiedź, ponieważ dwie wersje są prawie całkowicie różne.
Wyjaśnienie
Konwertuje dane wejściowe na binarne, rekurencyjnie zastępuje wystąpienia 10, a następnie sprawdza, czy wynikiem jest pusty ciąg.
źródło
C # 98 bajtów
otwarte na wszelkie sugestie. podoba mi się to wyzwanie, nawet jeśli jest stare
źródło