> Input
> Input
>> 1²
>> (3]
>> 1%L
>> L=2
>> Each 5 4
>> Each 6 7
>> L⋅R
>> Each 9 4 8
> {0}
>> {10}
>> 12∖11
>> Output 13
Wypróbuj online!
Zwraca zestaw wszystkich możliwych rozwiązań oraz pusty zestaw (tj ∅), gdy nie ma rozwiązania.
Jak to działa
Nic dziwnego, że działa prawie identycznie jak większość innych odpowiedzi: generuje listę liczb i sprawdza każdą z nich pod kątem modułu odwrotności z argumentem.
Jeśli znasz się na strukturze programu Szeptów, możesz przejść do linii poziomej. Jeśli nie: zasadniczo Szepty działają w systemie odniesienia linia po linii, zaczynając od ostatniej linii. Każda linia jest sklasyfikowana jako jedna z dwóch opcji. Albo jest to linia Nilad , albo linia operatora .
Linie Nilad zaczynają się od >
, na przykład > Input
lub, > {0}
i zwracają dokładną wartość przedstawioną w tym wierszu, tj. > {0}
Zwraca zestaw{ 0 }. > Input
zwraca następny wiersz STDIN, oceniany, jeśli to możliwe.
Linie operatora zaczynają się od >>
, na przykład >> 1²
lub >> (3]
i oznaczają uruchomienie operatora na jednej lub więcej wartości. W tym przypadku użyte liczby nie odnoszą się do tych wyraźnych liczb, lecz odnoszą się do wartości w tym wierszu. Na przykład ²
to polecenie kwadratowe (n → n2)), więc >> 1²
nie zwraca wartości12), zamiast tego zwraca kwadrat linii 1 , który w tym przypadku jest pierwszym wejściem.
Zazwyczaj linie operatora działają tylko przy użyciu liczb jako odniesień, ale być może zauważyłeś linie >> L=2
i >> L⋅R
. Te dwie wartości L
i R
są używane w połączeniu z Each
instrukcjami. Each
instrukcje działają na podstawie dwóch lub trzech argumentów, ponownie jako odniesień numerycznych. Pierwszy argument (np. 5
) Jest odniesieniem do linii operatora używanej funkcji, a pozostałe argumenty są tablicami. Następnie iterujemy funkcję po tablicy, gdzie L
i R
w funkcji reprezentują bieżący element (y) w tablicach, które są iterowane. Jako przykład:
Pozwolić A = [ 1 , 2 , 3 , 4 ], B = [ 4 , 3 , 2 , 1 ] i fa( x , y) = x + y. Zakładając, że uruchamiamy następujący kod:
> [1, 2, 3, 4]
> [4, 3, 2, 1]
>> L+R
>> Each 3 1 2
Następnie otrzymujemy demonstrację działania Each
oświadczeń. Po pierwsze, pracując z dwiema tablicami, spakujemy je do postacido= [ ( 1 , 4 ) , ( 2 , 3 ) , ( 3 , 2 ) , ( 4 , 1 ) ] następnie mapuj fa( x , y) nad każdą parą, tworząc naszą ostateczną tablicę D = [ f( 1 , 4 ) , f( 2 , 3 ) , f( 3 , 2 ) , f( 4 , 1 ) ] = [ 5 , 5 , 5 , 5 ]
Wypróbuj online!
Jak działa ten kod
Pracując w sposób sprzeczny z intuicją, jak działa Szept, zaczynamy od dwóch pierwszych linii:
> Input
> Input
To zbiera nasze dwa wejścia, powiedzmy x i yi zapisuje je odpowiednio w wierszach 1 i 2 . Następnie przechowujemyx2)w linii 3 i utwórz zakresOdp . : = [ 1 . . . x2)]na linii 4 . Następnie przeskakujemy do sekcji
>> 1%L
>> L=2
>> Each 5 4
>> Each 6 7
Pierwszą rzeczą tutaj jest wykonywany linia 7 , >> Each 5 4
, który iteracje linii 5 na linię 4 . To daje tablicęB : = [ i%x|I ∈ ], gdzie za%b is defined as the modulus of a and b.
We then execute line 8, >> Each 6 7
, which iterates line 6 over B, yielding an array C:=[(i%x)=y|i∈A].
For the inputs x=5,y=2, we have A=[1,2,3,...,23,24,25], B=[0,1,2,1,0,5,5,...,5,5] and C=[0,0,1,0,0,...,0,0]
We then jump down to
>> L⋅R
>> Each 9 4 8
which is our example of a dyadic Each
statement. Here, our function is line 9 i.e >> L⋅R
and our two arrays are A and C. We multiply each element in A with it's corresponding element in C, which yields an array, E, where each element works from the following relationship:
Ei={0AiCi=0Ci=1
We then end up with an array consisting of 0s and the inverse moduli of x and y. In order to remove the 0s, we convert this array to a set (>> {10}
), then take the set difference between this set and {0}, yielding, then outputting, our final result.