
以下に定義された言語GNの実行環境を作成し、以下のコードの出力を答えよ。
コード:sample.gn
GNのソースコードは単一の自然数である。
自然数を素因数分解することで指数の列が得られる。これがGNの実行時コードであり、命令および引数の列として解釈される。
たとえば、140は以下のように素因数分解され、下のLのような指数列(実行時コード)が得られる(以下aのb乗を a^b と表記する)。
2^2 × 3^0 × 5^1 × 7^1
L = [2, 0, 1, 1]
GN処理系は実行時コードの他にメモリとポインタを持つ。メモリは0で初期化された配列である。ポインタは配列の1つの位置を指す。
配列のサイズに制限はない。
ポインタは初期状態では配列の先頭を指し、初期状態では配列の要素はすべて0である。
また、処理系はプログラムカウンタを持ち、実行時コードを順次読み取って実行していく。
GNには以下の命令がある。
1, 2, 3, 4は引数を取り、実行時コードにおける命令の次の数が引数と見なされる。
例:
以下の自然数はGN上で実行すると\"Hello, world\"と出力する。
(10進数で2549桁の単一の自然数である)。
29581065270371479325227996328936846374431939693985901273918307582487327251714
94768562797967767791353683984427184175305738772740817794303117459326899541206
50305923259595867797790830861414486245570197481943009141937393478519254592623
80460776409945241666135623515576457155760725038527507713373195753840321861085
03148970156449175074409887898580659181652308190829461283105527716558509971171
00585841124580842176999224686311435125443133573722387838379101162089342248150
56462226666882530174655780271625913963384886674152874071941491472885863796958
87919666898513170631508841858989819604606752959377354973492879737029573862057
49418575898230498297058460494614139696447798744339993290643718474803535681851
03295523592054828279601510522112950624511845959364749007304372247726955205674
38056979131690276862280608024105855730894533729219856785845215550245697436767
10407545622181498088386167225544770290201359679919065682293247595708926680895
74211399791805222568952095995256252248902719526394425129893518226411894600368
67345298889288924274466825053092613188922878835327989119600295386395503698862
05517802082168209040967139565731178758462622264580273406877487185569012374153
38986663521515597576432050010490570504527907897009191488803056624918907967834
45568816827659494534242295903360985151725439042881081032379047571797141936775
89032225540163775143775195191697235338607548787578386096656654519105312369898
59315547896023826570664551604385678906166598725895539784981711730494441169160
25601160329731957570803475380231503771671324112842032176089902223607357360446
66979409795839400222830525166192418824494868509199387161602772615126093725457
01792279019667077356159457410658886724671519854857068411934463176224738604890
94633908384682646165133753390151541443663740150177010720207586961819385399629
44741821479341324925069511950553158581415038774659110445219317270766122671116
11092259163430235480690598804849118327628391206883654739630149776484521527377
97917653276358529255902736894343871854272216226959652772794277755213060409118
72171851035663187888059868529870606313778126063559058600073876724536181539541
70922891452510819586444258045366147848520158737104588535487342991983517189086
07965285579214281908952118348104600013332745261002986234514290014721956476199
05898893446632819634167535131321124798375086054813417063612318652805342321168
49067814201073431828182895925127899475576135468554103954262763021618348515222
89864445776833038861694455079563683655730424420424402052839761921269259134204
46498648255688324533461144512563408834920929418684622218943072671185984665477
06749550
素因数分解すると以下の実行時コードが得られる。
[1, 2, 2, 1, 3, 72, 6, 2, 1, 3, 1, 1, 1, 4, 1, 7, 2, 1, 5, 1, 3, 2, 2, 3, 2,
9, 6, 2, 1, 3, 1, 1, 1, 4, 1, 7, 2, 1, 5, 1, 4, 2, 3, 3, 7, 6, 2, 1, 3, 1, 1, 1,
4, 1, 7, 2, 1, 5, 1, 5, 2, 4, 3, 0, 6, 2, 1, 3, 1, 1, 1, 4, 1, 7, 2, 1, 5, 1, 6,
2, 5, 3, 3, 6, 2, 1, 3, 1, 1, 1, 4, 1, 7,
2, 1, 5, 1, 7, 2, 6, 3, 67, 6, 2, 1,
4, 1, 1, 1, 4, 1, 7, 2, 1, 5, 1, 8, 2, 7, 3, 12, 6,
2, 1, 4, 1, 1, 1, 4, 1, 7,
2, 1, 5, 1, 9, 2, 8, 3, 87, 6, 2, 1, 3, 1, 1, 1, 4, 1, 7, 2, 1, 5, 1, 10, 2, 9,
3, 8, 6, 2, 1, 4, 1, 1, 1, 4, 1, 7, 2, 1, 5, 1, 11, 2, 10, 3, 3, 6, 2, 1, 3, 1,
1, 1, 4, 1, 7, 2, 1, 5, 1, 12, 2, 11, 3, 6, 6, 2, 1, 4, 1, 1, 1, 4, 1, 7, 2, 1,
5, 1, 13, 2, 12, 3, 8, 6, 2, 1, 4, 1, 1, 1, 4, 1, 7, 2, 1, 5, 1, 14]

