Twoim zadaniem jest napisanie programu lub funkcji, która:
- Przy pierwszym uruchomieniu wyświetla kod źródłowy.
Przy kolejnych wykonaniach powinien wypisać to, co wypisał wcześniej, ale z jedną losową zmianą znaku (zdefiniowaną poniżej). Nie musi to być jednolicie losowa zmiana, ale każda możliwa zmiana powinna mieć niezerową szansę wystąpienia.
Po pierwszym wykonaniu, Twój program nie musi być już na Quine'a; dane wyjściowe ulegną zmianie (a program może się również modyfikować).
Na przykład, jeśli twój quine był ABCD
, wielokrotnie go uruchamiając może wydrukować:
ABCD
A!CD
j!CD
j!CjD
Dane techniczne
Zmiana postaci to:
- Wstawienie losowego znaku,
- Usunięcie losowego znaku lub
- Zastąpienie postaci nową losową postacią. Zauważ, że nowy znak może być taki sam jak ten, który zastępuje, w którym to przypadku nie zostaną wprowadzone żadne zmiany.
Oczywiście usunięcie lub zastąpienie znaku z pustego ciągu nie jest poprawną zmianą.
- Pomimo tego, że jest oznaczony jako quine , zasady dotyczące odczytywania kodu źródłowego nie mają zastosowania.
Możesz użyć dowolnego zestawu znaków, o ile zawiera on znaki użyte w kodzie źródłowym.
Odpowiedzi:
Python 3 ,
288 270 224 212 195 196 194 180 178168 bajtówWypróbuj online!
Po wydrukowaniu kodu źródłowego pliku przy pierwszej iteracji dodajemy dodatkowy wiersz, aby ustawić x na nowy kod źródłowy, a nie m.
Wyjaśnienie:
Zakładając, że
hash
zwraca jednolicie losową liczbę, istnieje około 1/6 szansy na wstawienie nowej postaci, 1/6 szansy na zmianę istniejącej postaci i 2/6 szansy na usunięcie postaci. O jaką pozostałą szansę 2/6 pytasz? Cóż, w ogóle nie robi nic w 2/6 czasu!(Oto program sprawdzający poprawność na podstawie odpowiedzi mbomb007 . Wypróbuj online! )
źródło
f=__file__
że pomógłby również w pierwszym kroku.Python 3 ,
205195 bajtówWypróbuj online!
Chciałem wypróbować wersję, która nie odczytuje kodu źródłowego. Okazało się, że nie jest tak źle, jak myślałem, i ma tylko 30 bajtów za wersją, która ma . Wyjaśnienie tego, jak to działa, jest w większości takie samo jak druga odpowiedź, ale inicjuje x inaczej, ponieważ nie może po prostu odczytać kodu źródłowego.
źródło
Python 2 ,
779801 bajtówChociaż wyzwanie zostało zredagowane, aby pokazać, że czytanie Twojego źródła jest dozwolone, już bez niego tworzyłem swoje rozwiązanie. Aby pokazać, że to możliwe, skończyłem. Brak odczytu pliku źródłowego:
Wypróbuj online! (Pamiętaj, że nie spowoduje to modyfikacji źródła. Aby działało, musisz uruchomić je lokalnie)
Aby pokazać, że transformacje działają, oto program testowy (obecnie skonfigurowany tak, aby zawsze wybierał
100
dlar
, i drukuje wynik dla każdej kombinacjin
ip
dla początkowej listy).Wyjaśnienie:
Pierwsza linia to twoja klasyczna quine, ale o wiele dłużej, aby uwzględnić to, co nastąpi później.
Importuj losowe liczby całkowite.
L
stanie się listą porządków kodu źródłowego, ale początkowo jest liczbą całkowitą, która nie jest używana nigdzie indziej w źródle, aby umożliwić zamianę ciągu. Otwórz plik, aby napisać nowe źródło. W późniejszych uruchomieniach zostanie ono otwarte, aby dołączyć.Usuń pierwszą i trzecią linię kodu. Zamień
4
powyższe na listę rzędnych.W kawałkach:
if L>5:
- Pomija tę linię przy pierwszym wykonaniu. PóźniejL
pojawi się lista, która się uruchomi. Wyjaśnię toexec
ostatnie, ponieważ nie jest uruchamiane za pierwszym razem.n
- Liczba losowa 0-2. Określa, która modyfikacja nastąpi (0 = wstaw, 1 = zamień, 2 = usuń).p
- Losowa pozycja na liście, na której nastąpi modyfikacja.r
- Liczba losowa do wstawienia lub zastąpienia na liścief.write("%03d"*3%(n,p,r))
- Dołącz 3 losowe na końcu pliku źródłowego. Przy każdym uruchomieniu będzie to dodawane do liczby całkowitej, która koduje wszystkie zmiany w początkowym źródle, które miały miejsce.exec'b=[];h=%d...'%1...
- Uzyskaj losowe liczby (znalezione po%1
późniejszych uruchomieniach), zastosuj zmiany do listy i wydrukuj.while~-h:b+=[h%%1000];h/=1000
- Zbuduj listę losowych generowanych do tej pory, uwzględniając wiodące1
, co zapobiega problemom z zerami wiodącymi.while b:r,p,n=b[-3:];b=b[:-3]
- Przypisz losowe dla tej iteracji.L=[L[:p]+L[p+1:],L[:p]+[r]+L[p+n:]][n<2if L else 1]
- (0 = wstaw, 1 = zamień, 2 = usuń)print"".join(map(chr,L))
- Wydrukuj zmodyfikowane źródło.źródło
p
może być długością łańcucha. Jakie jest zachowanie pustego łańcucha?Of course, deleting or replacing a character from an empty string is not a valid change
Java 10, 370 bajtów
Wypróbuj online.
Wyjaśnienie:
Ogólne wyjaśnienie:
quine -part:
s
zawiera niesformatowany kod źródłowy.%s
służy do wprowadzania tego ciągu do siebie za pomocąs.format(...)
.%c
,%1$c
i34
służą do formatowania podwójnych cudzysłowów.%%
służy do formatowania modułu%
).s.format(s,34,s)
łączy to wszystko razem.Oto podstawowy program quine Java.
Część wyzwania:
String s;
to kod źródłowy, który zmodyfikujemy na poziomie klasy.int r=s.length();r*=Math.random();
służy do wybierania losowego indeksu kodu źródłowego w zakresie[0, length_of_modified_source_code)
.char c=127;c*=Math.random();
służy do wybierania losowego znaku ASCII (w tym niedrukowalnych) w zakresie Unicode[0, 126]
.c%3
służy do wyboru losowej opcji 0, 1 lub 2. Opcja 0 doda losowy znak przed indeksemr
; opcja 1 zastąpi znak o indeksier
losowym znakiem; a opcja 2 usunie znak z indeksur
.źródło