すべてのIPv6アドレスを印刷する


45

これは、数年前に誰かが急流「ハッカーツール:すべてのIPアドレスの完全なリスト」をアップロードしたことを思い出します。これは、もちろん、生成された〜40億のIPv4アドレスのリストでしたが、何千もの「h4xx0rz」がそれをダウンロードしました。ママ、imahackerを見てください!

これは当時でしたが、今日では誰もがIPv6に切り替えています。(右?)

あなたの仕事は、すべてのIPv6アドレス出力するプログラムを書くことです。

入力を一切受け取らず、IPv6アドレスを1行に1つずつ出力し、他の出力を出力しない完全なプログラムを作成する必要があります。プログラムは、無効なものも含めて、2 128の可能なアドレスすべてを印刷する必要があります。各住所は1回だけ印刷する必要があります。アドレスは任意の順序で印刷できます。

各アドレスは、コロンで区切られた4つの16進数の8つのグループで完全に印刷できます。たとえば、

2001:0db8:85a3:0000:0000:8a2e:0370:7334

あなたの裁量で、RFC 5952の標準的な略語のいずれかを使用できます。

  • グループ内の先頭のゼロは省略できますが、0それ以上短縮することはできません。
  • :: 1つまたは複数のすべてゼロのグループのシーケンスを短縮するために、アドレスごとに最大1回使用できます。
  • 16進数では、小文字または大文字を使用できます。

あなたが達成した場合、RFC 5952から表現勧告を(小文字のみ、最短の表現と::、それは使用することができ、複数の場所がある場合はできるだけ早くとして使用)、あなたが得る-20%のボーナスを

出力のサイズが原因で、プログラムがそこに座っている間に終了することはありません。プログラムは、ある時点で外部の手段によって中断される可能性があります(Ctrl+ C、電源を抜くなど)。プログラムは出力をストリームとして生成する必要があります。そのため、「合理的な」待機の後、いくつかの行が生成されます。基本的に、最後に印刷するためだけにメモリに巨大な文字列を作成することは許可されていません。「標準」PCでメモリ不足になるプログラムはすべて失格となります。(それでも、プログラムが十分な時間実行されない場合、すべてのIPv6アドレスを出力して終了する必要があります。)

(この状態が、完了するまでプログラムを実行してから出力を表示するWebインタープリターにとって問題であり、ホストされたインタープリターがない場合は、問題の小さいバージョンでプログラムをテストし、慎重に調整しますフル2 128まで。)

スコアは、プログラムのバイト単位の長さで、ボーナスを獲得した場合は0.8倍されます。それはコードゴルフですので、最低スコアが勝ちます。


22
これは5.445 *10¹⁵ヨッタバイトです。そのすべてのデータを保存するには、ハードドライブ以外の何も含まれていない、地球規模のデータセンターを少なくとも15個必要なだけきつく詰め込んでおく必要があります。それは.....一つの大きな急流だ
カズウルフ

7
@Mewしかし、gzipのような一般的な圧縮を使用して、ファイルがどれだけ小さく圧縮されるのか疑問に思っています。
SztupY

35
@SztupY:どうやら、出力は25バイトに圧縮できるようです(圧縮解除アルゴリズム= Pythインタープリター、圧縮アルゴリズム= PPCGへの投稿)
ベンフォークト

3
私の経験では、@ Gillesは本当にヘビー級です!SOの小さなPPCGコーナーにご質問をお寄せいただきありがとうございます。ネットワーキング関連の質問を見るのも楽しいです。
デジタル外傷

5
これは、SOに関する「可能なすべてのGUIDを反復する」という質問を思い出させます。
MikeTheLiar

回答:


5

Pyth、21バイト

KJ^8CdWJj\:ct.H+K=tJ4

J反復子変数としてwhileループを使用します。を使用して最大値を初期化し8^chr(' ')ます。その初期値を追加してパディングし、16進数に変換してから最初の文字を削除します。


そのコードは、誰かがキーボードをこっそり盗んで、それをきれいにしようとしたようです。
ダークスカイ

@darkskyあなたのためのgolflangsそれ:P
Esolangingフルーツ

50

Python 3、65バイト・0.8 = 52.0

from ipaddress import*
n=4**64
while n:n-=1;print(IPv6Address(n))

7
ダンパイソン!常に適切なメソッドがあります!:D
MayorMonty

ipaddresspython3のみです。

