Wypisz jeden losowy znak dla każdego znaku kodu źródłowego (jak pokazano poniżej). Prawdopodobieństwo każdego znaku to jego częstotliwość w oryginalnym kodzie źródłowym. Tak więc wynikiem będzie fałszywy kod źródłowy przypominający quine.
Specyfikacja
- Ograniczenia
- Obowiązują standardowe ograniczenia quine . Brak pustych programów lub funkcji. Również brak czytania własnego źródła.
- Wydajność
- Liczba znaków wyjściowych powinna być dokładnie liczbą znaków w kodzie źródłowym
- Każdy znak wyjściowy powinien być wybierany losowo
- Prawdopodobieństwo wyboru dowolnej postaci jest równe
(occurrences in source) / (length of source)
- Oznacza to, że nawet jedno rozwiązanie musi „losowo” dokonać wyboru 1z prawdopodobieństwem
1
. To znaczy, że wyjście nie może być zakodowane na stałe.
- Zwycięski
- To jest kod golfowy, więc wygrywa najmniej bajtów
Przykład
Program Frequency Probability Possible Output
------- --------- ----------- ---------------
a@!@ a - 1 a - 25% @@a@
! - 1 ! - 25%
@ - 2 @ - 50%
Program Frequency Probability Possible Output
------- --------- ----------- ---------------
caBaDBcDaBDB a - 3 a - 25% aaaBBBBccDDD
B - 4 B - 33%
c - 2 c - 17%
D - 3 D - 25%
Odpowiedzi:
CJam , 14 bajtów
Wypróbuj online!
Wyjaśnienie
Każda postać pojawia się dokładnie dwa razy, więc prawdopodobieństwa postaci powinny być takie same.
źródło
Galaretka , 13 bajtów
Wypróbuj online!
Jak to działa
źródło
Perl, 59 bajtów
Jako podstawy użyłem istniejącego quinu i zmodyfikowałem go, aby drukować losowe znaki z treści źródłowej.
Stosowanie
Zapisz jako
faux-source-code.pl
i uruchom używając:Tworzy coś takiego:
W krótkim teście ~ 3% wyników programu
eval
powiodło się. Nie jestem pewien, co to mówi o Perlu ...źródło
eval
! Niezłe! ;-)'
lubq//
,q{}
itp)!Japt , 22 bajty
Przetestuj online!
Jak to działa
źródło
Pyth, 16 bajtów
spróbuj online!
Zawiera każdy znak dwa razy, dlatego prawdopodobieństwo jest takie samo, jakby każdy był tam tylko raz.
źródło
PHP,
71140110124140120 bajtówBiegnij z
php -d
ord
(takie samo prawdopodobieństwo, jak gdybym podwoił ciąg i dodałbym dwa cudzysłowy);
Być może można grać w golfa dalej, ale moje próby ewaluacji były jak dotąd daremne.
Prawdopodobnie nie będę tu wchodził głębiej.
źródło
The probability of each character is its frequency in the original source code.
Mogę się mylić, ale nie wygląda na to, aby ten wpis spełniał ten wymóg.syntax error, unexpected '<'
. Ale nie znam PHP, jak to przetestować?php
lubphp-cgi
bez. Może możesz użyć heredoc.<?
dla użycia z-d
.Python 2, 88 bajtów
Wszystko rzeczywiste zasługi w coraz to daleko idzie mbomb007 - dzięki za pomoc (i wskaźnika o ukośniki)
źródło
n
znaki), musisz wydrukowaćn
losowe znaki. Gdzie prawdopodobieństwo wyboru symboluc
jest równe(number of times c occurs in your solution) / n
.exec("""s = 'from random import choice; print "".join([choice(s) for c in s])'; exec(s)""")
join
.s='''from random import*;print"".join(choice(s)for c in s+"s='';''exec s''")''';exec s
. Chciałbym o tym pomyśleć.Ruby, 47 bajtów
Jest to oparte na standardowym
eval
quine:Jest to bajt dłuższy niż najkrótszy quine, ale zwykle jest lepszym wyborem dla uogólnionych quines, ponieważ wszelkie obliczenia wykonane na łańcuchu kodu źródłowego nie muszą być duplikowane. Podczas gdy w zwykłym quine, każde dodatkowe obliczenie musi przejść zarówno wewnątrz jak i na zewnątrz głównego ciągu, jest ono potrzebne tylko w głównym ciągu dla tego rodzaju quine.
Co do tego, co faktycznie robi kod: po uzyskaniu ciągu reprezentującego cały kod źródłowy, po prostu wybieramy losowy znak (wybierając losowy indeks) 47 razy i drukujemy każdy znak osobno.
źródło
Wolfram Language / Mathematica, 109 bajtów
próbka wyjściowa:
Och, te nawiasy kwadratowe.
źródło
Galaretka, 44 bajty
Mam nadzieję, że poprawnie zinterpretowałem wszystkie reguły (nie jestem do końca pewien, co kryje się w metodzie „noś ładunek”, czy może ma to związek z tym wyzwaniem).
Przetestuj to w TryItOnline
Konstruuje ciąg, z którego można wybierać znaki. Początkowy ciąg znaków zawiera wszystkie użyte znaki oprócz cudzysłowów otwierających i zamykających. Następnie podwaja ten ciąg i konkatenuje jeden z każdego otwartego i zamkniętego cudzysłowu z rzędnych (stąd potrzeba podwojenia pozostałych znaków). Wreszcie wielokrotnie wybiera losowe znaki ze skomponowanego ciągu na długość programu.
źródło
Pyke, 35 bajtów
Wypróbuj tutaj!
Aby sprawdzić: usuń końcowy,
H
a wynikowy ciąg zawiera odpowiednią liczbę każdego znaku (z dodatkowymH
)NIE używa to uogólnionego quinu ani w ogóle quinu. Polega na możliwości utworzenia ciągu zawierającego wszystkie znaki w źródle. To powinno być w stanie to zrobić dla dowolnego kodu, ale każda postać logarytmicznie zwiększa rozmiaru kodu. Jedyną liczbą dozwolonych znaków w źródle jest 2 lub 7
źródło
Rubin,
8167 bajtówZaoszczędził sporo bajtów, kradnąc kilka sztuczek z rozwiązania Martina
Nie zdawałem sobie sprawy, że za każdym razem musisz losowo wybierać; Myślałem, że tasowanie wystarczy. To może być gra w golfa, ale jest to najkrótszy czas, jaki udało mi się zdobyć.
Standardowy rubinowy quine z kilkoma modyfikacjami, dzięki czemu drukuje przetasowany ciąg. Jest mi smutno, ponieważ zajęło mi to piętnaście minut, aby zrozumieć dziwactwa związane z formatowaniem, zanim zdałem sobie sprawę, że i tak podświadomie je kradnę.
Myślę, że tasowanie strun można skrócić, ale nie wiem jak; Być może uda mi się też skrócić czas formatowania, gdy się nad tym zastanowię. Pomoc będzie mile widziana.
Wypróbuj online!
źródło
64.times{$><<"64.times{$><<.inspect[rand 32]}".inspect[rand 32]}
eval r="47.times{$><<('eval r=%p'%r)[rand 47]}"
C, 125 bajtów
C, 60 bajtów dla kodu w golfa, ale nie quine, biorąc dowolny ciąg
Podczas gdy do liczenia znaków moje rozwiązanie wymagało 86:
źródło
f
pobiera ciąg znaków i wypisuje na standardowe wyjście: ciąg może być dowolną sekwencją znaków.rand()%LENGTH_OF_STRING
przyjmuje charakter zgodnie z prawdopodobieństwem tego znaku z rozkładem normalnym podanym przezrand()
. Być może nie rozumiemquine
podejścia do C ....s
po prostu musi zawieraćchar*s="";
. Myślę, że coś takiegochar*s="char*s=l,i;f(){l=i=strlen(s);while(i--)putchar(s[rand()%l]);};+''"+'""'
by to zrobiło (ale nie znam C).JavaScript, 128 bajtów
Uwaga: działa tylko w przeglądarce Firefox ze względu na użycie
uneval
.Przykładowe przebiegi:
źródło
gtraoan
co wydaje się prawie jękiem ..."
istnieje prawdopodobieństwo pojawienia się?Python 3,
134132 bajtyUżywam każdego znaku w kodzie źródłowym w ciągu znaków poprawną liczbę razy, a następnie mnożę ciąg przez dwa, aby uwzględnić go. Program drukuje losowy znak z tego ciągu dla każdego znaku w kodzie (długość jest zakodowana na stałe).
Wypróbuj online
Unikałem ukośników jak zarazy. Jak tylko kod zawiera
\n
lub\"
masz problem, ponieważ ciąg nie zawiera jeszcze odwrotnych ukośników, więc musisz je również dodać, ale w osobnym ciągu pomnożonym przez większą liczbę, ponieważ potrzeba dwóch odwrotnych ukośników, aby reprezentować jeden (\\
).Przykładowe dane wyjściowe:
Muszę powiedzieć, że przypomina mi FlogScript.
źródło
PowerShell v2 +, 175 bajtów
Quines w PowerShell ssać, ponieważ ogranicznikami zamiennych ciąg
{}
też oznaczać pętle i etażerka, więc trzeba użyć kilka zchar
S w-f
operatora, który bloats kod.Podobne do mojego Quine on Every Line . Zasadniczo zapętlamy od
0
do174
i każda iteracja ponownie oblicza quine$d
, rzuca ją jakochar
tablicę i wyciągaRandom
element wybrany równomiernie z wejścia. Z definicji daje to prawdopodobieństwo(occurrences in source) / (length of source)
zgodnie z wymaganiami. Znaki te są zamknięte w parens i-join
łączone z powrotem w ciąg.Przykład
(Tak, to nowa linia w danych wyjściowych - gdy jest ciąg zawierający nową linię
char
linię -array'd,`n
jest traktowany jako znak, ponieważchar
-array jest tylko tablicą kodów bajtów, więc ma również 1 / 175th szansa na wybór).źródło
Dyalog APL , 20 bajtów
f←{
...}
zdefiniuj f jako(,⎕CR'f')
listified (,
) C haracter (table) R reprezentacja (⎕CR
) f ('f'
)[?⍴⍨20]
indeksowane za pomocą ([
...]
) random-up-to (?
) repeat-yourself-times (⍴⍨
) dwudziestuUruchommy to (z fałszywym argumentem) kilka razy:
Dobrze, ale czy dystrybucja jest prawidłowa? Uruchommy go na 10.000 fałszywych argumentach i zobaczmy, ile razy występuje każda postać:
Wyraźnie,
f
i'
występują dwa razy częściej niż inne znaki, tak jak w oryginalnym kodzie źródłowym.Jak to zrobiliśmy?
⍳1E4
generuje pierwsze 10 000 liczb całkowitychf¨
działa f na każdej z tych liczb∊
spłaszcza wszystkie pseudo-quiny w pojedynczy ciąg 200 000 znaków⌸
jest funkcją wyższego rzędu, która dla każdego unikalnego znaku w danych po prawej stronie przekazuje funkcji po lewej stronie unikalny element jako lewy argument, a indeksy, w których znak ten występuje jako prawy argument. Funkcja po lewej stronie to⍺
lewy argument, tj. unikalny znak,
śledzony przez1E¯4×
1 × 10⁻⁴ razy⍴⍵
kształt właściwego argumentu (wskaźniki występowania), tj. ile razy występujeNa koniec
⌸
składa wszystko w stół.źródło
C #,
277280268 bajtów.Nie golfowany:
Jestem pewien, że to działa poprawnie.
Przykładowe dane wyjściowe:
źródło
(new Random()).Next(0,134)]
działa Pozwoliłoby to zaoszczędzić kilka bajtów.C, 136 bajtów
Przykładowe dane wyjściowe:
Ten program generuje losowo 136 znaków.
Cały kod źródłowy (mniej „znaków cudzysłowu) jest zawarty w ciągu. Program określa prawdopodobieństwo wygenerowania znaku cudzysłowu na 2/136, w przeciwnym razie losowo wyśle jeden z pozostałych 67 znaków.
W programie występują dwa wystąpienia każdego znaku w ciągu. Prawdopodobieństwo wyprowadzenia znaku z łańcucha wynosi 134/136. Prawdopodobieństwo wyboru określonego znaku w ciągu wynosi 1/67. Zatem szansa na wyprowadzenie znaku w ciągu wynosi 134/136 * 1/67 = 2/136. Istnieją dwa wystąpienia każdego znaku w programie, więc istnieje prawdopodobieństwo 1/136 wyprowadzenia znaku dla każdego wystąpienia w programie.
Kolejność symboli w ciągu nie ma znaczenia.
źródło