繰り返しクインプログラム


8

A クワインは、その唯一の出力として、自身のソースコードのコピーを生成するコンピュータプログラムです。プログラムでnが何らかの方法で指定された状態で、n回出力される可能性のあるQuineプログラムはありますか?


クインのプログラムとは何かについて詳しく教えてください。(また、FAQと、まだ読んでいない場合は良い質問をする方法を読んでください。)
Kaveh

@Kaveh:ロジックタグを再度追加しました。クインは、論理と自己参照、自己適用などの研究に端を発しているので、適切と思われます。
Vognsenによる

クインに関する素晴らしいリソース:nyx.net/~gthompso/quine.htm
Sylvain Peyronnet

3
ところで、そのようなプログラムのコードを書く必要はないと思います。その存在はクリーネの不動点定理から簡単にたどります。
Kaveh

1
@Kaveh:はい、「Quine program」という用語はGEBのHofstadterによって造られたと思います(彼は「to aritmoquine」という動詞を確かに作り出した)。しかし、私は100%確信していません。私は、誰もがGEBを読むことを強くお勧めします(少なくとも、ロジックや人工知能に興味があるすべての人)。私見、それは傑作です。
Giorgio Camerani

回答:


9

楽しい質問!ベースとして、私はウィキペディアで見つけたこのHaskell quineを使用します。

main=putStr(p++show(p))where p="main=putStr(p++show(p))where p="

p ++ show(p)の出現箇所をp ++ show(p)++ p ++ show(p)に置き換えることで、2つのコピーを印刷することができます。理由がわかると、変数の繰り返しを実現するためのパターンが明確になるはずです。

xでのfのn番目の反復を計算する次の関数を使用します。

iterateN n f x = (iterate f x) !! n

ライブラリ関数として利用できると仮定します。クインに直接その定義を簡単に埋め込むことができますが、それは正当な理由なしにプレゼンテーションを混乱させます。残りは簡単です:

main=putStr(iterateN 42(++(p++show(p)))[])
  where p="main=putStr(iterateN 42(++(p++show(p)))[])where p="

読みやすくするために改行が挿入されました。正確な自己複製が必要な場合は削除してください。


とてもよくできました!
arnab

9


Φφkkeφk=ΦekfΦfk=Φek=φkksΦfs=ΦsΦss


3

ウィキペディアのprintf-versionに基づく別の例を次に示します。

main() { int i=5; char *s="main() { int i=5; char *s=%c%s%c; while (i--)
  printf(s,34,s,34); }"; while (i--) printf(s,34,s,34); }`

短いですが、printfのインクルードがないため、実際にはそれほど良くありません。また、カウンタを2回指定する必要があります。少し長いバージョンは両方の問題を解決します:

#include <stdio.h>
#define k 5
main() { int i=k; char *s="#include <stdio.h> %c#define k %d%cmain() { int i=k;
  char *s=%c%s%c; while (i--) printf(s,10,k,10,34,s,34); }";
  while (i--) printf(s,10,k,10,34,s,34); }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.