Mój nauczyciel był bardziej niż niezadowolony z mojej pracy domowej na Marsie . Przestrzegałem wszystkich zasad, ale ona powiedziała, że to, co wydałem, było bełkotem ... kiedy po raz pierwszy na to spojrzała, była bardzo podejrzliwa. „Wszystkie języki powinny być zgodne z prawem Zipfa bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla
Okazuje się, że prawo Zipfa stwierdza, że jeśli wykreślisz logarytm częstotliwości każdego słowa na osi y, i logarytm „miejsca” każdego słowa na osi x (najczęściej = 1, drugi najczęściej = 2, 3. najbardziej commmon = 3 itd.), następnie wykres pokaże linię o nachyleniu około -1, da lub zajmie około 10%.
Na przykład, oto fabuła dla Moby Dicka:
Oś x jest n- tym najczęściej używanym słowem, oś y to liczba wystąpień n- tego najczęściej używanego słowa. Nachylenie linii wynosi około -1,07.
Teraz omawiamy Wenutian. Na szczęście Wenucjanie używają alfabetu łacińskiego. Reguły są następujące:
- Każde słowo musi zawierać co najmniej jedną samogłoskę (a, e, i, o, u)
- W każdym słowie mogą znajdować się maksymalnie trzy samogłoski z rzędu, ale nie więcej niż dwie spółgłosek z rzędu (spółgłoska to każda litera, która nie jest samogłoską).
- Brak słów dłuższych niż 15 liter
- Opcjonalnie: pogrupuj słowa w zdania o długości 3-30 słów, oddzielone kropkami
Ponieważ nauczyciel uważa, że oszukałem pracę domową na Marsie, powierzono mi napisanie eseju o długości co najmniej 30 000 słów (po wenecku). Zamierza sprawdzić moją pracę na podstawie prawa Zipfa, więc kiedy dopasowana jest linia (jak opisano powyżej) nachylenie musi wynosić co najwyżej -0,9, ale nie mniej niż -1,1, i chce słownictwa o długości co najmniej 200 słów. Tego samego słowa nie należy powtarzać więcej niż 5 razy z rzędu.
To jest CodeGolf, więc wygrywa najkrótszy kod w bajtach. Wklej dane wyjściowe do Pastebin lub innego narzędzia, z którego mogę je pobrać jako plik tekstowy.
Odpowiedzi:
Mathematica, 102 bajty
Nienazwana funkcja nie przyjmuje danych wejściowych i zwraca łańcuch składający się z 40 320 trzyliterowych słów wenusjańskich ze spacjami końcowymi.
Outer[StringJoin,a={"v","a","e","i","o","u"},a,a,{" "}]
tworzy 216 trzyliterowych słów, używając tylko liter „vaeiou”, każde z własną spacją. Pierwsze z tych słów, „vvv”, nie jest ważne wenusjańskim, aleRest
je wyrzuca.Potem
RandomChoice[1/Range@215->...,8!]
robi 8! = 40 320 losowych wyborów z wynikowej listy zawierającej 215 słów, z wagami częstotliwości wyznaczonymi przez odwrotność pierwszych 215 liczb całkowitych (1/Range@215
). Na koniec<>""...
konkatenuje łańcuchy z wynikowej listy.Wynik jest daleki od deterministycznego; jeden bieg przyniósł ten esej wenusjański .
Mathematica, 129 bajtów
Ten jest deterministyczny. Podstawowy zestaw 215 słów jest taki sam, ale teraz każde słowo powtarza się dokładnie tyle razy (słowo #j powtarza się około 7! / J razy), aby wymusić utrzymanie prawa zipf. Następnie słowa są przeplatane równo, aby uniknąć powtórzeń. (Wyobraź sobie, że każde słowo jest ułożone na linijce, a wszystkie jego kopie są rozmieszczone w równych odstępach; gdy wszystkie słowa zostaną odczytane w kolejności, żadne konkretne słowo nie będzie się wiele powtarzać, być może wcale). 117 słów Esej wenusjański .
źródło
vva
pojawia się sześć razy pod rząd. Myślę, że może być większy problem ... czy nie powinno się kwestionować odpowiedzi za każdym razem? (A jeśli nie, to jak narysować granicę prawdopodobieństwa, że powinni oni działać?)05AB1E ,
343332 bajtyWypróbuj online!
Myślę, że wciąż można grać w golfa! Na przykład stałe liczbowe i
vNy<FD}
mogą być grywalne.Przykład wyjściowy
Jak to działa?
Generuje wszystkie kombinacje słów zgodnie z regułą „samogłoska + samogłoska + spółgłoska”, co czyni 525 unikalnymi poprawnymi słowami (ponad 200). Następnie przypisuje każdemu z nich częstotliwość zgodną z prawem
f(x) = 4725/x
gdziex
to ranga bieżącego słowa, zaczynająca się od 1, a kończąca na 525. Następnie częstotliwości są znormalizowane i mnożone, więc jest co najmniej 30000 słów. Ten kod zawsze daje 32074 słów, aby zaangażowane w grę stałe były możliwe do gry w golfa (zobacz objaśnienie kodu). Każde słowo powtarza się tyle razy, ile odpowiada częstotliwości tego samego słowa. Wreszcie słowa są tasowane. Nie gwarantuje to jednak, że słowo nigdy nie zostanie powtórzone pięć razy z rzędu. Dlatego programy generują więcej niż potrzebne 200 unikalnych słów, aby zmniejszyć prawdopodobieństwo powtórzenia słowa pięć razy z rzędu. Należy pamiętać, że ten kod zawsze generuje tę samą sekwencję słów. Jedyne, co różni się między dwoma przebiegami, to wynik operacji tasowania.Jak ocenić częstotliwość?
Stworzyłem prosty kod Python3, który pobiera tekst z pliku o nazwie „output” (z punktu widzenia algorytmu ma to sens!) I wypisuje go do „stats.csv”.
Co zawsze daje następującą dystrybucję mojego kodu:
Nachylenie wynosi -1.0138. Ta wartość jest teraz mniej zbliżona do -1 niż nachylenie poprzedniego kodu, ale nadal spełnia ograniczenia nachylenia.
źródło
Bash / Core Utils,
122110 bajtówRozwinięty:
for w
Pętla wytwarza 243 różnych słów.let ++x;
początkowo inkrementuje x (zgodnie z regułami wyrażeń arytmetycznych podczas pierwszego wykonania,x
jest traktowane jako 0, a zatem jego przyrost ustawia go na 1). W ten sposób następny wiersz generuje kolejne słowa przy częstotliwości 5575 / x w celu przybliżenia częstotliwości zipf.Następnym krokiem jest permutacyjne ustalenie tego w celu dopasowania do wymogu powtarzania; pomimo
--random-source
tego, że jest to strasznie duża nazwa flagi, użycie jej z shuf bije liczbę znaków ręki toczącej się po selektorze wielu modów.yes ae
jest właściwie najkrótszym ustalonym „losowym” urządzeniem, które spełniłem.To generuje 33729 esejów słów [pastebin] .
Bash / Core Utils,
9684 bajtów (niekonkurujące)W przypadku podejścia niedeterministycznego po prostu odetnij flagi shuf:
Analiza
Nachylenie zipf jest ustawione na prostą. Używanie programu Excel do drukowania w skalach logarytmicznych:
Nauczyciel powinien zauważyć nachylenie zipf = -1.000764.
źródło