Znajdź dziurę 1 tutaj .
Zrób quine, która po uruchomieniu wyświetla wiele własnych bloków kodu źródłowego. W rzeczywistości musi wyprowadzić go n razy, gdzie n jest następną liczbą pierwszą.
Myślę, że przykład pokazuje to najlepiej.
[MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE]
[MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE][MY QUINE]
Każdy program wyświetli swój podstawowy „blok” (czyli [MY QUINE]) następną liczbę pierwszą razy.
Wbudowane funkcje do obliczania, czy liczba jest liczbą pierwszą (jak funkcja isPrime) lub do określania następnej liczby pierwszej (jak funkcja nextPrime ()) są niedozwolone.
- Oznacza to, że funkcje wyliczające liczbę dzielników są niedozwolone
- Funkcje zwracające pierwszą faktoryzację są również niedozwolone
Powinno to być prawdziwe quine (z wyjątkiem pewnej swobody, patrz następny punkt), więc nie powinieneś czytać własnego kodu źródłowego.
Ponieważ języki takie jak Java i C # są już w niekorzystnej sytuacji, nie musisz generować całkowicie działającego kodu. Jeśli można go wstawić do funkcji (która jest wywoływana) i wypisać następny quine, jesteś dobry.
To jest golf golfowy, więc wygrywa najkrótszy kod!
Odpowiedzi:
CJam, 31 bajtów
Wypróbuj online w interpretatorze CJam .
Pomysł
Aby sprawdzić prymat, użyjemy twierdzenia Wilsona , które stwierdza, że liczba całkowita n> 1 jest liczbą pierwszą wtedy i tylko wtedy, gdy (n - 1)! ≡ -1 (mod n) , co jest prawdą wtedy i tylko wtedy, gdy (n - 1)! + 1% n == 0 .
Kod
źródło
mp
(czy liczba pierwsza?) istnieje już teraz, więc w najnowszej wersji CJam można trochę bardziej pograć w golfa.CJam,
3635 bajtówMożna to
zdecydowaniepograć w golfa dalej.Jak to działa:
Dzięki Martinowi za przypomnienie mi
]W=
sztuczki :)Wypróbuj online tutaj
źródło
Mathematica,
248222 bajtówEdycja: Naprawiono użycie funkcji związanej z liczbą pierwszą, ale także nieco poprawiono quining.
Edycja: Podziękowania dla Dennisa za zapoznanie mnie z twierdzeniem Wilsona.
Zakłada się, że jądro jest zamykane pomiędzy kolejnymi uruchomieniami quine (lub przynajmniej
n
jest resetowane), ponieważ opiera się nan
niezdefiniowaniu przed uruchomieniem pierwszego wystąpienia[MyQuine]
.Prawdopodobnie można to znacznie skrócić, ale nie mam dużego doświadczenia z quinesami, szczególnie w Mathematica.
Oto wyjaśnienie:
To nic nie robi, ale jeśli połączone na końcu poprzedniej quine, mnoży wynik ostatniego wyrażenia przez
1
(co jest brakiem operacji), a średnik tłumi wyjście. To gwarantuje, że tylko ostatnia kopia[MyQuine]
drukuje cokolwiek.Inicjuje
n
to1
w pierwszej kopii,[MyQuine]
a następnie zwiększa ją o1
każdą kolejną kopię - tzn. Liczy się tylko, ile kopii tam jestn
.Przejdź teraz do końca:
Znajduje następną liczbę pierwszą przy użyciu twierdzenia Wilsona .
To jest prawdziwy quine. Tworzy
NextPrime@n
kopie samego kodu. To również trochę dziwne. Tak, mnożę tam dwa ciągi i nie, to nie ma znaczącego wyniku.QUINE_PREFIX
zawiera cały kod przed dwoma ciągami iQUINE_SUFFIX
zawiera cały kod po dwóch ciągach. Teraz zwykle używaszApply
(lub@@
), aby zamienić listę w szereg argumentów. Ale można zastąpić dowolnyHead
zApply
- np mnożenia. Pomimo tego, że jest to produkt, nadal mogę przekształcić go w dwa argumenty mojej funkcji. Ta funkcja:Gdzie
#
jest pierwszy argument (ciąg prefiksu),#2
jest drugim argumentem (ciąg sufiksu),##
jest sekwencją obu argumentów. Muszę przygotować się1
na zachowanie mnożenia - w przeciwnym##
razie przelałbym się na listę argumentów doToString
. W każdym razieToString[1##,InputForm]&@@("abc"*"def")
zwraca"abc"*"def"
... tylko to, czego potrzebuję!Myślę, że przy wszystkich rzeczach, których potrzebuję wokół quinu,
eval
bardziej odpowiedni byłby tu oparty na nim quine. Zajmę się tym później lub jutro.źródło
J - 60 znaków
Używa metody następnej pierwszej, podobnie jak innych odpowiedzi. (To jest
4 p:
trochę.)Urocza mała sztuczka J polega na tym
f :g
, żef
gdy podaje się jeden argument, ag
gdy podaje się dwa. Więc jeśli napiszesz, powiedz, żef :;'a'f :;'a'f :;'a'
to działa jakf'a';'a';'a'
, co jest świetne, ponieważ jest to lista w ramce, której elementy są'a'
i których długość jest liczbą wystąpień.Możemy więc podnieść to do quiney. Używany przez
f
nas wygląd wygląda tak(foo $~ bar)
, żefoo
konstruuje część łańcucha, którą powtarzamy w kółko,bar
znajduje następną liczbę pierwszą i mnoży ją przez 60, czyli długość łańcuchafoo
.źródło
Python 2.7, 214
źródło