@ Hurricane996、ええ、私はPyPIから Python 2でそれを使用していましたが、Python 3の標準ライブラリにしか入らないことに気づかなかったので、1バイトを犠牲にしてPython 3に切り替えました。
アンデルスカセオルグ16

@MDXF Pythonは持っ++かいない-の演算子を
ドラコ連合

14

Pyth、27 25 24バイト

注:コードには以前バグがあり、修正すると1バイト節約されました

J^4 64WJj\:c%"%032x"=tJ4

のようなアドレスを印刷します

ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe
ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffd
ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc
...
0000:0000:0000:0000:0000:0000:0000:0003
0000:0000:0000:0000:0000:0000:0000:0002
0000:0000:0000:0000:0000:0000:0000:0001
0000:0000:0000:0000:0000:0000:0000:0000

パッド演算子を使用した以前の(より複雑な)バージョン(24バイトも):

J^4 64WJj\:c.[\032.H=tJ4

説明

J^4 64                  set J to 2^128
WJ                     while J is not 0:
            =tJ               decrement J
    %"%032x"                 format to length-32 hex string
   c           4            split every 4 chars
j\:                        join by : and print

Pyth、21バイト(無効)

jmj\:c.[\032.Hd4^4 64

これは、1)少なくとも2 132バイト(2 52ヨビバイト)のメモリを消費し、2)インタープリターがそれを好まない(2 128が収まらないため、そのサイズのsがssize_tないため)実行できないlist。アドレスを辞書式順序で出力します。最後に数字を使用可能なものに変更することにより、アルゴリズムを試すことができます。


1
どうでしょう...「「標準」PCでメモリ不足になるプログラムはすべて失格です。」
TessellatingHeckler

2
@TessellatingHeckler最初のものは、繰り返し実行されるため、そうではありません。2番目は、明らかに無効とマークしました。
-PurkkaKoodari

12

C(GCC拡張付き)、76バイト* 0.8 = 60.8

__uint128_t i;main(){char s[50];for(;inet_ntop(10,&i,s,49),puts(s),++i>0;);}

これは、128ビット整数のGCC拡張を使用して、からに単純にカウントアップ::ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffffます。 inet_ntop()-20%のボーナスを請求できるように、各住所を正しくフォーマットします。

出力

使用sed千万までの出力にすべての万行を:

$ ./ipv6all | sed -n '1~1000000p;10000000q'
::
4042:f00::
8084:1e00::
c0c6:2d00::
9:3d00::
404b:4c00::
808d:5b00::
c0cf:6a00::
12:7a00::
4054:8900::
$ 

注:私はリトルエンディアンx86_64マシンを使用しており、ネットワークアドレスは通常ネットワーク順(ビッグエンディアン)であるため、を使用してエンディアンネスを効果的に交換しinet_ntop()ます。これは重要ではありません-すべてのアドレスが(最終的に)引き続き表示されます。


11

CJam、36 27バイト

G32#{(_"%032x"e%4/':*oNo}h;

@Dennisのおかげで-9バイト(CJamに文字列フォーマットがあることを忘れていました)。アドレスを小文字および降順で出力します。

明らかな理由から、オンラインではなくJavaインタープリターを使用してください。G32#ただし、オンラインテスト用の小さなものに置き換えることができます。たとえば、最後の100個です。

説明

G32#             16^32 = 2^128. Call this n
{ ... }h;        While loop. The final ; is to pop n at the end
 (               Decrement n
 _               Copy n
 "%032x"e%       String format to hex, padded to 32 digits
 4/              Split into groups of 4
 ':*             Join with colons
 oNo             Output with newline

1
おもしろいのは、当然のことながら、オンライン通訳者がサイズを処理できないことを超えて、誤った結果を出力することです。ループを削除し、最初の値のみを印刷する場合、印刷し0000:0000:0000:0000:0000:0000:ffff:ffffます。文字列の書式設定はオンラインで異なる動作をする可能性があります。オフライン版でも問題なく動作することを確認した。
レトコラディ

n同じであるoNoTIO
エソランジングフルーツ

8

Python 2.7、67バイト

n=4**64
while n:n-=1;s='%032x'%n;exec"s=s[4:]+':'+s[:4];"*7;print s

コロンの挿入に使用される方法の副作用として、アドレスは右端の列が左側に表示されて印刷されます。

ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
fffe:ffff:ffff:ffff:ffff:ffff:ffff:ffff
fffc:ffff:ffff:ffff:ffff:ffff:ffff:ffff
...
0003:0000:0000:0000:0000:0000:0000:0000
0002:0000:0000:0000:0000:0000:0000:0000
0001:0000:0000:0000:0000:0000:0000:0000

1
回転は本当にきれいです!
遅ればせながら

3
右端の列が左側にあると言うと、無効なIPv6アドレスが出力されますが、列が正しい場所にある場合はになります[printing] the addresses in any order。;)
TessellatingHeckler

