(Uwaga: jest to spin-off mojego poprzedniego wyzwania Find the Swirling Words! )
Definicja słowa nieskończoności :
- Jeśli połączysz za pomocą krzywych wszystkie znaki Słowa Nieskończoności z alfabetu (AZ), otrzymasz symbol nieskończoności ∞ jak na poniższych schematach.
- Wszystkie połączenia parzyste muszą być wyłączone , wszystkie połączenia nieparzyste muszą być uruchomione .
- Możesz zignorować wielkie / małe litery lub rozważyć / przekonwertować wszystkie na wielkie lub wszystkie na małe.
- Słowa wejściowe to tylko znaki z zakresu alfabetu AZ, bez spacji, interpunkcji i symboli.
- Każde słowo musi mieć dokładnie 5 znaków. Słowa> 5 lub <5 są nieprawidłowe.
- Jeśli słowo ma dwa kolejne znaki, jest ono niepoprawne, na przykład „POWODZIE” lub „KRÓLOWA”.
- Wszystkie Słowa Nieskończoności zaczynają się i kończą tą samą postacią.
Oto kilka przykładów:
Zadanie:
Napisz pełny program lub funkcję, która pobierze słowo ze standardowego wejścia i wyświetli, czy jest to Słowo Nieskończoności, czy nie. Dane wyjściowe mogą mieć wartość true / false, 1/0, 1 / Null itp.
Przypadki testowe:
Infinity Words:
ALPHA, EAGLE, HARSH, NINON, PINUP, RULER, THEFT, WIDOW
NOT Infinity Words:
CUBIC, ERASE, FLUFF, LABEL, MODEM, RADAR, RIVER, SWISS, TRUST,
KNEES, QUEEN, GROOVE, ONLY, CHARACTER, OFF, IT, ORTHO
Zasady:
- Najkrótszy kod wygrywa.
Opcjonalne zadanie:
Znajdź, jako listę, tyle słów nieskończoności w słowniku angielskim. Możesz wziąć przykładowo pełną listę angielskich słów tutaj .
Odpowiedzi:
Galaretka ,
43 41 40 25 24 23 22 21 1413 bajtów-7 bajtów dzięki fireflame241 (
0ị=1ị$
->=ṚḢ
i użycieIIA⁼2,2
do testowania 4 obrotów)-1 Dzięki Kevin Cruijssen (użycie wcześniej niedostępnego nilada,
Ø2
który daje[2,2]
)TryItOnline
Lub wszystkie przypadki testowe (plus „ZASADY”)
W jaki sposób?
Słowo nieskończoności ma:
Wszystkie oprócz (1) i (równoważnie) (4) można sprowadzać do warunku, że znaki delta alfabetu są pewną rotacją
[1,1,-1,-1]
(gdzie znakiem0
jest0
)fireflame241 zauważył, że jest to równoważne z deltami znaków delty alfabetu, w
[[2,2],[2,-2],[-2,2],[-2,-2]]
których mogą być testowane przy wartościach bezwzględnych równych[2,2]
!W jaki sposób?
źródło
II
do sprawdzenia równości z obrotem 1,1, -1, -1.Java 8,
23119318512210378 bajtówWypróbuj tutaj.
-38 bajtów dzięki @ dpa97 za przypomnienie, żebym użył
char[]
zamiastString
.-63 bajty dzięki formule pochodnej @KarlNapf .
-25 bajtów poprzez konwersję z Java 7 na Java 8 (i teraz zwraca wartość logiczną zamiast liczby całkowitej).
193 bajty odpowiedzi:
Wyjaśnienie:
false
false
true
jeśli jest zgodny z którymkolwiek z nich (ifalse
inaczej):1<2<3>4>5
(tj.ALPHA
)1>2<3<4>5
(to znaczyEAGLE
,HARSH
,NINON
,PINUP
)1<2>3>4<5
(tj.RULER
)1>2>3<4<5
(to znaczyTHEFT
,WIDOW
)Te cztery reguły można uprościć
1*3<0 and 2*4<0
(dzięki odpowiedzi @KarlNapf w Python 2 ).źródło
char[]
jako dane wejściowe zamiastString
. -38 bajtów dzięki tobie.z,x
iw,y
muszą mieć naprzemienny znak, więc wystarczy sprawdzićz*x<0
iw*y<0
JavaScript (ES6),
918987 bajtówZaoszczędzono 2 bajty dzięki Ismaelowi Miguelowi
Jak to działa
Budujemy 4-bitową maskę bitową
k
reprezentującą 4 przejścia między 5 znakami ciągu:NaN
słowo zostało odrzucone (w celu spełnienia zasady nr 6)Prawidłowe maski bitowe to te, które mają dokładnie dwa kolejne
1
przejścia (pierwszy i ostatni bit są również uważane za kolejne ):Innymi słowy, są to kombinacje, które są:
k?
: większa niż 0!(k%3)
: przystający do 0 modulo 3Pozostałe warunki to:
!s[5]
: nie ma więcej niż 5 znakóws[0]==s[4]
: 1. i 5. znak są identyczneUwaga : Nie sprawdzamy wyraźnie,
k != 15
ponieważ każde słowo następujące po takim wzorze zostanie odrzucone przez ten ostatni warunek.Przypadki testowe
Pokaż fragment kodu
Początkowa wersja
Dla przypomnienia, moja początkowa wersja miała 63 bajty. Pomyślnie przechodzi wszystkie przypadki testowe, ale nie wykrywa kolejnych identycznych znaków.
Poniżej znajduje się 53-bajtowa wersja sugerowana przez Neila w komentarzach, która działa (i kończy się niepowodzeniem) równie dobrze:
Edycja: Zobacz odpowiedź Neila na poprawioną / ukończoną wersję powyższego kodu.
źródło
0000
jest również zgodny z 0 modulo 3, ale znowu nie możesz mieć tej samej pierwszej i ostatniej litery, więc, tak jak 15, nie musisz jawnie go testować.!((a>b)-(b>c)+(c>d)-(d>e))
?p<c?0:NaN
można zapisać jako0/(p<c)
, co oszczędza 2 bajty.k?
testu ze względu na możliweNaN
.) Jeśli chodzi o twoją alternatywną wersję: to powinno rzeczywiście działać.JavaScript (ES6), 78 bajtów
Na podstawie niepoprawnego kodu @ Arnauld, ale grał w golfa i poprawił. Działa, sprawdzając najpierw, czy pierwszy znak jest taki sam jak piąty (gwarantując w ten sposób 5 znaków) i czy długość łańcucha nie przekracza 5. Po sprawdzeniu kolejnych duplikatów znaków pozostaje sprawdzenie falistości łańcucha, który powinien mieć jeden pik i jedną dolną dwie litery od siebie.
Edycja: Alternatywne 78-bajtowe rozwiązanie oparte na odpowiedzi @ KarlNapf:
źródło
Kod wyjścia Python 2, 56 bajtów
Dane wyjściowe za pośrednictwem kodu wyjścia: Błąd dla False i pomyślne uruchomienie dla True.
Pobiera ciąg znaków
s
ze znakamiabcde
, obraca gobcdea
, dokonuje elementarnego porównania odpowiednich znaków i przypisuje je do pięciu zmiennychv,w,x,y,z
. Zła długość powoduje błąd.Wszystkie słowa nieskończoności mają
które można sprawdzić łącznie jako
v*x+w*y|z == -2
. Wv*x+w*y|z>-2>_
takim przypadku zwarcie w łańcuchu porównawczym powoduje zwarcie, a w przeciwnym razie przechodzi do oceny,-2>_
która daje błąd nazwy.źródło
Python 2,
1108760 bajtówOszczędność 1 bajtu dzięki Neilowi
Wymaga danych wejściowych ujętych w cudzysłów, np
'KNEES'
True
jeśli jest to słowo nieskończoności,False
jeśli nie i ma długość 5 i wyświetla komunikat o błędzie, jeśli jest niepoprawnyZainspirowany XNOR „s odpowiedź za pomocą
map(cmp...
poprzednie rozwiązanie:
Korzystanie ze zoptymalizowanej logiki Kevina Cruijssena
źródło
a*c+b*d+2==0==e
?a*c+b*d|e
jest jeszcze krótszy.<-1
praca może, ponieważ oba-2|1
i-2|-1
równe-1
.PHP, 102 bajtów
źródło
Python 2, 71 bajtów
Pobiera ciąg znaków
s
ze znakamiabcde
, obraca gobcdea
i dokonuje elementarnego porównania odpowiednich znaków.Wynikiem jest lista
-1, 0, 1
. Następnie sprawdza, czy wynik jest jedną z prawidłowych sekwencji wzlotów i upadków:wygenerowane z szablonu za
[m,n,-m,-n,0]
pomocąm,n=±1
. Ostatnie0
sprawdzenie, czy pierwsza i ostatnia litera były równe, a długość zapewnia, że łańcuch wejściowy miał długość 5.Alternatywa 71. Sprawdza warunki porównań, zapewniając odpowiednią długość.
źródło
R, 144 bajty
Odpowiedź opiera się na logice @Jonathan Allan. Prawdopodobnie można go grać w golfa.
Przypadki testowe skrzypiec R (przykład wektorowy, ale ta sama logika)
źródło
length(s)==5
można zastąpićs[1]==tail(s,1)
zs[1]==s[5]
. Jednobajtowa krótsza metoda sprawdzania długości tois.na(s[6])
. Razem te dwie zmiany powracająTRUE
nas
długość 5 dokładnie iFALSE
inaczej, jakTRUE&NA
jest,NA
aleFALSE&NA
jestFALSE
. Możesz także zapisać kilka bajtów, zastępując!sum(sign(d))&any(rle(sign(d))$l>1)
je!sum(a<-sign(d))&any(rle(a)$l>1)
.GNU Prolog, 47 bajtów
Definiuje predykat, który ulega awarii; połączenie rekurencyjne powinno być traktowane jak rozmowa. Najwyraźniej optymalizator GNU Prolog nie jest zbyt dobry.) Osiągnięcie sukcesu to odpowiednik prawdy w Prologu, a porażka odpowiednika falsey; awaria jest zdecydowanie bardziej falsey niż prawdą, a naprawienie go znacznie wydłużyłoby rozwiązanie, więc mam nadzieję, że liczy się to jako prawidłowe rozwiązanie.
i
któremu udaje się (w rzeczywistości nieskończenie wiele razy) dla słowa nieskończoności, w ten sposób wypisując „tak” po uruchomieniu z interpretera (jak to zwykle bywa w Prologu); nie odpowiada słowu kandydującemu, którego pierwsza i ostatnia litera nie pasują do siebie, lub nie jest długa na 5 liter, co powoduje wyświetlenie „nie” po uruchomieniu z interpretera; i ulega awarii z przepełnieniem stosu, jeśli podano słowo kandydujące, które nie jest słowem nieskończoności, ale składa się z pięciu liter z dopasowaniem pierwszych i ostatnich dwóch. (Nie jestem pewien dlaczegoAlgorytm jest dość prosty (i rzeczywiście program jest dość czytelny); sprawdź, czy litery tworzą jeden z czterech wzorów tworzących słowo nieskończoności, a jeśli nie, zacznij cyklicznie permutować i spróbuj ponownie. Nie musimy jawnie sprawdzać podwójnych liter, ponieważ operatory
<
i>
pozwalają nam domyślnie sprawdzić, czy w tym samym czasie sprawdzamy, czy delty są zgodne.źródło
Faktycznie ,
3827 bajtówTa odpowiedź była w dużej mierze zainspirowana doskonałą odpowiedzią Jonathana Allana na galaretkę . Prawdopodobnie jest kilka miejsc, w których można grać w golfa, więc sugestie dotyczące gry w golfa są mile widziane! Wypróbuj online!
Ungolfing
źródło
APL (Dyalog) ,
1615 bajtówWypróbuj online!
źródło
TI-BASIC, 81 bajtów
Ciąg do przekazania do programu znajduje się w Ans. Zwraca (i domyślnie wyświetla) 1, jeśli wprowadzone słowo jest Słowem Nieskończoności, i 0 (lub kończy pracę z komunikatem o błędzie), jeśli nie jest.
Błędy powtarzających się znaków lub słów nie zawierających 5 liter.
źródło
05AB1E , 16 bajtów
Port odpowiedzi galaretki @JonathanAllan .
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło