W matematyce wykrzyknik !
często oznacza silnię i pojawia się po kłótni.
W programowaniu wykrzyknik !
często oznacza negację i pojawia się przed argumentem.
W przypadku tego wyzwania zastosujemy te operacje tylko do zera i jednego.
Factorial
0! = 1
1! = 1
Negation
!0 = 1
!1 = 0
Weź ciąg zerowy lub więcej !
, następnie 0
lub 1
, a następnie zero lub więcej !
( /!*[01]!*/
).
Na przykład wejściem może być !!!0!!!!
lub !!!1
lub !0!!
lub 0!
lub 1
.
!
„S przed 0
lub 1
są negacji i !
” s po są silni.
Silnia ma wyższy priorytet niż negacja, więc silnie są zawsze stosowane jako pierwsze.
Na przykład !!!0!!!!
naprawdę oznacza !!!(0!!!!)
, albo jeszcze lepiej !(!(!((((0!)!)!)!)))
.
Wyprowadza wynikowe zastosowanie wszystkich silni i negacji. Wyjście będzie zawsze 0
lub 1
.
Przypadki testowe
0 -> 0
1 -> 1
0! -> 1
1! -> 1
!0 -> 1
!1 -> 0
!0! -> 0
!1! -> 0
0!! -> 1
1!! -> 1
!!0 -> 0
!!1 -> 1
!0!! -> 0
!!!1 -> 0
!!!0!!!! -> 0
!!!1!!!! -> 0
Najkrótszy kod w bajtach wygrywa.
Odpowiedzi:
Mathematica,
2517 bajtówPobiera dane z monitu użytkownika. Zakłada środowisko notebooka Mathematica do niejawnego drukowania. Aby uczynić go skryptem wiersza poleceń, zawiń go
Print[...]
lub uczyń z niego funkcję bez argumentów (która następnie pobiera dane z wiersza poleceń), dołącz&
.Mathematica ma oba wymagane operatory (z wymaganym pierwszeństwem), więc możemy po prostu „ewaluować” dane wejściowe (co jest wykonywane automatycznie
Input[]
), ale operator logicznej negacji nie działa na liczbach całkowitych (więc pozostanie nieoceniony). Jeśli wynik!x
pozostanie, zamieniamy go na1-x
.Kilka zabawnych faktów na temat oceny:
!!
, który obliczan*(n-2)*(n-4)*...
, ale stosuje się0
lub1
nadal daje1
, więc nie ma znaczenia, że0!!!!!
tak naprawdę zostanie on przeanalizowany jako((0!!)!!)!
.!0
i jest!1
nieoceniony, wie, że!
jest on odwrotny, więc automatycznie anuluje wszystkie pary prowadzenia!
. PoToExpression
jesteśmy zawsze pozostaje jednym z0
,1
,!0
,!1
.źródło
x=${x/[01]!*/1};echo $(($x))
- nie można opublikować poprawnej odpowiedzi :([Bash] + narzędzia Unix,
2117 bajtówTo musi być zapisane w pliku i uruchomić jako program. Jeśli spróbujesz wprowadzić polecenie bezpośrednio z wiersza polecenia, nie zadziała, ponieważ !! jest rozszerzany z powodu włączenia podstawiania historii w trybie interaktywnym bash. (Alternatywnie możesz wyłączyć podstawianie historii za pomocą
set +H
.)Uruchamianie przypadku testowego:
źródło
mkdir -p 's/.!!'{bunch,of,different,directories}\$/1
? Następnie otrzymasz Pathname Expansion, a Sed będzie próbował czytać katalogi tak, jakby były plikami, zamiast czytać standardowe dane wejściowe i nic nie wyświetli! :)Siatkówka ,
201514 bajtówDzięki Leo za oszczędność 1 bajtu.
Wypróbuj online!
Wyjaśnienie
Zamień się
0!
w1
. Nie obchodzą nas żadne inne końcowe!
, wynikowa liczba jest taka sama, jakbyśmy zastosowali wszystkie silnie.Anuluj pary negacji. Może to również anulować niektóre czynniki, ale to nie ma znaczenia.
Policzyć liczbę meczów tego regex, który jest albo
1
czy0
i daje pożądanego rezultatu.źródło
\d.+
...^
wcześniej!0
Brud ,
14 129 bajtówWypróbuj online!
Wyjaśnienie
Dopasowuje dane wejściowe do wzorca, drukując
1
dla dopasowania i0
bez dopasowania.Chodzi o to, że. Jeśli dane wejściowe zaczynają się od cyfry, część rekurencyjna
\!_
zawsze kończy się niepowodzeniem i\0!
kończy się powodzeniem, chyba że mamy jedną0
. Ich xor się powiedzie, chyba że dane wejściowe są pojedyncze0
. Jeśli dane wejściowe zaczynają się od!
, to\0!
zawsze się powiedzie, i\!_
kończy się powodzeniem, jeśli dopasowanie rekurencyjne się powiedzie. Ich xor odnosi sukces dokładnie wtedy, gdy dopasowanie rekurencyjne kończy się niepowodzeniem, co neguje je.źródło
Brainfuck,
8572 (84) bajtówwrócić liczbowo lub
dla tekstu ASCII. > może być także poprzedzony, aby uniknąć zawijania pamięci.
Wypróbuj online!
Lub w przypadku odpowiedzi tekstowej zamień ostatni wiersz na
źródło
Brainfuck - droga do wielu bajtów (232 bajty)
Wyraźnie niewłaściwy język do wygrywania w golfa kodu. Głównie zauważyłem brak osób korzystających z tego esolangu. Istnieje dobry interpreter bf online lub możesz naprawdę zobaczyć, co program robi za pomocą tego wizualizatora bf .
źródło
Python,
-44-42 bajtyZaoszczędź 2 bajty dzięki Zgarb!
Krok po kroku:
x[-1]!='0'
jeśli
x
kończy się na1
lub!
⇔x
nie kończy się na0
, część silnia musi mieć wartość1
, w przeciwnym razie0
^len(x.rstrip('!'))%2
wykorzystuj własność Xora jako „warunkowo nie”. Warunkiem jest w tym przypadku, jeśli długość początkowego
!
s jest nieparzysta. Jednak.rstrip
nie usuwa liczby z łańcucha, więc obliczona długość jest przesunięta o 1, dlatego warunek jest odwrócony!=
na==
w kroku 1. Zgarb zasugerował użycie operatora porównania różnic zamiast stosowania innej inwersji, oszczędzając 2 bajty.Wypróbuj online!
źródło
!!0
; obecnie powraca1
.lambda x:(x[-1]=='0')^len(x.rstrip('!'))%2
unika dodatkowej inwersji.JavaScript (ES6),
434129 bajtówMetoda niepregexowa (
4131 bajtów)Poniżej znajduje się moje wstępne podejście. Jest to nieco bardziej interesujące, ale
znacznie dłuższe,wciąż nieco dłuższe, nawet po znaczącej optymalizacji przez Neila (10 bajtów zapisanych) .Przypadki testowe
Pokaż fragment kodu
źródło
f=([c,...s])=>1/c?c|s>'':1-f(s)
.Galaretka , 5 bajtów
Wypróbuj online!
Funkcja monadyczna oczekująca łańcucha. Wejścia z wiodącymi
!
s powodują, że1
po drodze drukowane jest STDOUT, więc łącze TIO, które podaję, jest wiązką testową, która drukuje pary wejścia-wyjścia poniżej pierwszego wiersza wyjścia.W jaki sposób?
źródło
05AB1E , 9 bajtów
Kod:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe!
Wyjaśnienie:
źródło
Siatkówka , 13 bajtów
To trochę dziwne podejście, ale jest krótkie i działa.
Z pierwszych dwóch liniach zastąpić końcówką
0
z!1
: z tej wymianie teraz wiemy, że część naszego łańcucha od cyfry roku jest równa 1.W następnych dwóch wierszach usuń pary
!
: podwójna negacja usuwa się, a już uwzględnialiśmy silnię w poprzednim kroku.W ostatnim wierszu dopasuj cyfrę na początku ciągu i zwróć liczbę dopasowań: jeśli wszystkie negacje zostaną wyeliminowane, znajdziemy dopasowanie (i jak powiedzieliśmy wcześniej, wiemy, że jest równe 1), jeśli nadal istnieje zaprzeczenie to nie będzie pasować.
Wypróbuj online!
źródło
1
zamiast\d
.0!
pozostaną niezmienione do ostatniej liniiRubinowy, 12 + 1 =
39241513 bajtówUżywa
-n
flagi. Dzięki @GB za -9 bajtów!źródło
0
lub końca linii!*$
jest krótszy o dwa!Perl , 20 bajtów
19 bajtów kodu +
-p
flaga.Wypróbuj online!
Powraca negacja Perl
undef
lub1
, więc używam0+
do numerify wynikowe0+undef
zyski0
. Poza tym niewiele można powiedzieć o kodzie.źródło
C,
68626153 bajtówWyciągnęliśmy jeszcze kilka bajtów z pewnym nadużyciem
Wypróbuj online!
źródło
int
z funkcji i można zmienić*a==33
się*a<34
.*a%2
jest krótszy niż*a-48
for(;*a<34;a++)
można skrócić dofor(;*a++<34;)
zapisania 1 bajtuPerl 6 ,
322823 bajtówJak to działa
źródło
Haskell , 39 bajtów
Definiuje funkcję
f
, która pobiera ciąg znaków i zwraca znak. Wypróbuj online!Wyjaśnienie
Istnieją trzy przypadki: dane wejściowe zaczynają się od
!
, dane wejściowe mają długość 1 i wszystko inne.źródło
f('!':b)=[1,0]!!f b;f"0"=0;f _=1
.Befunge, 24 bajty
Wypróbuj online!
Zaczyna się od zliczenia
!
znaków odczytanych ze standardowego wejścia. Pierwszym znakiem, który nie jest a,!
będzie albo,0
albo1
, ale w trakcie testowania!
odejmiemy 33, czyli 15 lub 16. Następnie odczytujemy jeszcze jeden znak, który będzie albo!
EOF, i porównaj, jeśli jest to mniej niż 0 (tj. EOF).Biorąc te trzy punkty danych - liczbę wykrzykników ( c ), wartość cyfr, ( d ) i warunek końca pliku ( e ) - możemy obliczyć wynik w następujący sposób:
Pomnożenie wartości cyfry przez warunek końca pliku oznacza, że zostanie zamieniona na zero, jeśli po cyfrze pojawi się a
!
, co da jej tę samą wartość modulo 2 co1
((pamiętaj, że została przekonwertowana na 16). Ale przed zastosowaniem modulo 2 dodajemy początkową liczbę wykrzykników, która skutecznie przełącza wynik modulo 2 tyle razy, ile było ich!
prefiksów. I w końcu nie jesteśmy wynikiem, ponieważ nasze wartości podstawowe są0
i1
są przeciwieństwem tego, czego potrzebujemy.Bardziej szczegółowe spojrzenie na kod:
źródło
Haskell , 27 bajtów
Wypróbuj online!
Każda interlinia
!
uzupełnia wynik dla reszty wyrażenia, wykonana jako1-
. Ciągle przewracamy, aż trafimy na cyfrę. Jeśli reszta jest równa"0"
, wynikiem jest 0. W przeciwnym razie, to a1
lub następuje jeden lub więcej!
, więc wynik to 1.źródło
Rubin,
22 2120 bajtówWyjaśnienie:
(-1 bajt kradnący pomysł @Value Ink)
źródło
Galaretka , 8 bajtów
Wypróbuj online!
Jest to funkcja (łącze monadyczne), która pobiera jeden argument i zwraca wartość zwrotną. (Często zapisuje śmieci na standardowe wyjście jako efekt uboczny, ale nas to nie obchodzi.)
Wyjaśnienie
Po pierwsze, zauważ, że ponieważ dane wejściowe zawsze składają się z pewnej liczby
!
, po której następuje cyfra, a następnie więcej!
, że jeśli usuniemy znak końcowy!
i przyjmiemy długość, otrzymamy jeden plus liczbę wiodących!
w programie. Przyjęcie parzystości zwróci 0, jeśli liczba nieparzysta będzie!
, lub 1, jeśli liczba parzysta będzie!
. Porównywanie do 0 jest funkcją „nie”, podczas gdy porównywanie do 1 jest funkcją tożsamości; w ten sposóbœr”!LḂ=
skutecznie wdraża!
część pytania „traktuj wiodącą jako operatorów NIE”.Jeśli chodzi o drugą połowę, obsługa silni
!
jest operacją silną w Jelly, więc jeśli program nie ma wiodącej funkcji!
, możemy rozwiązać problem bezpośrednio za pomocą prostejeval
(V
). Jeśli program nie posiada wiodącą!
, ci będą interpretowane jako biorąc silni 0 (ewentualnie kilka razy), tworząc wartość zwracaną 1, które będą drukowane na standardowe wyjście i wyrzucić raz cyfrą jest widoczne; dlatego nie mają one wpływu na wartość zwracaną funkcji, która jest moim poddaniem się pytaniu.źródło
Python, 38 bajtów
TryItOnline!
Nienazwana funkcja pobierająca ciąg wejściowy
s
i zwracająca liczbę całkowitą0
lub1
.s[1::2]
to wycinek ciągu wejściowego, który zaczyna się od indeksu 1 i ma rozmiar kroku dwa:'Like this' -> 'ieti'
s[::2]
jest podobny, ale zaczyna się od domyślnego indeksu 0:'Like this' -> 'Lk hs'
Test
(s[1::2]>s[::2])
sprawdza, czy oparty na 0 indeks'0'
lub'1'
jest nieparzysty, tj. Czy musimy uzupełnić.Działa to, ponieważ kolejność ciągów jest sprawdzana leksykograficznie z dowolnym niepustym ciągiem większym niż pusty ciąg, a także z kolejnością ASCII, więc
'1'>'0'>'!'
. Jest to bajt krótszy niż prostszys.index(max(s))%2
.Do
ord(s[-1])%2
sprawdza czy ostatni znak nie jest to'0'
(dla ważnej wejścia) i skutkuje całkowitą (podczas tej samej długości(s[-1]!='0')
zwróci wartość logiczną).To działa, ponieważ ostatni znak wejścia,
s[-1]
, będzie'0'
,'1'
lub'!'
które mają odpowiednio punkty 48, 49 i 33 kodu ASCII, które są 0, 1 i 1 modulo 2.^
Następnie wykonuje bitowym operacji LUB wykluczające na dwóch powyższych wartości powrotu liczbę całkowitą od jednego wejściowego, prawą jest liczbą całkowitą. Jeśli lewy ma wartość Prawda, zwracane jest uzupełnienie prawej, jeśli lewe to Fałsz, zwracane jest prawo, zgodnie z wymaganiami.źródło
Java 7,
1058281 bajtówWypróbuj online!
Stare rozwiązanie wyrażenia regularnego
źródło
c^=1
jest super sprytny. To nieużywany operator, jeśli kiedykolwiek go widziałem.CJam ,
1211 bajtówWypróbuj online! Zestaw testowy (drukuje
1
dla każdego poprawnego przypadku testowego).źródło
Haskell ,
6765 bajtówWypróbuj online!Stosowanie:
f "!!!0!!!!"
Zaoszczędzono dwa bajty dzięki @nimi.
źródło
Brainfuck, 115 bajtów
Wypróbuj online!
Nie golfowany:
źródło
Partia, 62 bajty
Pobiera dane wejściowe na STDIN. Batch właściwie rozumie wiodące
!
s dla tego wyzwania, ale końcowe!
należy zająć się , co wymaga trzech kroków:0!
na1
!!
(jest to bezpieczne dla!!
s przed cyfrą)!
(które do tej pory mogą być tylko po1
)źródło
Formuła IBM / Lotus Notes - 77 bajtów
Nie ma TIO dla Notes Formula, więc zrzut ekranu wszystkich przypadków testowych pokazano poniżej:
Jak to działa
@Eval()
ocenia ciąg jako wyrażenieNajpierw sprawdzamy, czy ciąg wejściowy w polu (wejście)
a
zawiera1
lub0
zabiera wszystkie znaki po lewej stronie, zależnie od tego, który to ciąg!
znaków. Nie obchodzi nas ile.@Eval()
zajmie się tym.Następnie sprawdzamy, czy
!
na końcu łańcucha znajduje się znak . Jeśli istnieje, dołączamy1
do!
ciągu (0!
i1!
oba mają wartość 1 - nie ma znaczenia, ile!
znaków jest na końcu), w przeciwnym razie dołączamy ostatni znak bez zmian, ponieważ nie jest to a,!
a może być albo a1
albo0
.Mamy teraz ciąg zawierający wiodące inwersje oraz liczbę zdefiniowaną przez to, czy są jakieś znaki silni, abyśmy mogli je nakarmić
@Eval()
i uzyskać wyniki powyżej.źródło
sed,
363331 bajtówCzysty sed, bez narzędzi bc / shell. Działa na GNU sed <4.3; 33 bajty na BSD i GNU 4.3+.
Dość proste, jeśli znasz
sed
; skomentował tych, którzy nie są:Test:
źródło
sed
pozwalają na użycie łańcucha zerowego jako nazwy etykiety. Jeśli możesz to tutaj uruchomić, zaoszczędzi to dwa bajty. Właściwie nie jestem pewien, czy etykieta jest nawet potrzebna; chyba że coś przeoczyłem, pierwsza linia jest idempotentna, więc możesz być w stanie wrócić do początku programu zamiast potrzebować etykiety.:
(bardziej jako błąd traktowany jako funkcja), w którym to przypadku zarównot
ib
! polecenia skaczą do pozycji etykiety. Dodatkowo, kod sed musi działać dla co najmniej jednej wersji sed, podobnie jak w innych językach, więc nie musisz tworzyć kodu, który działa również dla BSD.PHP 7.1,
5855543735 bajtówUwaga: używa kodowania IBM-850
Uruchom tak:
Wyjaśnienie
Poprawki
-R
(co$argn
udostępnia)źródło
Fasola , 24 bajty
Hexdump:
Odpowiednik JavaScript:
Przepraszam, że nadepnąłem ci na palce, Arnauld .
Wyjaśnienie:
Zajmuje pierwszą linię wejścia jako niesformatowany smyczkowy
a
i zastępuje dowolną cyfrę a następnie przez jeden lub więcej!
z1
tak, że reszta może byćeval
„d przez JavaScript.Wypróbuj wersję demonstracyjną lub pakiet testowy
źródło