15

Rで quine (「独自のソース テキストのコピーを完全な出力として生成するプログラム」: http://www.nyx.net/~gthompso/quine.htm ) を構築した人はいますか? ([quine] タグは、Python、Java などで多くの例を引き出しますが、R ではないようです。)

f <- function() { body() }

近づく:

> f()
{
    body()
}

しかし、関数の名前がありません。

最短の可能性はどうですか?最も難読化された?

編集:以下のさまざまな回答から、自己参照性とそれが発生する必要がある環境を定義するにはさまざまな方法があるようです。

  • R環境内: function ->function (@bill_080)
  • OS/シェル環境内: program ->program [多かれ少なかれプログラム->テキストと同等]: (@kohske)
  • その他: 関数->テキスト (@JoshUlrich、@James、上で定義した問題)

ノート:

  • @Spacedman によって指摘された R-helpのスレッド (簡潔さよりも難読化を強調しているようです)identical(quine,quine())は、環境が引き継がれるため注意が必要ですが、これは良いテスト ケースであることを示唆していidentical(quine,quine(),ignore.environment=TRUE)ます。
  • 最近 (2015 年 10 月)のブログ投稿では、別の答えが提供されています ...
4

5 に答える 5

22

これは私が思いつくことができる最短です:

> "f" <- function() call("<-", "f", f)
> f()
"f" <- function () 
call("<-", "f", f)
于 2011-06-27T17:23:29.997 に答える
21

これは、完全な出力として独自のソース テキストのコピーを生成するプログラム(関数ではない)である実際の Quineです。

コンソールでは、

# y1.R is a quine program
$ cat y1.R
(function(x){cat(x);cat('(');cat(intToUtf8(0x0022));cat(x);cat(intToUtf8(0x0022));cat(')')})("(function(x){cat(x);cat('(');cat(intToUtf8(0x0022));cat(x);cat(intToUtf8(0x0022));cat(')')})")

# execute y1.R and show output
$ /usr/bin/R --vanilla --slave < y1.R
(function(x){cat(x);cat('(');cat(intToUtf8(0x0022));cat(x);cat(intToUtf8(0x0022));cat(')')})("(function(x){cat(x);cat('(');cat(intToUtf8(0x0022));cat(x);cat(intToUtf8(0x0022));cat(')')})")

# save the output of the execution of y1
$ /usr/bin/R --vanilla --slave < y1.R > y2.R

# compare input and output -- exactly same.
$ diff y1.R y2.R

おそらくこれは最短のものではありません。

更新しました:

少し短いバージョン:

(function(x){cat(x,'(',d<-intToUtf8(0x0022),x,d,')',sep='')})("(function(x){cat(x,'(',d<-intToUtf8(0x0022),x,d,')',sep='')})")
于 2011-06-27T18:25:19.063 に答える
6

bodyインスピレーションとして何を使用callして、呼び出しコマンドを再現するために使用できます。

f <- function () 
{
    call("<-", as.name(as.character(sys.calls()[[1]])), sys.function(sys.parent()))
}

どの出力:

> f()
f <- function () 
{
    call("<-", as.name(as.character(sys.calls()[[1]])), sys.function(sys.parent()))
}
于 2011-06-27T16:48:07.840 に答える
1

関数を返す関数が必要な場合.....多分これ?

junk <- function(...) {
  function(...) {
    structure(junk(...))
  }
}

出力は次のとおりです。

> junk()

function(...) {
    structure(junk(...))
  }
<environment: 01ef8e50>


> boo <- junk(999)
> boo

function(...) {
    structure(junk(...))
  }
<environment: 020e1048>


>dput(boo)

function (...) 
{
    structure(junk(...))
}
于 2011-06-27T17:15:02.223 に答える