9 miliardów imion Boga to krótka historia Arthura C. Clarke'a. Chodzi o grupę tybetańskich mnichów, których porządek poświęcony jest spisaniu wszystkich możliwych imion Boga, zapisanych własnym alfabetem. Zasadniczo poświęcają się pisaniu każdej możliwej permutacji swojego alfabetu, ograniczonej kilkoma zasadami. W opowieści klasztor zatrudnia inżynierów, aby napisali program, który wykona za nich całą pracę. Twoim celem jest napisanie tego programu.
Zasady:
Alfabet mnicha używa 13 znaków (według moich szacunków). Możesz użyć
ABCDEFGHIJKLM
lub innego zestawu 13 znaków.Minimalna długość możliwej nazwy to 1 znak. Maksymalna długość wynosi 9 znaków.
Żadna postać nie może powtarzać więcej niż 3 razy z rzędu.
AAABA
jest prawidłową nazwą, aleAAAAB
nie jest.Twój program powinien wydrukować (do pliku) każdą możliwą nazwę w kolejności od
A
doMMMLMMMLM
, oddzieloną dowolnym znakiem spoza alfabetu (znaki nowej linii, średniki, cokolwiek).To jest golf golfowy i możesz używać dowolnego języka. Najkrótsze rozwiązanie do 1 czerwca 2014 wygrywa.
Edycja: nazwy powinny zaczynać się A
i kończyć MMMLMMMLM
, przechodząc kolejno przez wszystkie miliardy nazw. Ale konkretna sekwencja należy do ciebie. Możesz wydrukować najpierw wszystkie 1-literowe nazwy, a następnie wszystkie 2-literowe nazwy itp. Lub możesz wydrukować wszystkie nazwy zaczynające się od A
, a następnie wszystkie zaczynające się od B
lub inny wzór. Ale człowiek powinien być w stanie odczytać plik i potwierdzić, że wszystko tam jest i w dowolnej logicznej kolejności, którą wybierzesz, zakładając, że ma czas.
źródło
f(k) = k^9 + k^8 + k^7 - 5*k^6 + k^5 + k^4 + 4*k^3 - 2*k^2 + k
. Wdrożenie Sage: goo.gl/0srwhq105.8GB
wszystko powiedziane i zrobione! Cieszę się, że gwiazdy nie zgasły ... a może musisz wydrukować listę, aby tak się stało ...?Odpowiedzi:
Ruby, 46
Moje oryginalne, podobne rozwiązanie było dłuższe i niepoprawne (generuje liczby bazowe 13, co nie jest całkiem wszystkie z powodu wiodących zer), ale zostawię to tutaj, ponieważ i tak uzyskało głosy.
źródło
k=*?A..?M*9;puts k-k.grep(/(.)\1{3}|[N-Z]/)
C 140
177 235Dobry stary styl proceduralny, bez fantazji.
Liczy (bez zapisu) 11 459 252 883 nazw w 8 minut.
Następnie dokonaj edycji za pomocą środowiska wykonawczego i rozmiaru pliku nazw. Obserwuj niebo ...
Czas działania 57 minut, rozmiar pliku 126 051,781,713 (9 znaków + crlf na wiersz). Podaj mi adres e-mail mnichów, abym mógł wysłać im spakowany plik do sprawdzenia ręcznego ...
Edytuj Gra w golfa jeszcze trochę, przerobiono czek dla powtarzających się liter.
Nadal nie najkrótszy, ale przynajmniej ten kończy się i generuje wymaganą moc wyjściową.
Czas działania 51 min, rozmiar pliku 113 637 155 697 (tym razem bez wiodących odstępów)
Uwaga dodatkowa: oczywiście plik wyjściowy jest bardzo ściśliwy, nadal musiałem zabić 7zip, po 36 godzinach pracy wynosił 70%. Dziwne.
Nie golfił
źródło
#include
?Golfscript,
5847 znakówDzięki Peterowi Taylorowi oszczędziłem seppuku od nie bicia rozwiązania Ruby! Uruchom sam kod do 10 , a oto dowód na to, że pomija liczby cztery w rzędzie .
źródło
n+
zamiast''+n
. Myślę, że to w ramach zasad korzystania ze znaków alfabetu kontrolnych, więc można również wymienić65+
ze13+
i zapisać inną postać nazywając13:^
. I myślę, że tak13,{ stuff [...]
może być13,1/{ stuff 4*
.13,
można zastąpić{65+}%n+}%{ backtick {\4*/,}+78,1/%1-!},
całkowitą oszczędnością 8, ratując życie.AAAM
tym powinno byćAAABA
, a nieBAAAB
, prawda?Narzędzia linii poleceń Bash + Linux, 43 bajty
Używa techniki podobnej do mojej poniższej odpowiedzi, ale po prostu liczy się w bazie 16 i usuwa wszystkie „nazwy” zawierające
0
,e
lubf
też te, które zawierają więcej niż 3 takie same kolejne cyfry.Konwertuj na alfabet mnicha w następujący sposób:
Bash + coreutils (dc i egrep), 46 bajtów
Edycja - poprawiona wersja
Uruchomienie zajmie trochę czasu, ale myślę, że jest poprawne.
dc
odlicza w dół od 14 ^ 9 do 1 i wyświetla w bazie 14. egrep odfiltrowuje liczby z więcej niż 3 kolejnymi cyframi. Odfiltrowujemy również nazwy zawierające cyfry „0”, więc otrzymujemy prawidłowy zestaw liter w nazwach.Pytanie określa, że można użyć dowolnego alfabetu, więc używam [1-9] [AD]. Ale w celu przetestowania można to przekształcić do [AM] za pomocą tr:
Daje to sekwencję:
Uwaga: to
dc
polecenie wymaga rekurencji ogona do działania. Działa to na wersji DC 1.3.95 (Ubuntu 12.04), ale nie 1.3 (OSX Mavericks).źródło
APL (59)
Napisane własnym alfabetem :) Jest trochę długie. Uruchomienie zajmuje również dużo czasu
9
, wypróbuj go z niższą liczbą, aby przetestować, jeśli chcesz.Wyjaśnienie:
{
...}¨⍳9
: dla każdej liczby⍵
od 1 do 9:⍳13*⍵
: uzyskaj wszystkie liczby od 1 do13^⍵
¯1⌽
: Obracać listę w lewo o 1 (tak mamy13^⍵
,1
,2
, ...,13^⍵-1
, który zamienia się0, 1, 2 ...
modulo13^⍵
).(⍵/13)⊤
: zakoduj każdy numer w bazie 13 za pomocą⍵
cyfr⎕A[1+
...]
: dodaj jeden (tablice są indeksowane 1) i wyszukaj⎕A
(alfabet)↓⍉
: zamień macierz w wektor wektorów wzdłuż kolumn.Z←⊃,/
: połącz ze sobą każdy wewnętrzny wektor wektorów, dając nam listę możliwych nazw (ale nie spełnia jeszcze reguł).{
...}¨
: dla każdej nazwy sprawdź, czy spełnia zasadę 4 powtórzeń:4/¨⎕A[⍳13]
: dla każdego znaku wygeneruj ciąg 4 tego znaku⍷∘⍵¨
: dla każdego łańcucha sprawdź, czy jest obecny w⍵
∨/,↑
: podejmij logiczne lub wszystkie z tych testów,~
: i odwróć to, co1
oznacza, że spełnia zasady i0
oznacza, że nie.Z/⍨
: wybierz spośródZ
wszystkich elementów, które spełniają ruiny↑
: wyświetl każdy w osobnym wierszuźródło
Perl,
70686650 znakówStosowanie:
Zaletą jest to, że wydruki są buforowane, więc najpierw drukowane są wszystkie rozwiązania 1-znakowe, a następnie słowa 2-znakowe i tak dalej.
źródło
Perl - 35 bajtów
Licząc shebang jako jeden bajt.
To luźne tłumaczenie odpowiedzi histokraty .
A..1x9
jest trochę dziwny; to jest skrót'A'..'111111111'
. Akumulator nigdy nie osiągnie wartości końcowej (zawiera tylko duże litery), ale nadal będzie się kończył, gdy będzie dłuższy niż 9 znaków. Można to przetestować, na przykład, używając1x4
zamiast tego.źródło
Array#-
).grep
zrobi to. Nie jestem całkowicie biegły w Ruby.PYG (waaay zbyt długo, na języku, do golfa)
szepty : 101 ...
Mimo że jest to bliskie tego, jak bym to zrobił w Pythonie:
Pomijając oczywiście komplikacje z długiej linii;)
źródło
Pyth , 34 znaki
Wyjaśnienie:
źródło
Python 2 - 212 bajtów
źródło
Japt , 21 bajtów
Wypróbuj online! (link oblicza tylko do
14**4
.)Jak to działa
Zakłada standardową implementację ECMAScript 2017 jako warstwę JS (i wystarczającą ilość pamięci do przechowywania tablicy), w której
Array
obiekt może mieć maksymalną2**53-1
długość.źródło