Napisz program, aby ustalić, czy okresowa sekwencja dodatnich liczb całkowitych ma właściwość, że dla każdej liczby całkowitej n
występującej w sekwencji nigdy nie ma więcej niż n
inne liczby całkowite między dwoma kolejnymi wystąpieniami n
.
Na przykład 2, 3, 5, 2, 3, 6, 2, 3, 5, 2, 3, 6, ...
ma tę właściwość: każda para kolejnych wystąpień 2
ma co najwyżej dwie liczby całkowite (takie jak 2, 3, 5, 2
i 2, 3, 6, 2
; każda para kolejnych wystąpień 3
ma co najwyżej trzy liczby całkowite; i to samo dla 5
i 6
.
Jednak 2, 3, 5, 2, 3, 4, 2, 3, 5, 2, 3, 4, ...
nie ma tej właściwości: dwa kolejne wystąpienia 4
, mianowicie 4, 2, 3, 5, 2, 3, 4
, mają więcej niż cztery liczby całkowite między nimi.
Dane wejściowe : rozsądne przedstawienie okresowej sekwencji dodatnich liczb całkowitych. Na przykład skończona lista, która {2, 3, 5, 2, 3, 6}
może reprezentować pierwszą nieskończoną sekwencję 2, 3, 5, 2, 3, 6, 2, 3, 5, 2, 3, 6, ...
powyżej. (W tym przypadku problem można określić w przypadku skończonych list, które się zawijają zamiast nieskończonych list okresowych).
Wyjście : a truthy / wartość falsy.
Prawdziwe przykłady:
{1}
{8, 9}
{2, 3, 4}
{5, 5, 3, 3, 6}
{2, 3, 5, 2, 3, 6}
{6, 7, 3, 5, 3, 7}
{9, 4, 6, 7, 4, 5}
{1, 1, 1, 1, 1, 100, 1}
{1, 9, 1, 8, 1, 7, 1, 11}
Przykłady Falsy:
{1, 2, 3}
{2, 3, 9, 5}
{3, 5, 4, 4, 6}
{2, 3, 5, 2, 3, 4}
{3, 5, 7, 5, 9, 3, 7}
{5, 6, 7, 8, 9, 10, 11}
{1, 9, 1, 8, 1, 6, 1, 11}
To jest codegolf , więc wygrywa najkrótszy kod. Zachęcamy do udzielania odpowiedzi we wszystkich językach.
źródło
Odpowiedzi:
Haskell,
60575655 bajtówZakłada, że lista wejściowa zawiera co najmniej jeden element.
Przykład użycia:
g [1]
->True
. Wypróbuj online!Niech
a
będzie głową listy ib
ogonem. Wynikiem jest,True
jeślib
jest pusty lub liczba elementów na początkub
, które nie są równe,a
nie jest większa niż,a
a wywołanie rekurencyjnef b
jest równieżTrue
inneFalse
. Zacznij od dwukrotności listy wprowadzania.Edycja: @Leo zapisał 3 bajty. Dzięki!
Edycja 2: @Laikoni zapisał 1 bajt. Dzięki!
źródło
span
jest krótsze niż używanietakeWhile
, więc w ogóle na niego nie patrzyłem.takeWhile
prawie zawsze można skrócić dofst$span
lubfst.span
, co oszczędza kolejny bajt.Python ,
5756 bajtów-1 bajt dzięki Dennis (zamiast
i+1:i+v+2
zi:i-~v
ze związkiemi
przesunięcie 1 zenumerate
)Wypróbuj online!
Funkcja nienazwany biorąc listę,
a
i testowania warunek, że każda wartość,v
pojawia sięin
odpowiedni kawałek do jego prawa w konkatenacjia
ze sobą,(a+a)[i:i-~v]
gdzie indeks 1 opartego na poziomiev
wa
,i
jest dostarczonych przezenumerate(a,1)
.źródło
JavaScript (ES6),
67 65 55 54 5149 bajtówZaoszczędź 3B dzięki @ETHproductions i 2B dzięki @Arnauld
Wyjaśnienie
Definiuje funkcję, która pobiera tablicę
a
jako dane wejściowe. Następnie.some
metoda iteruje tę tablicę, wykonując inną funkcję dla każdego elementu.Ta funkcja wewnętrzna przyjmuje dwa argumenty
b
orazc
bieżącą wartość i jej indeks. Funkcja znajduje indeks bieżącej wartości, zaczynając od indeksuc + 1
. Następnie sprawdza, czy ten indeks jest większy niż bieżąca wartość plus bieżący indeks (różnica między dwoma wystąpieniami tej samej wartości jest większa niżb
). Zauważ, że to zwraca dokładne przeciwieństwo tego, czego chcemy.Jeśli jedna z tych zwracanych wartości jest
true
,.some
funkcja zwracatrue
również. Jeśli żadna z kontroli nie powrócitrue
,.some
funkcja zwracafalse
. Jeszcze raz przeciwieństwo wartości, którą chcemy zwrócić, więc ten wynik jest negowany, a następnie zwracany.Sprawdź to
Wypróbuj wszystkie przypadki testowe tutaj:
źródło
.shift()
zaoszczędzić na plasterku:a=>!a.some(b=>z.indexOf(z.shift())>b,z=a.concat(a))
a=>!a.some((n,i)=>a.concat(a).indexOf(n,++i)>n+i)
zadziała?Galaretka , 11 bajtów
Wypróbuj online!
Jak to działa
źródło
Galaretka , 8 bajtów
Napisane przez @ JonathanAllan's Python answer .
Wypróbuj online!
Jak to działa
źródło
SWI-Prolog, 83 bajty
Listę należy wprowadzić dwukrotnie:
Jeśli nie zostanie to uznane za akceptowalne, możesz dodać predykat
co dodaje dodatkowe 14 bajtów.
Wypróbuj online
Uwaga: możesz jednocześnie testować różne fałszywe przypadki, oddzielając swoje zapytania znakiem „;” (lub) i sprawdź różne prawdziwe przypadki, oddzielając je znakami „,” (i)
tj. korzystając z przykładów PO:
i
źródło
PHP, 52 bajty
pobiera sekwencję z argumentów wiersza poleceń; wychodzi z kodem
1
dla fałszu,0
dla prawdy.Uruchom z
-nr
.$n
przez argumenty:, nie rób nic, w przeciwnym razie wyjdź z kodu
1
$$n
( zmienne zmienne )0
(niejawne)źródło
Siatkówka oka , 50 bajtów
Wprowadź jako listę oddzielnych przecinków liczb jednoargumentowych.
Wypróbuj online!
Wyjaśnienie
Zduplikuj dane wejściowe, abyśmy mogli sprawdzić kroki owijające się wokół końca.
Dopasuj i zwróć każdą (najkrótszą) sekcję między dwiema identycznymi wartościami, np
11,111,1,11
.Kilkakrotnie usuwaj cyfrę z pierwszego numeru wraz z całym numerem po nim. Jeśli odstęp jest wystarczająco mały, spowoduje to całkowite usunięcie pierwszej liczby. W przeciwnym razie pozostanie co najmniej jedna cyfra.
Policz, jak często
1,
pojawia się we wszystkich wierszach. Jeśli pojawia się gdziekolwiek, jeden z kroków był zbyt szeroki.Spróbuj dopasować liczbę zaczynającą się od
0
(tj. Tylko0
siebie). Jest to w rzeczywistości logiczna negacja wyniku.źródło
JavaScript (ES6), 47 bajtów
Jak to działa
Ponownie używamy tablicy wejściowej
a
do przechowywania pozycji ostatniego napotkanego wystąpienia każdej liczby całkowiteja
. Używamy klucza-n
do przechowywania tej pozycji, aby nie kolidowała z oryginalnymi indeksamia
.Gdy
a[-n]
istnieje, następuje rzeczywisty test. Gdya[-n]
nie istnieje, wyrażeniea[-n] - (a[-n] = i)
jest równeundefined - i == NaN
i porównanie z~n
jest zawsze fałszem, co jest oczekiwanym rezultatem.Przypadki testowe
Pokaż fragment kodu
źródło
Siatkówka ,
4139 bajtów2 bajty golfa dzięki Martinowi Enderowi, który, nawiasem mówiąc, wprowadził mnie do balansowania grup z jego fantastycznym przewodnikiem po SO
Dane wejściowe to oddzielona przecinkami lista liczb jednoargumentowych. Dane wyjściowe są
0
dla false i1
true.Wypróbuj online!(Zestaw testowy, który automatycznie konwertuje z dziesiętnego)
Niedawno dowiedziałem się o równoważeniu grup, więc chciałem spróbować. Nie należą one do najłatwiejszych w użyciu narzędzi, ale z pewnością są potężne.
Wyjaśnienie
Podobnie jak wiele innych zgłoszeń, duplikujemy listę, aby zająć się pakowaniem. Na końcu dodajemy przecinek, więc po każdym numerze następuje przecinek (to później trochę łatwiej)
Tutaj rzeczy stają się interesujące. To jest etap zastępowania, zastępujemy wszystko pasujące pierwszym wierszem drugim wierszem, w tym przypadku chcemy usunąć wszystkie liczby
n
po których nie następująn+1
inne różne liczby.Aby to zrobić, najpierw dopasowujemy liczbę, przechwytując każdą
1
w grupie (w tym przypadku przechwytując grupę numer 2). Następnie z pozytywnym spojrzeniem w przyszłość, aby uzyskać asercję o zerowej szerokości, wielokrotnie staramy się dopasować w grupie równoważącej-2
, która odniesie sukces nie więcej niż liczba przechwyceń wykonanych przez grupę2
, liczba po której nastąpi przecinek. Po tej sekwencji liczb jesteśmy usatysfakcjonowani, jeśli osiągniemy albo pierwszą liczbę, albo koniec linii.Uwaga: to wyrażenie może pasować tylko do końcowej części liczby, jeśli nie uda się znaleźć dopasowania z pełną liczbą. Nie stanowi to problemu, ponieważ wtedy pierwsza część liczby pozostanie w ciągu i będziemy wiedzieć, że zastąpienie nie zakończyło się pełnym powodzeniem.
Ostatecznie wynik powinien być prawdziwy, jeśli całkowicie usunęliśmy wszystkie liczby z listy. Próbujemy dopasować pusty ciąg i zwracamy liczbę znalezionych dopasowań.
źródło
\b
. Usunięcie go spowoduje zbłąkane dopasowania, ale nie uda im się usunąć całego numeru, więc i tak nie skończy się pusty ciąg.Galaretka , 11 bajtów
Wypróbuj online!
źródło
Python 3 , 101 bajtów
Wypróbuj online!
źródło
Röda , 50 bajtów
Wypróbuj online!
Wreszcie! I zostały oczekiwanie na to wyzwanie ...
Jest to funkcja, która zwraca wartość prawdy lub fałszu. Wymaga jednego argumentu - tablicy.
Powtarza po strumieniu indeksów i sprawdza dla każdego indeksu
_1
, czy odległość bieżącego indeksu i następnego indeksua[_1]
nie jest większa niża[_1]
.źródło
_1
działa?_
, ale odnosi się do pierwszej pobranej wartości. Gdybym użył wielu_
s, każdy wyciągnąłby osobną wartość. Na przykład[1, 2, 3] | print(_, _, _)
drukuje123
, ale[1,2,3] | print(_, _1, _1)
drukuje111 222 333
(w osobnych wierszach).05AB1E , 13 bajtów
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
źródło