Dokonując przeglądu kodu, natknąłem się na następujący kod, który testuje status pola wyboru:
if (!isNotUnchecked()) { ... }
Musiałem burzy mózgów przez 30 minut, aby dowiedzieć się, jakiego rzeczywistego stanu pola wyboru oczekuje kod. Napisz do mnie program, który może uprościć te głupie wyrażenia!
Program powinien przyjmować jako dane wejściowe ciąg reprezentujący wyrażenie w celu uproszczenia (na przykład !isNotUnchecked()
:). Program powinien wypisać logicznie równoważne uproszczonego wyrażenia, albo isChecked()
albo !isChecked()
.
Nazwa metody w wyrażeniu wejściowym zawsze zaczyna się od is
, zawiera 0..n Not
, a kończy się na Checked()
lub Unchecked()
. Metoda może być poprzedzona dowolną liczbą !
.
Przykłady
isChecked() => isChecked()
isUnchecked() => !isChecked()
isNotChecked() => !isChecked()
!isNotChecked() => isChecked()
!!!isNotNotUnchecked() => isChecked()
notunischecked
?isnotunchecked
na przykład obsługiwać .Odpowiedzi:
Python , 51 bajtów
Wypróbuj online!
źródło
s[-8:]
'isC'+s[-8:]
bajt jest dłuższy niż'isChecked'
?s[-8:]
jest / robi?hecked()
.Siatkówka , 23 bajty
Wypróbuj online!
Wyjaśnienie
Zamień się
Unchecked
w!Checked
.Zamień wszystkie
Not
s na!
. Teraz mamy coś takiego!!!is!!!!Checked()
.Posortuj wszystkie dopasowania jednego
is
lub drugiego!
. Ponieważ! < is
przesuwa to wszystko na!
początek łańcucha, więc powyższy przykład stałby się!!!!!!!isChecked()
.Usuń pary,
!
aby anulować powtarzające się negowanie.źródło
/// , 26 bajtów
Wypróbuj online!
Port mojej odpowiedzi Retina .
źródło
Python , 43 bajty
Nienazwana funkcja pobierająca ciąg znaków
s
i zwracająca ciąg znaków.Wypróbuj online!
Nie ma potrzeby, aby sprawdzić istnienie znaków kiedy
!
,Not
iUn
wszyscy mają dokładnie jeden dziwny porządkowej (ac
iC
to zarówno nieparzyste), więc po prostu zsumować porządkowych i wykorzystać wartość modulo 2, aby zdecydować, jeśli chcemy!
, czy nie.Poza tym formularz jest taki sam jak odpowiedź xnora , ponieważ nie znalazłem nic lepszego. Jest to również 43:
źródło
JavaScript (ES6),
5150 bajtówDziała poprzez szuka
!
,N
in
znaki, które odwracają sprawdzenie stanu.split
domyślnie zwraca nieparzystą długość tablicy, więc dodajemy,!
kiedysplit
długość jest parzysta. Edycja: Zapisano 1 bajt dzięki @ETHproductions. Alternatywna wersja, również na 50 bajtów:źródło
g
najnowszej edycji./!|N/i
/!|N/
bezi
modyfikatoraSiatkówka , 24 bajty
Wypróbuj online!
źródło
Java 7,
10077 bajtówWyjaśnienie:
Kod testowy:
Wypróbuj tutaj.
Wynik:
źródło
Aceto , 49 bajtów
yadda yadda Krzywa Hilberta.
Przede wszystkim pchamy trzy ważne postacie na stosie:
Następnie ustalamy znak połowu i zaczynamy od przeczytania jednego znaku. Stosujemy
d
go i negujemy, a jeśli wynik tego jest prawdziwy (więc jeśli łańcuch był pusty; więc dane wejściowe zostały zakończone), przeskakujemy do końca:Z pozostałą kopią znaku wejściowego sprawdzamy, czy jest on zawarty w pozostałej części stosu (tj. Czy jest to jeden z!, N, U). Jeśli tak nie jest, zgłaszamy błąd, rzucając nas z powrotem do kreski, w której czytamy inną postać:
W przeciwnym razie ładujemy to, co jest w szybkim magazynie (zasadniczo rejestr, który początkowo jest pustym ciągiem; fałsz), negujemy go i odsyłamy z powrotem do szybkiego przechowywania, a następnie zgłaszamy błąd (wracając do czytania znaków):
Gdy wejście zatrzyma się, jesteśmy wysyłani do końca. Tam odwracamy kierunek, wciskamy wykrzyknik, ładujemy szybkie przechowywanie i negujemy je. Jeśli to prawda (tzn. Mieliśmy dziwną liczbę negacji), drukujemy wykrzyknik, który wypchnęliśmy:
Na koniec wciskamy sznurek na dwie części i drukujemy je (ze względu na oszczędność miejsca):
Następnie program nadal powraca do pierwotnego początku, ale ponieważ żadne z poleceń niczego nie generuje ani nie zachowuje się w pętli, nie ma to znaczenia. W rzeczywistości pierwsze polecenie non-nopping, które osiągamy, powoduje wyjątek, pomijając większość kodu, ponieważ przeskakujemy do znaku catch, co oznacza, że wszystkie Aceto widzi w tej części:
Od
U
teraz nie jest poprzedzone znakiem apostrofu, a zatem nie jest postrzegana jako postać dosłownym, to zostanie zinterpretowane jako polecenie:U
odwraca wszystkie elementy na stosie (obecnie jest to!
,N
,U
, od góry), a'N
i'!
wcisnąć więcej znaków, co oznacza, że kończymy stosem[U, N, !, N, !]
.Uwaga dodatkowa: Jest to pierwszy napisany (częściowo) program Aceto przy pomocy nowego edytora Aceto .
źródło
C,
787068 bajtówDziękuję Christoph!
Wypróbuj online
Wynik:
źródło
c;f(char*s){for(c=1;*s;)c^=!!strchr("!NU",*s++);s="!isChecked()"+c;}
użycie xor do odwróceniac
oszczędza 2 bajty.Perl 5 , 31 bajtów
-2 bajty dzięki @Dom Hastings .
30 bajtów kodu +
-p
flaga.Wypróbuj online!
y/UN!//
zlicza liczbę wystąpieńUn
,Not
i!
. Rezultatem jest tyle!
modulo 2, po których następujeisChecked()
.Kolejna próba, oparta na wyrażeniu regularnym, dla 38 bajtów (Dom Hastings zapisał 1 bajt na tym):
Wypróbuj online!
źródło
c
sUnchecked
./g
flagi). Przypadki testowe wyglądają dla mnie dobrze (patrz link TryItOnline). Więc tak naprawdę nie rozumiem, co masz na myśli ...c
wUnchecked
jest też jednaChecked
, więc kiedy subsitute go skończyć sięCheCked
.Scala ,
3930 bajtówWypróbuj online!
Niestety nie udało mi się wydedukować typu s.
Edycja: przeniesiono deklarację typu do nagłówka (myślę, że jest to dozwolone, jeśli nie, odłożę ją z powrotem).
źródło
Rubinowy , 40 bajtów
Wypróbuj online!
źródło
05AB1E , 22 bajty
Wypróbuj online!
źródło
05AB1E , 16 bajtów
Wypróbuj online!
Wykorzystuje sztuczkę polegającą na sumowaniu porządków z odpowiedzi pytona Jonathana Allana .
Wyjaśnienie
źródło
Japt ,
2423 bajtyWyjaśnienie
Wypróbuj online!
źródło
o
rozróżnia się małe i wielkie litery? Nie wiedziałem, że ...PHP (5,5 - 5,6),
525049 bajtówWypróbuj tutaj .
PHP (> = 5,5),
666561Bez wyrażenia regularnego robi się nieco więcej compex :) Wypróbuj tutaj .
źródło
error_reporting
wartość domyślna toE_ALL&~E_NOTICE&~E_STRICT&~E_DEPRECATED
.$b^=$a
Bardzo fajne znalezisko! Możesz to również zrobić bez tagów PHP o tym samym rozmiarze.for($b=b;$a=$argn[$i++];)$b^=$a;echo$b&"!"|" ","isChecked()";
Galaretka ,
1615 bajtówPełny program, który przyjmuje ciąg znaków jako argument wiersza poleceń i wypisuje wynik
Wypróbuj online!
OSḂ⁾!iṫ-7³ṫṭ⁾sC
lubOSḂ⁾!iṫ-7³ṫ⁾sC;
oba będą również działać na 15.W jaki sposób?
Używa tego samego pomysłu, co moja odpowiedź w języku Python , ale oszczędza bajty przy użyciu innej konstrukcji
!isC
lubisC
niektórych ukrytych wydruków w Galaretce ...poprzednie @ 16 bajtów 9 (przy użyciu konkatenacji i parowania z tym samym pomysłem):
źródło
OS1&”!x;“isC”;ṫ-7$
Perl 6 ,
3531 bajtówSpróbuj
Spróbuj
(wymaga zmiennego ciągu wejściowego, który zostanie okaleczony)
Rozszerzony:
źródło
Sed, 36 bajtów
Ten sam pomysł, jak wszystkie inne bezpośrednie odpowiedzi na podstawienia.
źródło
sed,
3738 bajtów37 + 1 dla
-r
przełącznika:źródło
s/c/C/
spowodowało problemy z odpowiedzią na Perla 5 ...s/c/C/
to, że łapie drugie „c” w przypadkach bez „Un”g
i przesuwającs/!!//
wewnątrz pętli.Mathematica,
826160 bajtówMała poprawka, dodano jeszcze jednego operatora poprawki:
Poprzednio:
Policz wszystkie o, n i !, a następnie mod 2 i umieść tyle! z przodu.
Stara wersja:
źródło
Excel, 90 bajtów
źródło
Pakiet Windows, 120 bajtów
Wcześniej 268 257 253 245 239 221 182 176 169 123 bajtów
Programy zamieniają wszystko
!
naN#
. Ponieważ teraz wszystkie znaki negacji,! (Teraz jestN#
),Not
iUn
zawieraN
, program może zliczyć liczbę wygląduN
i określa, czy!
wymagane jest prowadzenie .Za każdym razem, gdy program zlicza
N
, licznik jest dodawany przez 5. Powodem dodania 5 jest to, że każda naprzemienna wartość przy dodawaniu 5 kończy się na 0 lub 5. Można to wykorzystać do ustalenia, czy wartość jest nieparzysta, czy parzysta, i na początku!
dodaliśmy w razie potrzeby.Ponadto wykorzystywana jest sztuczka xnor z ostatnich ośmiu znaków.
źródło
Galaretka ,
29282521 bajtówWypróbuj online!
-4 bajty dzięki Jonathanowi Allanowi!
-4 bajty dzięki Jonathanowi Allanowi! (przy użyciu skompresowanych ciągów)
źródło
jellyCompress.Compress().string("is").dictionary("Checked").string("()").go()
. (Jeśli korzystasz z instalacji cmd systemu Windows i przełącz się na czcionkę DejaVu Sans Mono i zmień stronę kodową za pomocą poleceniachcp 65001
przed uruchomieniem Pythona, aby znaki były wyświetlane)PHP, 55 bajtów
Wypróbuj online!
PHP, 58 bajtów
zamiast tego
"#[!NU]#"
możesz użyć"#[!N]#i"
Wypróbuj online!
PHP, 68 bajtów
Wersja bez Regex
Wypróbuj online!
źródło
<?=preg_match_all("#[!UN]#",$argn)&1?"!":""?>isChecked()
-2 bajtycount(split())
wpadłem na pomysł: D @Titus fajny pomysł!" !"[$d&1]
zapisuje kolejny bajt, jeśli wiodące białe znaki są prawidłowe.$d^=!trim($c,"UN!")
oszczędza 3 bajty (ponieważ&1
już nie potrzebujesz )."!"[!$d]
Japt , 19 bajtów
Wypróbuj online!
Rozpakowane i jak to działa
Korzystanie ze sztuczki suma znaków z rozwiązania Python Jonathana Allana .
źródło
Pascal (FPC) , 119 bajtów
Wypróbuj online!
Używając metody, którą robi prawie każda odpowiedź, sumując punkty kodowe znaków na wejściu, a następnie sprawdzając parzystość sumy.
źródło