Die 9 Milliarden Namen Gottes ist eine Kurzgeschichte von Arthur C. Clarke. Es handelt von einer Gruppe tibetischer Mönche, deren Auftrag darin besteht, alle möglichen Namen Gottes in ihrem eigenen Alphabet aufzuschreiben. Im Wesentlichen widmen sie sich dem Schreiben jeder möglichen Permutation ihres Alphabets, eingeschränkt durch einige Regeln. In der Geschichte beauftragt das Kloster einige Ingenieure, ein Programm zu schreiben, um die ganze Arbeit für sie zu erledigen. Ihr Ziel ist es, dieses Programm zu schreiben.
Regeln:
Das Alphabet des Mönchs besteht aus 13 Zeichen (nach meinen Schätzungen). Sie können auch
ABCDEFGHIJKLM
einen anderen Satz von 13 Zeichen verwenden.Die Mindestlänge eines möglichen Namens beträgt 1 Zeichen. Die maximale Länge beträgt 9 Zeichen.
Kein Zeichen darf mehr als dreimal hintereinander wiederholt werden.
AAABA
ist ein gültiger Name, aberAAAAB
nicht.Ihr Programm sollte alle möglichen Namen in der Reihenfolge von
A
bis (in eine Datei)MMMLMMMLM
ausgeben, getrennt durch Zeichen, die nicht im Alphabet enthalten sind (Zeilenumbrüche, Semikolons usw.).Dies ist Code-Golf, und Sie können jede Sprache verwenden. Die kürzeste Lösung bis zum 1. Juni 2014 gewinnt.
Bearbeiten: Die Namen sollten mit beginnen A
und mit enden und MMMLMMMLM
nacheinander durch alle Milliarden von Namen gehen. Aber die jeweilige Reihenfolge liegt bei Ihnen. Sie können zuerst alle 1-Buchstaben-Namen, dann alle 2-Buchstaben-Namen usw. ausdrucken. Oder Sie können alle Namen ausdrucken, die mit A
, dann alle mit B
oder einem anderen Muster beginnen. Ein Mensch sollte jedoch in der Lage sein, die Datei zu lesen und zu bestätigen, dass sie alle da sind und in der von Ihnen gewählten logischen Reihenfolge, vorausgesetzt, sie haben die Zeit.
quelle
f(k) = k^9 + k^8 + k^7 - 5*k^6 + k^5 + k^4 + 4*k^3 - 2*k^2 + k
. Sage Implementierung: goo.gl/0srwhq105.8GB
alles gesagt und getan! Ich bin froh, dass die Sterne nicht ausgegangen sind ... oder müssen Sie die Liste ausdrucken, damit das passiert ...?Antworten:
Rubin, 46
Meine ursprüngliche, ähnliche Lösung war länger und falsch (sie gab base13-Zahlen aus, die aufgrund führender Nullen nicht alle sind), aber ich lasse sie hier, weil sie trotzdem Stimmen erhalten hat.
quelle
k=*?A..?M*9;puts k-k.grep(/(.)\1{3}|[N-Z]/)
C 140
177 235Guter alter prozeduraler Stil, keine Fantasie.
Es zählt (kein Schreiben) 11.459.252.883 Namen in 8 Minuten.
Nächste Bearbeitung mit Laufzeit und Größe der Namensdatei. Beobachten Sie den Himmel ...
Laufzeit 57 Minuten, Dateigröße 126.051.781.713 (9 Zeichen + CRLF pro Zeile). Bitte teilen Sie mir die E-Mail-Adresse der Mönche mit, damit ich ihnen die gezippte Datei zur manuellen Überprüfung zusenden kann ...
Bearbeiten Golf ein wenig mehr, überarbeitet den Scheck für wiederholte Briefe.
Immer noch nicht die kürzeste, aber immerhin bricht diese ab und erzeugt die gewünschte Ausgabe.
Laufzeit 51 min, Dateigröße 113.637.155.697 (diesmal keine führenden Leerzeichen)
Eine Randnotiz: Offensichtlich ist die Ausgabedatei sehr komprimierbar, dennoch musste ich 7zip beenden, nachdem ich 36 Stunden gearbeitet hatte, waren es 70%. Seltsam.
Ungolfed
quelle
#include
s?Golfscript,
5847 ZeichenDank Peter Taylor bleibt mir der Seppuku erspart, die Ruby-Lösung nicht zu schlagen! Führen Sie den Code selbst auf 10 ein , und hier ist der Beweis, dass die Vier-in-einer-Reihe-Zahlen übersprungen werden .
quelle
n+
anstelle von''+n
. Ich denke , es innerhalb der Regeln ist ein Alphabet mit Steuerzeichen zu verwenden, so dass Sie könnte auch ersetzen65+
mit13+
und ein anderes Zeichen speichern , indem Namensgebung13:^
. Und ich denke das13,{ stuff [...]
könnte sein13,1/{ stuff 4*
.13,
sofort kann durch{65+}%n+}%{ backtick {\4*/,}+78,1/%1-!},
eine Gesamtsparung von 8 ersetzt werden, um Ihr Leben zu retten.AAAM
es sein sollteAAABA
und nichtBAAAB
, richtig?Bash + Linux Kommandozeilen-Utils, 43 Bytes
Dieser verwendet eine ähnliche Technik , um meine Antwort unten, sondern zählt nur in der Basis 16 und abstreift alle „Namen“ enthalten
0
,e
oderf
auch solche mit mehr als drei gleichen aufeinanderfolgende Ziffern.So konvertieren Sie in das Mönchsalphabet:
Bash + Coreutils (dc und egrep), 46 Bytes
Edit - korrigierte Version
Das wird eine Weile dauern, aber ich denke, es ist richtig.
dc
zählt von 14 ^ 9 auf 1 abwärts und gibt in Basis 14 aus. egrep filtert die Zahlen mit mehr als 3 aufeinanderfolgenden gleichen Ziffern heraus. Wir filtern auch alle Namen mit "0" -Ziffern heraus, damit wir den richtigen Satz von Buchstaben in den Namen erhalten.Die Frage gibt an, dass jedes Alphabet verwendet werden kann, also verwende ich [1-9] [AD]. Zum Testen kann dies jedoch mit tr in [AM] umgewandelt werden:
Dies ergibt die Folge:
Beachten Sie, dass für diesen
dc
Befehl eine Schwanzrekursion erforderlich ist. Dies funktioniert mit der DC-Version 1.3.95 (Ubuntu 12.04), jedoch nicht mit der Version 1.3 (OSX Mavericks).quelle
APL (59)
Geschrieben in seinem eigenen Alphabet :) Es ist ein bisschen lang. Das Ausführen dauert auch sehr lange.
9
Probieren Sie es mit einer niedrigeren Nummer aus, um zu testen, ob Sie dies möchten.Erläuterung:
{
...}¨⍳9
: für jede Zahl⍵
von 1 bis 9:⍳13*⍵
: Erhalte alle Zahlen von 1 bis13^⍵
¯1⌽
: Die Liste nach links um 1 drehen (so haben wir13^⍵
,1
,2
, ...,13^⍵-1
, die sich in die Kurven0, 1, 2 ...
Modulo13^⍵
).(⍵/13)⊤
: Kodiere jede Zahl in Basis 13 mit⍵
Ziffern⎕A[1+
...]
: Addiere eins (Arrays sind 1-indiziert) und schaue in⎕A
(dem Alphabet) nach↓⍉
: verwandle die Matrix in einen Vektor von Vektoren entlang der Spalten.Z←⊃,/
: Füge jeden inneren Vektor von Vektoren zusammen und gib uns eine Liste möglicher Namen (aber er entspricht noch nicht den Regeln).{
...}¨
: Teste für jeden Namen, ob er der 4-Wiederholungs-Zeichen-Regel entspricht:4/¨⎕A[⍳13]
: Erzeugt für jedes Zeichen eine Zeichenfolge mit 4 Zeichen⍷∘⍵¨
: Testen Sie für jede Zeichenfolge, ob sie in vorhanden ist⍵
∨/,↑
: Nehmen Sie die logische oder alle diese Tests,~
: und invertiere es, was1
bedeutet, dass es den Regeln entspricht und0
dass es nicht den Regeln entspricht.Z/⍨
: Wähle ausZ
allen Elementen, die auf die Ruinen treffen↑
: Zeigen Sie jeden in einer separaten Zeile anquelle
Perl,
70686650 ZeichenVerwendungszweck:
Das Schöne ist, dass die Ausdrucke gepuffert sind, sodass zuerst alle Lösungen mit einem Zeichen gedruckt werden, gefolgt von Wörtern mit zwei Zeichen und so weiter.
quelle
Perl - 35 Bytes
Den Shebang als ein Byte zählen.
Dies ist eine lose Übersetzung der Antwort des Histokraten .
A..1x9
ist ein bisschen seltsam; Dies ist eine Abkürzung für'A'..'111111111'
. Der Akku erreicht nie den Endwert (er enthält nur Großbuchstaben), wird jedoch trotzdem beendet, sobald er länger als 9 Zeichen ist. Dies kann beispielsweise mit getestet werden1x4
.quelle
Array#-
).grep
werde das machen. Ich spreche nicht ganz fließend Ruby.Pyg (Waaay zu lang, für eine Sprache zum Golfen gemacht)
Flüstern : 101 ...
Auch wenn dies in etwa so ist, wie ich es in Python machen würde:
Abzüglich der langen Wartezeit natürlich;)
quelle
Pyth , 34 Zeichen
Erläuterung:
quelle
Python 2 - 212 Bytes
quelle
Japt , 21 Bytes
Probieren Sie es online! (Der Link berechnet nur bis zu
14**4
.)Wie es funktioniert
Es wird eine Standardimplementierung von ECMAScript 2017 als JS-Ebene (und genügend Speicher zum Speichern des Arrays) vorausgesetzt, in der ein
Array
Objekt maximal2**53-1
lang sein kann.quelle