7 , 31 znaków, wynik 30, bezpieczny, ale prawdopodobnie uszkodzony?
Program 7 jest zwykle tylko liczbą, ale może zawierać spacje, dzieląc go na wiele liczb. To przedłożenie składa się zatem z dwóch liczb (które są domyślnie konkatenowane przez interpretera 7), a program podobnie przyjmuje dwie liczby jako dane wejściowe, poprzez standardowe dane wejściowe. („31 znaków” w nagłówku to łączna długość dwóch cyfr plus jeden znak oddzielający białe znaki; cyfry tworzące liczby są interpretowane jako ósemkowe, gdy są używane jako program, ale dziesiętne, gdy są używane jako dane wejściowe, oraz to cyfry są takie same w obu przypadkach, a nie rzeczywiste liczby. Zauważ, że nie ma znaczenia ani w przypadku traktowania jako programu, ani w przypadku wprowadzania danych, niezależnie od tego, czy oddzielasz je spacją, czy znakiem nowej linii; mam nadzieję, że nie unieważniają przesłanie).
Oczekiwanym wynikiem jest następująca liczba (wyrażona tutaj w systemie dziesiętnym, ponieważ jest to format wyjściowy, którego używa 7 interpreter):
238363505302130098723162537059
Zauważ, że 7 interpreter połączony z wiki Esolang wewnętrznie przechowuje liczby w jedności, co oznacza, że prawdopodobnie nie masz wystarczającej ilości pamięci, aby uruchomić program na sobie, aby zobaczyć, co robi. Program zweryfikowałem ręcznie, sprawdzając jego zachowanie i testując go na niewielkich nakładach, aby sprawdzić, czy działał zgodnie z oczekiwaniami. Alternatywnym podejściem byłoby napisanie interpretera, który wykorzystuje bardziej wydajną metodę przechowywania liczb.
Unikanie pęknięć tutaj było trochę uciążliwe, ale w końcu jestem teraz zadowolony, że żadne inne liczby poza tymi w samym programie nie są w stanie wygenerować 238363505302130098723162537059. ( EDYCJA tydzień później: Mogłem się mylić, w zależności od tego, jak interpretujesz pytanie; patrz poniżej. )
Rozwiązanie
Pierwotny program to:
711170237403706
111723603700633
Ten program trwa dwie liczby x i y , a wynik ekspresji 3 x y- y- 2 (tj y( 3 x - 1 ) - 2 ). Jeśli będziemy wykonywać te obliczenia na x = 711170237403706 i y= 111723603700633 , otrzymujemy wynik 238363505302130098723162537059 wymagane .
Zamierzano, aby żadne inne dane nie dawały pożądanego rezultatu, ponieważ:
Dane wejściowe należy wybrać tak, aby y( 3 x - 1 ) - 2 = 238363505302130098723162537059 , tj. y( 3 x - 1 ) = 238363505302130098723162537061 (dodanie 2 po obu stronach). Ta liczba jest półpierwszą, z tylko dwoma czynnikami: 111723603700633 i 2133510712211117 . Tylko jedną z tych liczb, 2133510712211117 , można wyrazić w postaci 3 x - 1 (dając ( 3 × 711170237403706 ) - 1 = 2133510712211117 ). Możemy więc jednoznacznie zidentyfikować, która liczba jestx a która jesty , co oznacza, że działa tylko jedno wejście.
Jednak w zależności od tego, jak interpretujesz pytanie, może istnieć drugie wejście, które generuje pożądany wynik (w ten sposób unieważniając to rozwiązanie):
Niestety istnieją dwie multiplikatywne partycje semiprime na dwa czynniki: jeden polega na podzieleniu go na dwa czynniki pierwsze, ale drugi to trywialny podział składający się z 1 i samej liczby. 1 , nie może być zapisany w postaci 3 x - 1 o całkowitej x , a sygnał wyjściowy może być; dlatego potencjalny meta-crack wymaga podania danych wejściowych jako 79454501767376699574387512354 i 1 . Jednak pierwsza liczba tutaj obejmuje znaki ( 8 i 9), których nie ma w zestawie znaków dla 7 programów. Więc jeśli dane wejściowe są ograniczone do tego samego zestawu znaków co program, to rozwiązanie jest poprawne; ale jeśli dane wejściowe zawierające znaki spoza zestawu znaków programu są dozwolone, to rozwiązanie jest nieprawidłowe.
Wyjaśnienie
Oto, jak działa zamierzone rozwiązanie:
711170237403706 111723603700633
7 7 7 Stosy separatorów elementów
111 023 403706 111723603700633 Początkowe elementy stosu
111 Liczba 3, jednomyślnie
023 DSL I / O dla „wprowadź liczbę”
403706 111723603700633 Program główny
(Implikowany: wykonaj kopię głównego elementu programu, zachowując oryginał)
40 Zamień {023} powyżej {program}, unikając tego
3 Wykonaj operacje we / wy za pomocą {023}; pop {program}
0 I / O: numeryczne
23 Wpisz liczbę, kopiując {111} tyle razy
706 Dołącz „6” do numeru (zmniejszając go)
11 Naciśnij dwa puste elementy stosu
17236 Wciśnij element stosu „23” (nieskalowany)
0 Escape {23}, zużywa pusty element
3 Wykonaj operacje we / wy za pomocą {23}; pop {element poniżej}
23 Kopiowanie wierzch stosu wejściowych wiele razy
7006 Dołącz „66” (tzn. Odejmij 2)
3 Wyjście {jako liczba}
3 Wyjdź z programu (z powodu niskiego stosu)
Wiodące 7 i końcowe 3 nie są konieczne do działania programu, są tylko po to, aby uzyskać właściwe czynniki wyjściowe. Pomaga postępować zgodnie z tym programem, jeśli rozumiesz format liczbowy; Liczby są przechowywane w jednoargumentowy wariant, w którym 1
i 7
zwiększenia wartości o 1, a 0
i 6
zmniejszania wartości o 1 (w ten sposób dodanie 66
zmniejsza wartość od 2, powtarzając mnożenia liczb on, i tak dalej). Dane wejściowe są wykonywane przez powtarzanie elementu stosu (więc jeśli element stosu ma 12345
wartość wejściową 3) , nowy element stosu to 123451234512345 ).