7

Verilog、335

私の最初のVerilog提出は、おそらくより多くのゴ​​ルフを使用することができますが、私は今、そうするためのエネルギーを持っていません。cクロック、oASCII出力です。短縮ではなく、パディングがゼロであるため、フォーマットボーナスの対象にはなりません。

module b(output[0:38]o,input c);reg[127:0]a;wire[0:39]d;assign o=d[0:38];always @(posedge c) a<=a+(~(&a));genvar i,j;generate for(i=0;i<8;i=i+1) begin:q for(j=0;j<4;j=j+1) begin:r assign d[5*i+j]=a[16*i+4*j:16*i+4*j+7]>9?{4'h6,a[16*i+4*j:16*i+4*j+7]-9}:{4'h3,a[16*i+4*j:16*i+4*j+7]};end assign d[5*i+4]=8'h3A; end endgenerate endmodule

これは、出力ASCIIを作成するためのビットトゥイドルリングが続く単純な反復です。最後のグループの後、小さなハックでコロンを切り刻みます。ISE 13.7 lin64のxc3s500e-4ft256-4で合成および動作するようです。


6

C、91-126バイト

私の元のバージョン、119バイト。

long a[9],i;
f(long*x){if(65536&++*x)*x=0,f(x+1);}
main(){for(;!a[8];f(a))for(i=7;i+1;i--)printf(i?"%lx:":"%lx\n",a[i]);}

最高のゴルフ用ポータブルっぽいバージョン、103バイト(これらの概念のいくつかについて@Dennisに感謝)

long*p,a[9];
main(i){while(!a[8]){
for(i=8;i--;printf(i?"%lx:":"%lx\n",a[i]));
for(p=a;++*p>>16;*p++=0);}}

説明:アルゴリズム自体はかなり簡単です。短いため、unsigned intではなくlongを使用しました。ファイルレベルで宣言すると、すべてがゼロで事前初期化されます。このf関数は、各ワードの下位16ビットで動作するキャリー付きの単純な増分です。ループは、129番目のビットに達すると終了します。

printfの逆方向の反復は、アドレスを「適切な」順序で印刷することを意味します。また、改行を印刷するためのチェックは数文字短くなります。

これは、いくつかの移植性のない構造を使用します。暗黙のint戻り値型を使用し、stdio.hを含まないため、CのK&R方言として最もよく見なされます。そして、私の使用したlongはこれによって知らされました-ほとんどの最新のシステムでは、intは32ビットなので十分です。これは、おそらくPDP-11 Unixで変更なしで実行できます。

ただし、短くすることもできます。int(16ビットよりも広い型、または2の補数や算術ロールオーバーなどの多くのシステムで発生するさまざまなプロパティを持つ16ビットの型として)を使用できると仮定すると、 longの使用に関連するもの。

16ビット、97バイトより広いintのバージョン。

a[9],*p;main(i){while(!a[8]){
for(i=8;i--;printf(i?"%x:":"%x\n",a[i]));
for(p=a;++*p>>16;*p++=0);}}

16ビットシステムのバージョン、91バイト。

a[9],*p;main(i){while(!a[8]){
for(i=8;i--;printf(i?"%x:":"%x\n",a[i]));
for(p=a;!++*p;p++);}}

奇妙なことに、元のK&Rコンパイラは実際にはintなしの宣言をサポートしていませんでした(コンパイルは正常ですが、変数を外部として扱い、リンク時に未定義です)ので、宣言を変更するにint*p,a[9];は合計94。

また、出力が完了する前に中断されるという仮定が厳しい制約であった場合、5バイトを節約して終了チェックを削除できます。

ボーナス:完全なANSIポータブルバージョン、126バイト:

#include<stdio.h>
long*p,i,a[9];
int main(){while(!a[8]){
for(i=8;i--;printf(i?"%lx:":"%lx\n",a[i]));
for(p=a;++*p>>16;*p++=0);}}

すべてのバージョンの改行は、読みやすくするため、および空白が不要な場所に挿入さ#includeれ、ANSIバージョンの行の後の改行を除き、バイトカウントから除外されます。

