> 1
> Input
>> 1…2
>> L!
>> L+1
>> L∣2
>> L⋅R
>> 2%L
>> Each 4 3
>> Each 5 9
>> Each 6 10
>> Each 7 11 3
> {0}
>> 12∖13
>> Each 8 14
>> L≠1
>> Each 16 15
>> Each 7 17 15
>> 18∖13
>> [19]
>> 2’
>> 21⋅20
>> Output 22
Wypróbuj online!
Zwraca to pustą listę liczb pierwszych niepobranych w Pillai, aw przeciwnym razie niepustą listę.
Jak to działa
Szepty zostały zaprojektowane do manipulowania liczbami rzeczywistymi / złożonymi, z niewielką ilością poleceń tablicowych dodanych dla dobrego pomiaru, stąd wielokrotne użycie Each
iteracji po wygenerowanych listach.
Trochę tła na temat szeptów:
Szepty różnią się nieco ścieżką wykonania od większości innych języków. Zamiast pracować liniowo nad każdą linią, tylko rozgałęziając się w warunkach, Szepty zaczynają się od ostatniej linii w pliku zaczynając od >
(reguły są nieco bardziej skomplikowane, ale to wszystko, co na razie musimy wiedzieć) i znaczenie liczb różnią się w zależności od tego, czy linia zaczyna się od, >
czy >>
.
Jeśli linia zaczyna się od >
, na przykład > 1
lub > Input
, jest to linia stała - za każdym razem zwraca tę samą wartość. Tutaj liczby reprezentują ich postać liczbową, więc pierwsza linia zawsze zwraca 1, gdy zostanie wywołana.
Jeśli linia zaczyna się od >>
, liczby są traktowane jako odniesienia do innych linii, podobnie jak wywołania funkcji, jeśli chcesz. Na przykład w wierszu >> 1…2
nie wykonuje …
polecenia na liczbach całkowitych 1 i 2 , ale na wartościach zwracanych z wierszy 1 i 2 . W tym przypadku tymi wartościami są liczba całkowita 1 i dowolna liczba całkowita, którą przekazujemy jako dane wejściowe.
W tym przykładzie rozważmy dane wejściowe 23 . Należy pamiętać, że z powodu przetwarzania wstępnego Szeptów druga linia ( > Input
) jest konwertowana na> 23
.
Nasza pierwsza komenda jest na linii 3: >> 1…2
. …
oznacza zakres dynamiczny, w tym przypadku od 1 do 23 , dając {1, 2, ... 22, 23} . Następnie przechodzimy do linii od 9 do 12 :
>> Each 4 3
>> Each 5 9
>> Each 6 10
>> Each 7 11 3
Tutaj mamy 4 kolejne Each
instrukcje, z których każda iteruje w stosunku do poprzedniego wyniku, zasadniczo mapując 4 polecenia na tablicę w linii 3 : zakres. Pierwsze trzy stwierdzenia to proste mapy z wierszami 4 , 5 i 6 :
>> L!
>> L+1
>> L∣2
Te trzy polecenia powyżej liczby całkowitej n dają (n! +1) ∣x , gdzie ! oznacza silnię , ∣ oznacza podzielność, a x oznacza dane wejściowe. Wreszcie linia 12 ma mapę diadadową strukturę .
Dwójkowym mapa struktura zajmuje trzy liczby całkowite: cel, w lewo iw prawo, każdy indeksów na innych liniach. Tutaj spakowujemy w lewo i w prawo, aby utworzyć listę par, a następnie zmniejszamy każdą parę za pomocą polecenia dyadic (celu). Tutaj, jeśli wartością wejściową jest 23 , listy to {1, 2, ... 22, 23} i {0, 0, ... 1, 0}, a polecenie to
>> L⋅R
co zwielokrotnia lewy argument przez prawy. W ten sposób powstaje tablica liczb całkowitych, gdzie 0 przy indeksach liczb całkowitych, których silni przyrosty nie są podzielne przez dane wejściowe, i pierwotny indeks tam, gdzie są. Zadzwonimy tej tablicy A . Następnie usuwamy 0 z A , biorąc ustaloną różnicę między {0} a A :
> {0}
>> 12∖13
Przy naszym przykładowym wprowadzeniu tworzy to zestaw {14, 18, 22} . Następnie bierzemy pozostałą część danych wejściowych dzieloną przez każdą wartość w zestawie i sprawdzamy, czy ta reszta nie jest równa 1 :
>> 2%L
>> Each 8 14
>> L≠1
>> Each 16 15
Ponownie mamy listę 0 lub 1 s i musimy usunąć 0 i zastąpić je 1 oryginalnymi wartościami. Tutaj powtarzamy kod, który widzieliśmy powyżej, ale >> 18∖13
zamiast 12
. Na koniec rzutujemy ten wynikowy zestaw na listę w celu ostatecznego sprawdzenia. Niestety nasz kod musi również odrzucać liczby zespolone spełniające wszystkie te kryteria, takie jak 437 . Więc dodajemy naszą ostatnią kontrolę, mnożąc naszą ostateczną listę przez pierwotność danych wejściowych. Ze względu na to, jak działa mnożenie Pythona na listach, 0 zastępuje je pustą listą, a 1 nie ma wpływu. Obliczamy więc pierwotność danych wejściowych, pomnóż ją przez listę ms dla danych wejściowych i wyjściowych:
>> 2’
>> 21⋅20
>> Output 22