Das war damals, aber heute sind alle auf IPv6 umgestiegen . (Richtig?)
Ihre Aufgabe ist es, ein Programm zu schreiben, das alle IPv6-Adressen ausgibt .
Sie sollten ein vollständiges Programm schreiben, das keine Eingaben vornimmt und IPv6-Adressen druckt, eine pro Zeile und keine andere Ausgabe. Ihr Programm muss alle 2 128 möglichen Adressen einschließlich ungültiger Adressen ausgeben. Jede Adresse muss genau einmal ausgedruckt werden. Sie können die Adressen in beliebiger Reihenfolge ausdrucken.
Jede Adresse kann vollständig ausgedruckt werden, wobei 8 Gruppen mit 4 hexadezimalen Ziffern durch Doppelpunkte getrennt sind, z
2001:0db8:85a3:0000:0000:8a2e:0370:7334
Sie können nach eigenem Ermessen die folgenden Standardabkürzungen aus RFC 5952 verwenden :
- Führende Nullen in einer Gruppe können weggelassen werden, es sei denn, dies
0
kann nicht weiter abgekürzt werden. ::
darf höchstens einmal pro Adresse verwendet werden, um eine Folge von einer oder mehreren Nullgruppen abzukürzen.- Bei den hexadezimalen Ziffern kann es sich um Klein- oder Großbuchstaben handeln.
Wenn Sie die Repräsentationsempfehlung von RFC 5952 (nur Kleinbuchstaben, kürzestmögliche Repräsentation, bei ::
Verwendung an mehreren Stellen so früh wie möglich) erreichen, erhalten Sie einen Bonus von -20% .
Aufgrund der Größe der Ausgabe wird nicht erwartet, dass Ihr Programm beendet wird, während wir dort sitzen. Ihr Programm kann irgendwann durch externe Mittel unterbrochen werden ( Ctrl+ C, Ausschalten der Stromversorgung, ...). Ihr Programm muss die Ausgabe als Stream erzeugen, damit es nach einer "angemessenen" Wartezeit einige Zeilen erzeugt hat. Grundsätzlich ist es nicht zulässig, eine riesige Zeichenfolge im Speicher zu erstellen, um sie am Ende zu drucken. Jedes Programm, dem auf einem „Standard“ -PC der Speicher ausgeht, wird disqualifiziert. (Wenn Ihr Programm jedoch ausreichend lange ausgeführt wurde, muss es alle IPv6-Adressen drucken und dann beenden.)
(Wenn diese Bedingung ein Problem für Webinterpreter darstellt, die das Programm bis zum Abschluss ausführen und dann die Ausgabe anzeigen lassen, und Sie keinen gehosteten Interpreter haben, testen Sie Ihr Programm mit einer kleineren Version des Problems und passen Sie es dann sorgfältig an zur Gänze 2 128. )
Ihre Punktzahl ist die Länge Ihres Programms in Bytes, multipliziert mit 0,8, wenn Sie den Bonus erhalten. Es ist Codegolf, also gewinnt die niedrigste Punktzahl.
quelle
Antworten:
Pyth, 21 Bytes
Verwendet eine while-Schleife mit
J
als Iteratorvariable. Initialisiert das Maximum mit8^chr(' ')
. Füllt auf, indem Sie diesen Anfangswert addieren, in Hex konvertieren und dann das erste Zeichen entfernen.quelle
Python 3, 65 Bytes · 0,8 = 52,0
quelle
ipaddress
ist nur python3.Pyth,
272524 BytesHinweis: Der Code hatte zuvor einen Fehler, durch dessen Behebung 1 Byte eingespart wurden
Druckt die Adressen wie
Vorherige (kompliziertere) Version mit dem Pad-Operator (auch 24 Bytes):
Erläuterung
Pyth, 21 Bytes (ungültig)
Dies kann nicht ausgeführt werden, da 1) mindestens 2 132 Byte (2 52 Yobibyte) Speicherplatz verbraucht werden und 2) der Interpreter es nicht mag (2 128 passen nicht hinein
ssize_t
, also keinelist
s dieser Größe) . Es würde die Adressen in lexikographischer Reihenfolge drucken. Sie können den Algorithmus ausprobieren, indem Sie die Zahl (en) am Ende in eine brauchbare Zahl ändern.quelle
C (mit GCC-Erweiterungen): 76 Byte * 0,8 = 60,8
Dies verwendet die 128-Bit-Ganzzahlen-GCC-Erweiterung, um einfach von
::
bis hochzuzählenffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
.inet_ntop()
Formatiert jede Adresse korrekt, sodass der Bonus von -20% in Anspruch genommen werden kann.Ausgabe
Mit
sed
jeder millionsten Zeile werden bis zu 10 Millionen ausgegeben:Hinweis Ich verwende einen Little-Endian-x86_64-Computer, und die Netzwerkadressen befinden sich normalerweise immer in der Netzwerkreihenfolge (Big-Endian)
inet_ntop()
. Dies spielt keine Rolle - alle Adressen werden weiterhin (eventuell) angezeigt.quelle
CJam,
3627 Bytes-9 Bytes dank @Dennis (ich habe vergessen, dass CJam String-Formatierung hat). Druckt die Adressen in Kleinbuchstaben und absteigend.
Verwenden Sie aus offensichtlichen Gründen den Java-Interpreter, nicht den Online-Interpreter. Sie können es jedoch durch
G32#
etwas Kleineres ersetzen , um es online zu testen, z. B. hier sind die letzten 100 .Erläuterung
quelle
0000:0000:0000:0000:0000:0000:ffff:ffff
. Es sieht so aus, als würde die Formatierung von Zeichenfolgen online möglicherweise anders funktionieren. Ich habe bestätigt, dass es mit der Offline-Version funktioniert.n
ist das gleiche wieoNo
in TIO .Python 2.7, 67 Bytes
Als Nebeneffekt der zum Einfügen der Doppelpunkte verwendeten Methode werden die Adressen mit der am weitesten rechts stehenden Spalte gedruckt, die links angezeigt wird:
quelle
[printing] the addresses in any order
. ;)Verilog, 335
Meine erste Verilog-Einsendung könnte wahrscheinlich mehr Golf vertragen, aber ich habe momentan nicht die Energie, dies zu tun.
c
ist Uhr,o
ist ASCII-Ausgabe. Qualifiziert sich nicht für den Formatierungsbonus, da keine Auffüllung statt Abkürzung erfolgt.Dies ist eine einfache Iteration, gefolgt von einem Bit-Twiddling, um die Ausgabe als ASCII-Datei zu erstellen. Ich hacke den Doppelpunkt nach der letzten Gruppe mit einem kleinen Hack. Synthetisiert und scheint für xc3s500e-4ft256-4 auf ISE 13.7 lin64 zu funktionieren.
quelle
C 91-126 Bytes
Meine ursprüngliche Version, 119 Bytes.
Beste portable Golf-Version, 103 Bytes (danke @Dennis für einige dieser Konzepte)
Erläuterung: Der Algorithmus selbst ist ziemlich einfach. Ich habe eher long als unsigned int verwendet, weil es kürzer ist. Wenn Sie sie auf Dateiebene deklarieren, wird alles mit Nullen vorinitialisiert. Die
f
Funktion ist ein einfaches Inkrement mit Übertrag, das die niedrigen 16 Bits jedes Wortes verarbeitet. Die Schleife endet, wenn sie in das 129. Bit übergeht.Wenn Sie für den Ausdruck rückwärts iterieren, werden die Adressen in der "richtigen" Reihenfolge gedruckt, und auch der Scheck zum Drucken einer neuen Zeile ist einige Zeichen kürzer.
Hierbei werden einige nicht portable Konstrukte verwendet. Es wird am besten als K & R-Dialekt von C angesehen, da implizite int-Rückgabetypen verwendet werden und stdio.h nicht enthalten ist. Und meine Verwendung von long wurde dadurch informiert - auf den meisten modernen Systemen reicht int aus, weil es 32 Bit ist. Dies könnte wahrscheinlich unter PDP-11 Unix unverändert laufen.
Sie kann jedoch kürzer sein. Wenn wir davon ausgehen, dass wir int verwenden können (entweder als Typ, der breiter als 16 Bit ist, oder als Typ mit genau 16 Bit mit verschiedenen Eigenschaften, die auf vielen Systemen wie Zweierkomplement und arithmetischem Rollover zufällig zutreffen), können wir es loswerden das Zeug im Zusammenhang mit der Verwendung von langen.
Version für int breiter als 16 Bits, 97 Bytes.
Version für 16-Bit-Systeme, 91 Byte.
Seltsamerweise unterstützte der ursprüngliche K & R-Compiler die Deklaration jedoch nicht ohne int (sie kompiliert einwandfrei, behandelt die Variablen jedoch als extern und daher zur Verbindungszeit undefiniert), sodass zusätzliche drei Bytes erforderlich sind, um die Deklaration auf
int*p,a[9];
for zu ändern insgesamt 94.Wenn die Annahme, dass die Ausgabe vor dem Abschluss unterbrochen wird, eine harte Einschränkung darstellt, können wir die Endprüfung entfernen und fünf Bytes einsparen.
Bonus: voll ANSI portable Version, 126 Bytes:
Zeilenumbrüche werden in allen Versionen aus Gründen der Lesbarkeit und an Stellen eingefügt, an denen kein Leerzeichen erforderlich ist, und sind von der Byte-Anzahl ausgenommen, mit Ausnahme der Zeilenumbrüche nach der
#include
Zeile in der ANSI-Version.Alle Versionen mit Ausnahme der ANSI-Version werden am Ende von main durchgespielt und geben möglicherweise einen falschen Exit-Code an das Betriebssystem zurück.
quelle
a[9];f(int*x){if(++*x>>16)*x=f(x+1);}main(i){for(;!a[8];f(a))for(i=8;i--;)printf(i?"%x:":"%x\n",a[i]);}
i--
Zustandsüberprüfung denken sollen .a[0]
und Wrap-Ina[1]
AutoIt3,
142231 BytesErläuterung
For $a=0 To 2^32-1
: 4-mal über 0-2 ^ 32 ((2 ^ 32) ^ 4 = 2 ^ 128) mögliche Kombinationen iterieren.$s=StringFormat("%08x%08x%08x%08x",$a,$b,$c,$d)
: Konvertieren Sie die Zahlen in eine hexadezimale Zeichenfolge mit einer Länge von 32 (4 * 32).For $j=0 To 8
: Alle 8 Abschnitte der Zeichenfolge durchlaufen.ConsoleWrite(StringMid($s,$j*4+1,4)&($j<7?":":""))
: Extrahieren Sie die nächsten 4 Zeichen aus der Zeichenfolge und fügen Sie:
am Ende einen Doppelpunkt ( ) ein. Wenn wir den letzten Abschnitt nicht erreicht haben, geben Sie alles auf der Konsole ausNext
: Beende die innere for-SchleifeConsoleWrite(@LF)
: Fügen Sie am Ende der Zeile einen Zeilenumbruch hinzuNext
: Beenden Sie die äußeren for-SchleifenErwartete Ausgabegröße: (Eine Zeile (39 Byte) + Zeilenvorschub) (= 40 Byte) * 2 ^ 128 = 1,361 * 10 ^ 16 YB (Yottabyte)
quelle
4^64 - 1
?Zimtgummi, 16 Bytes
Probieren Sie es online aus. (TIO begrenzt die Ausgabe)
Erläuterung
Der
g
Modus versetzt Zimtgummi in den Erzeugungsmodus . Der Rest der Zeichenfolge wird in diesen regulären Ausdruck dekomprimiert:Anschließend wird ein Generator aller möglichen Zeichenfolgen erstellt, die dem regulären Ausdruck entsprechen, und durchläuft diesen und druckt die einzelnen Zeichenfolgen aus.
Etwas amüsanterweise
([0-9a-f]{4,4}:){7,7}[0-9a-f]{4,4}
komprimiert sich der Golf-Regex tatsächlich zu einer längeren Saite als der Regex darüber.quelle
Commodore BASIC 2.0, 339 Bytes
Um hexadezimale Ziffern in Kleinbuchstaben zu erhalten, wird dieses Programm im "verschobenen Modus" geschrieben (drücken
<SHIFT>+<C=>
)Die einfache Ausführung dieser Aufgabe auf dem Commodore 64 war aufgrund von Speicher, Bildschirmgröße, Datengröße und anderen Einschränkungen eine Herausforderung. Ich dachte darüber nach, die abgekürzte Darstellung zu implementieren, aber andere Einschränkungen (wie die undokumentierte Unfähigkeit, Array-Elemente als Schleifenindizes zu verwenden) bedeuteten, dass die Länge des Programms um geschätzte 1000 Bytes erhöht würde.
Zeile 7 ist eine Implementierung von
HEX$()
Commodore BASIC 2.0. Ich kann hierfür kein verwenden,DEF FN
da diese nur Zahlen und keine Zeichenfolgen zurückgeben können. Zeile 6 ist eine Unterroutine, die sie auf eine Gruppe von vier Ziffern anwendet, die erheblich kürzer gewesen wäre, wenn Funktionen Zeichenfolgen zurückgeben könnten.Die Zeilen 2 und 5 sind acht verschachtelte Schleifen, die als sieben "for" -Schleifen und als bedingtes "goto" implementiert sind, da acht "for" -Schleifen in Kombination mit den zwei "gosubs" zum Ausdrucken der Adresse den winzigen Stapel des C64 überlaufen lassen.
Ein C64 kann bei einer geschätzten Laufzeit von 1,3 * 10 ^ 31 Jahren ungefähr 1,2 Adressen pro Sekunde ausgeben.
quelle
PowerShell (v4),
193 166 162 145103 BytesTimmyDs No-Bonus-Version mit 103 Bytes:
Vorherige With-Bonus-Version bei 145 * 0,8 = 116 Bytes
Mit Hilfe von TimmyD und tomkandy , der darauf hinweist , dass
0 -eq $false
aber([bigint]0) -eq $true
. Daher werden alle meine vorherigen Versionen nicht beendet.Zuvor bei 162, bevor sich einige reguläre Ausdrücke ändern:
"Eine Herausforderung, bei der PowerShell einigermaßen wettbewerbsfähig sein sollte!" - ich, bevor ich es versuchte.
Erläuterung
quelle
for($g=[bigint]::pow(2,128);$g;$g-=1){'{0:X32}'-f$g-replace'(?=(.{4})+$)',':'-replace'^0+:',''}
for($g=[bigint]::pow(2,120);$g;$g-=1){'{0:X32}'-f$g-replace'(?=(.{4})+$)',':'-replace'^0*:',''}
for($g=[bigint]::pow(2,128);$g-gt0;$g-=1){'{0:X32}'-f$g-replace'(?=(.{4})+$)',':'-replace'^\d*:',''}
Ja, die erste Adresse ist falsch, wird aber am Ende nicht wiederholt. Beachten Sie auch, dasswhile($i)
in[boolean][bigint]0
0:
: /)$i=[bigint]::Pow(4,64);while($i-gt0){('{0:X32}'-f($i-=1)-replace'0(?=.{32})'-replace'.{4}(?!$)','$0:')}
bei 103 ...AutoIt3, 137 Bytes
quelle
4^64 - 1
?Python 2, 95 Bytes
Durchläuft einfach jede Zahl von 0 bis 2 ^ 128. Zuerst konvertiert es die aktuelle Zahl in eine hexadezimale Zeichenfolge und entfernt dann die von
'0x'
dieser Funktion angegebenen Zahlen . Als nächstes wird die Zeichenkette so angepasst, dass sie vorne 32 Nullen hat, und dann in Vierergruppen aufgeteilt. Schließlich werden die Vierergruppen mit Doppelpunkten verbunden, ausgedruckt und die aktuelle Zahl um 1 erhöht. Hat den zusätzlichen Bonus, dass Sie es bei jedem Wert starten können, wenn Sie ihm einen geben, aber keine Eingabe erforderlich ist.quelle
Haskell 111
Mit meiner eigenen Sequenzfunktion
s
verliert es keinen Speicher mehr, fühlt sich aber nicht mehr golfen.quelle
CBM BASIC v7.0 (166 Zeichen)
Marks Antwort ist für den Commodore 64 BASIC 2.0, dem ein integrierter Befehl zum hexadezimalen Drucken von Zahlen fehlt. Dank der
HEX$()
Funktion in BASIC 7.0 ist die Commodore 128-Version jedoch viel kürzer. Es passt nicht auf eine einzelne logische Zeile (die auf dem C128 auf 160 Zeichen begrenzt ist), kann jedoch im Direktmodus als zwei separate Zeilen eingegeben werden.quelle
Ruby 75
Dies ist eine rekursive Lösung, die jedes Präfix verwendet und jedes mögliche Suffix findet. Rekursiv.
quelle
x=->s,n{...};x['',8]
Tcl
341318301quelle