ANSIバージョンを除くすべてのバージョンは、mainの最後で終了するため、オペレーティングシステムに誤った終了コードを返す場合があります。


1
通常、ここでは移植性は問題になりません。これは私のマシンで動作します: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--状態チェックについて考えるべきでした。
Random832

これをテストしたときに、キャリーまでずっと実行しましたか?私のマシンは、バージョンをロールオーバーした後、a [0]にランダムな値を入れます。
Random832

はい。私のマシンでは、最初の6,553,601 IPアドレスが正しく印刷されます。
デニス

Ideoneはどちらかそれ好きではないが、それはcodepadに動作します:におけるラップa[0]でラップa[1]
デニス

5

AutoIt3、142の 231バイト

For $a=0 To 2^32-1
For $b=0 To 2^32-1
For $c=0 To 2^32-1
For $d=0 To 2^32-1
$s=StringFormat("%08x%08x%08x%08x",$a,$b,$c,$d)
For $j=0 To 8
ConsoleWrite(StringMid($s,$j*4+1,4)&($j<7?":":""))
Next
ConsoleWrite(@LF)
Next
Next
Next
Next

説明

  • For $a=0 To 2^32-1:0-2 ^ 32((2 ^ 32)^ 4 = 2 ^ 128)の可能な組み合わせで4回反復します。
  • $s=StringFormat("%08x%08x%08x%08x",$a,$b,$c,$d):数値を32(4 * 32)の長さの16進文字列に変換します。
  • For $j=0 To 8:文字列の8つのセクションすべてを反復処理します。
  • ConsoleWrite(StringMid($s,$j*4+1,4)&($j<7?":":"")):文字列から次の4文字を抽出し:、最後のセクションに到達していない場合は最後にコロン()を追加し、すべてをコンソールに出力します
  • Next:内側のforループを終了します
  • ConsoleWrite(@LF):行末に改行を追加します
  • Next:外側のforループの終了

予想される出力サイズ:(1行(39バイト)+改行)(= 40バイト)* 2 ^ 128 = 1.361 * 10 ^ 16 YB(ヨッタバイト)


じゃない4^64 - 1
アンデルスカセオルグ

AutoItができるので@AndersKaseorgどうやら私は、でも2 ^ 32-1に4つのループを使用する必要がパース 4 ^ 64のような大きな値を、しかし、ループ内で使用するためにそれらを格納することはできません整数は唯一の2 ^ 32に上がるので、 AutoItで-1。
ジャイアントツリー

5

シナモンガム、16バイト

0000000: 678b 36d0 b54c d44d 8bc5 455b 8d0c 0500  g.6..L.M..E[....                               .

オンラインでお試しください。(TIOは出力を制限します)

説明

このgモードは、シナモンガムを生成モードにします。残りの文字列は、この正規表現に解凍されます。

[0-9a-f][0-9a-f][0-9a-f][0-9a-f]:[0-9a-f][0-9a-f][0-9a-f][0-9a-f]:[0-9a-f][0-9a-f][0-9a-f][0-9a-f]:[0-9a-f][0-9a-f][0-9a-f][0-9a-f]:[0-9a-f][0-9a-f][0-9a-f][0-9a-f]:[0-9a-f][0-9a-f][0-9a-f][0-9a-f]:[0-9a-f][0-9a-f][0-9a-f][0-9a-f]:[0-9a-f][0-9a-f][0-9a-f][0-9a-f]

次に、正規表現に一致するすべての可能な文字列のジェネレーターを作成し、それを反復処理して、それぞれを出力します。

やや面白いことに、ゴルファーの正規表現は([0-9a-f]{4,4}:){7,7}[0-9a-f]{4,4}実際には上記の正規表現よりも長い文字列に圧縮されます。


4

Commodore BASIC 2.0、339バイト

小文字の16進数を取得するために、このプログラムは「シフトモード」で記述されています(を押します<SHIFT>+<C=>

1k=65535:a=0
2fOb=0tok:fOc=0tok:fOd=0tok:fOe=0tok:fOf=0tok:fOg=0tok:fOh=0tok
3x=a:goS6:?":";:x=b:goS6:?":";:x=c:goS6:?":";:x=d:goS6:?":";:x=e:goS6:?":";:x=f
4goS6:?":";:x=g:goS6:?":";:x=h:goS6:?
5nE:nE:nE:nE:nE:nE:nE:nE:a=a+1:ifa<65536tH2
6y=x/4096:goS7:y=x/256aN15:goS7:y=x/16aN15:goS7:y=xaN15:goS7:reT
7?mI("0123456789abcdef",y+1,1);:reT

Commodore 64でこの作業を行うことは、メモリ、画面サイズ、データサイズ、およびその他の制限のため、簡単なことではありませんでした。省略表現を実装することを検討しましたが、他の制限(配列インデックスをループインデックスとして使用できないなど)は、プログラムの長さを推定で1000バイト増やすことを意味していました。

7行目は、HEX$()Commodore BASIC 2.0に欠けているの実装です。DEF FNこれらは文字列ではなく数字のみを返すことができるため、これを使用することはできません。行6は、4桁のグループに適用するサブルーチンです。関数は文字列を返すことができれば、かなり短くなります。

2行目と5行目は8つのネストされたループであり、7つの "for"ループと条件付きgotoとして実装されます。

C64は、1.3 * 10 ^ 31年の推定実行時間で、毎秒約1.2アドレスを出力できます。


4

PowerShell(v4)、193 166 162 145 103バイト

103バイトのTimmyDのボーナスなしバージョン:

$i=[bigint]::Pow(4,64);while($i-gt0){('{0:X32}'-f($i-=1)-replace'0(?=.{32})'-re‌​place'.{4}(?!$)','$0:')}

145 * 0.8 = 116バイトの以前のwith-bonusバージョン

以下からの助けを借りてTimmyDtomkandyことを指摘し、0 -eq $falseしかし([bigint]0) -eq $true。したがって、以前のバージョンはすべて終了しません。

$i=[bigint]::Pow(4,64);while($i-gt0){$i-=1;[IPAddress]::Parse((('{0:X32}'-f$i
)-replace'0(?=.{32})'-replace'.{4}(?!$)','$0:')).IPAddressToString}

以前は162で、正規表現が変更される前:

$i=[bigint]::Pow(4,64)
while($i){$i-=1;if(($x='{0:X32}'-f$i).Length-eq33){$x=$x.Substring(1)}
[IPAddress]::Parse(($x-replace'.{4}(?!$)','$0:')).IPAddressToString}

「PowerShellが適度に競争力を発揮する必要があるチャレンジ!」-私、試してみる前に。

説明

# PowerShell (PS) has no IP address arithmetic, e.g. IP + 1
#- PS has no 128 bit integers
#- PS has no automatic bignums

# Start from the top, with the BigInteger specialised Power()
$i = [BigInt]::pow(4,64)

# Loop 4**64 through 1, work with $i-1 for ff... -> ::0
while ($i) {
    # PS has no decrement operator for bignums
    # (no using $i-- in the while loop test)
    $i-=1

    # The Net.IPAddress class can't turn a BigInteger
    # into an IPv6 address directly. And because it mashes
    # IPv4 and IPv6 into one class, there's no obvious way 
    # to make a small number always cast to an IPv6 address.
    # Format the bignum as a string of 32 hex digits.
    $x = '{0:X32}' -f $i

    # The BigInteger often formats as /33/ hex digits, 
    # with a leading zero (to avoid unintentional +/- sign bits)
    # ( https://msdn.microsoft.com/library/dd268287 )
    # So remove the leading 0, if there is one
    if (($x).Length-eq33){$x=$x.Substring(1)}

    # I can't always remove the leading zero, because it 
    # can't parse FFFFF... into an address without colons
    # and this regex replace into groups of 4 with colons
    # would go wrong at length 31. No : after the last group
    # This is still better than split/join ... because there
    # isn't a split-into-groups-of-N that I know of.
    $x = ($x -replace '.{4}(?!$)', '$1:'

    # Woo! * 0.8 bonus! 45 characters to save 38! :D
    [IPAddress]::Parse($x).IPAddressToString

}

95ボーナスなし。[bigint]を紹介してくれた2人のおかげで、それはかなり便利です(そもそも上流階級でやるべきではないことのために...)for($g=[bigint]::pow(2,128);$g;$g-=1){'{0:X32}'-f$g-replace'(?=(.{4})+$)',':'-replace'^0+:',''}
tomkandy

ごめんなさいfor($g=[bigint]::pow(2,120);$g;$g-=1){'{0:X32}'-f$g-replace'(?=(.{4})+$)',':'-replace'^0*:',''}
-tomkandy

for($g=[bigint]::pow(2,128);$g-gt0;$g-=1){'{0:X32}'-f$g-replace'(?=(.{4})+$)',':'-replace'^\d*:',''}はい、最初のアドレスは間違っていますが、最後には繰り返されません。またwhile($i)、あなたのものはゼロで停止しないことに注意してください[boolean][bigint]0
-trueと

@tomkandyああ、すごい、$ i = 5をintに設定することで最後までテストしたに違いない。(Complex 0も$ falseではなく、空の文字列でもありません。「Pythonではない」ことにもっと注意を払う必要があります)。ありがとう!(そして、このスクリプトは、先頭の0:
コードを削除し

ボーナスのために行くない@TessellatingHecklerは悲しげに13あることは短いバイト- $i=[bigint]::Pow(4,64);while($i-gt0){('{0:X32}'-f($i-=1)-replace'0(?=.{32})'-replace'.{4}(?!$)','$0:')}103で...
AdmBorkBork

3

AutoIt3、137バイト

For $i=0 To 4^64
$s=StringFormat("%032x",$i)
For $j=0 To 7
ConsoleWrite(StringMid($s,$j*4+1,4)&($j<7?':':''))
Next
ConsoleWrite(@LF)
Next

私はそれを知っていますが、私はここで新しいです:(
rav_kr

知っていることを確認してください。ありがとう。
mbomb007

じゃない4^64 - 1
アンデルスカセオルグ

2

Python 2、95バイト

def i(p=0):
 while p<4**64:print':'.join(hex(p)[2:].zfill(32)[4*s:4*s+4]for s in range(8));p+=1

0から2 ^ 128までのすべての数字を単純に調べます。まず、現在の数値を16進数の文字列に変換してから、'0x'その関数が与える値を取り除きます。次に、文字列を調整して、先頭に32個のゼロを置き、4つのグループに分割します。最後に、4つのグループをコロンで結合し、それを出力して、現在の数に1を加えます。追加のボーナスがあり、値を指定すると任意の値で開始できますが、入力は不要です。


あなたの答えが関数である場合、あなたはそれを呼び出す必要はありません:)
ベータ崩壊

@BetaDecayそれは私の誤解でした。一定!ありがとう。
ステータス

2

ハスケル111

s[]=[[]]
s(a:b)=[y:z|z<-s b,y<-a]
r=replicate
main=mapM putStrLn$s$tail$concat$r 8$":":r 4"0123456789abcdef"

独自のシーケンス機能を使用するsと、メモリリークは発生しなくなりますが、もはやゴルフを感じることはありません。


メモリ不足にならないようにどのようにコンパイルしますか?私のghc v7.10.2およびstd。メモリをリークするオプションをコンパイルします。
nimi

2

CBM BASIC v7.0(166文字)

a=65535
fOi=0toa:fOj=0toa:fOk=0toa:fOl=0toa:fOm=0toa:fOn=0toa:fOo=0toa:fOp=0toa:?hE(i)":"hE(j)":"hE(k)":"hE(l)":"hE(m)":"hE(n)":"hE(o)":"hE(p):nE:nE:nE:nE:nE:nE:nE:nE

Markの答えは、Commodore 64のBASIC 2.0 に対するものです。これには、16進数で数字を印刷するための組み込みコマンドがありません。ただし、HEX$()BASIC 7.0 の機能のおかげで、Commodore 128バージョンははるかに短くなっています。1つの論理行(C128では160文字に制限されています)には収まりませんが、ダイレクトモードでは2行に分けて入力できます。


ループの半分が欠落しているようです。IPv6アドレスは128ビットであり、64ビットではありません。
マーク

@マーク:これを指摘してくれてありがとう!問題を修正しました。
サイコノー

2

ルビー75

x=->s,n{n>0?65536.times{|m|x.(s+?:*(8<=>n)+m.to_s(16),n-1)}: p(s)};x.('',8)

これは、各プレフィックスを取得し、可能なすべてのサフィックスを見つける再帰的なソリューションです。再帰的に。


ラムダと短い関数定義を取得しますx=->s,n{...};x['',8]
ドアノブ

0

Tcl 341 318 301

proc ip6 {p c} {
    set s %x:%x:%x:%x:%x:%x:%x:%x
    set p [scan $p $s]
    while {[set d 7]} {
        $c [format [string map {x 04x} $s] {*}$p]
        while {[set i [lindex $p $d]]==0xFFFF} {
            lset p $d 0
            if {!$d} return
            incr d -1
        }
        lset p $d [incr i]
    }
}
ip6 fFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:0000 puts
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.