「ごまかす」ウマ


56

長い間潜んでいる、初めてのポスター。だからここに行きます。

quiineのWikipediaページでは、「それ自体のソースコードを見ると、quineは「ごまかし」と見なされます」と書かれています。あなたの仕事は、独自のソースコードを読み取るこれらの「不正行為」の1つを作成することです。

これはなので、バイト単位の最短コード(各言語で)が勝ちます。つまり、5バイトのPythスクリプトは21バイトのPythonスクリプトに勝るものではありませんが、15バイトのPythonスクリプトには勝っています。

ファイルI / Oを使用してソースコードを読み取る必要があるため、公式のWikipediaページから取得した次のJavaScriptコードは無効です。

function a() {
    document.write(a, "a()");
}
a()

ディスク上のファイルのソースコードにアクセスする必要があります。

ファイル名を指定することはできません。ファイル名自体を検出する必要があります。

みんなクリア?行け!


1
元のファイルに存在しない末尾の改行は許可されていますか?
isaacg

3
@isaacg IMHOそれはソースコードではないので、それは馬鹿ではありません。
mınxomaτ

3
ソースの場所にハードコードされた文字列を想定するのではなく、実際のファイル名を決定するという要件を述べる必要があります。
feersum

3
しかし、特定のファイル名を要求することはこの挑戦的な方法を簡単にするという@feersumに同意します。
mınxomaτ

1
(コンパイルされた言語の場合)ソースコードが同じフォルダーにあると仮定できます(つまり、ソースを取得するためにarg [0]に ".cpp"または ".hs"を追加するだけです)。
HEGX64

回答:


60

Zsh、4バイト

<$0

Zシェルにはネコ科の機能が組み込まれています。4番目の文字は改行です。

オンラインでお試しください!

コードはファイル名にはまったく依存しません。ファイル名にスペースや改行などの特殊文字が含まれている場合でも機能します。

テスト走行

$ cat "my quine.sh"
<$0
$ zsh "my quine.sh" 
<$0
$ diff -s <(zsh "my quine.sh") <(cat "my quine.sh")
Files /dev/fd/63 and /dev/fd/62 are identical

28
feline functionalities:)
theB

48

バッシュ、6バイト

cat $0

基本的に。


3
改行は出力されません。
アディソンクランプ

2
cat(少なくとも私のシステムでは)改行を追加しません。
spaghetto

7
@isaacg catは、指定されたファイルの内容をバイトごとに印刷します。
デニス

2
@LukStormsしかし、これはcat解決策ではなく、bash解決策ではないでしょうか?そして猫は実際にはプログラミング言語として適格ではありません
ファビアンシュメングラー

30
ファイルに名前が付けられている場合、これは機能します-eか?
マークPlotnick

32

UNIX実行可能ローダー、10バイト

#!/bin/cat

標準エラーでスパムを気にしない場合は、1バイト短くすることができます。

#!/bin/dd

7
私はこれが好き。ただし、「言語」としての資格があるかどうかはわかりません。
ケビン

おそらく少しずるいのですが、パスを短くするためにbinフォルダーとcatプログラムの名前を変更できませんでしたか?
ジェームズウェブスター

3
私はあなた btw をすることを提案していませんできる
ジェームズウェブスター

3
@Kevin「言語」(つまり、インタープリター)はcatです。そして、あなたが非常に具体的になりたいのなら、catプログラムは単にそれ自体を印刷し、存在するすべてのファイル形式と互換性があります:)
l0b0

1
@JamesWebster sudo install /bin/cat /c。念の/binため、ルートファイルシステム上にない場合に備えて。catシングルユーザーでそれを持っている必要があります…
ブラックライトシャイニング

25

C、52

s[99];main(){read(open(__FILE__,0),s,99);printf(s);}

もちろん、これはコンパイルされたプログラムではなくソースコードを読み取ります-私はそれが仕様内にあると仮定します。


printf代わりにputsを使用して、末尾の改行を回避できます。
feersum

@feersumはい、良いキャッチ
デジタルトラウマ

19
@DigitalTraumaそれはもちろんあなたのアバターのせいです
ピーターオルソン

3
実際にputsは、使用することができます、あなたはreadより少ない文字に必要です。
user4098326


13

PHP、21バイト

<?=file(__FILE__)[0];

fileファイルを1行ずつ配列に読み込みます。ファイルには1行しかありません。これにより、と比較して1バイト節約できますreadfile(__FILE__)


これはPHP5.4以降でのみ機能することに注意してください。これは、配列の逆参照をサポートする最初のバージョンでした。しかし、それ以外は非常に良い答えです!
イスマエルミゲル

1
readfileまた、21:<?readfile(__FILE__);です。
プリモ

1
必要ありません<?=
ファビアンシュメングラー

12

Perl、15バイト

open 0;print<0>

@ ThisSuitIsBlackNotのおかげで3バイト節約できました


2
open 0;print<0>
-ThisSuitIsBlackNot

@ThisSuitIsBlackNot私はそれを行うには短い方法があったと確信していたが、私は使用して...私の仕事それを生活のためにできなかった0と仮定し$0、その後?
ドムヘイスティングス

3
うん。参照perldoc -f open:「ショートカットとして、1引数呼び出しは、ファイルハンドルと同じ名前のグローバルスカラー変数からファイル名を$ARTICLE = 100; open(ARTICLE) or die "Can't find article $ARTICLE: $!\n";
取得し

11

Perl 6、20バイト

print slurp $?FILE

私はPerl 6をあまり長く使ったことがないので、これを短くするコツがあるかどうかはわかりません。


2
2番目のスペースを削除できますか?
イーブイ

3
@イーブイ、いや、怒る
ホット

11

osascript(コマンドラインからのAppleScript)、40 33 32バイト

(私へのパスを読む)のパラグラフ1

と呼ばれるファイルで実行しますosascript a

ファイルの最初の段落(行)を取得し、末尾の改行(コード内の改行)を付けてSTDOUTに出力します。


1
OPの編集を参照してください
-TheInitializer

動作させるための作業。
アディソンクランプ

read path to me私のために働くようです。エルキャップ
デジタル外傷

これは見ませんでしたが、これが私がやった方法です。:Pありがとう、@ DigitalTrauma。EDIT:あなたは改行を追加して、段落1を使用するように、末尾の改行は、考慮されなければならない
アディソンCrumpの

11

Python 2、32バイト

ファイルの最後に改行があります。

print open(__file__).readline()

Python 3、33バイト

ファイルの最後に改行があります。

print(open(__file__).readline())

おかげでするfeersum問題を捕捉し、供給するため__file__Loovjoを 17のバイトを保存パイソン2溶液への新しいアプローチのために、およびスカイラーさらに別のバイトを保存し、Python 2と3の両方で働いていたソリューションを(保留中のprintPythonで関数であります3)!

のドキュメントリンク readline


これにより、python3で2バイト節約できます。なぜなら、 endパラメーターをます。
スカイラー

@Skylerあなたは絶対に正しい。
Celeo

括弧を必要とするPython 3では、これはどのように機能しprintますか?
ドアノブ

Python 3のprint(open(__file__).readline())後には改行が必要です。
スカイラー

あなたのPython 3の例は、Python 3ではなくPython 2を言う
-TheInitializer


10

Python 2.7、30バイト

print open(__file__).read(29)

編集:明確にするために、上記のコードは最後に30番目のバイトとして改行を入れることになっています。私は、コードブロックでマークダウンを表示する方法を理解するのに十分なほどマークダウンに精通していません。

ここでは、Cのサブミットのトリックと同じトリックを使用しています。これprintは、出力に追加される追加の改行を説明するために、末尾の改行を除くソースファイル全体を読み取ります。


これは、他のサブミッションが行ったのと同じ末尾の改行の問題に遭遇しますか?
コール

いいえ。ソースコードの30番目のバイトを作成する末尾の改行があるはずですが、コードブロックに表示することはできません。私の投稿は、ソースコードの最初の29バイトを読み取り、改行printが無関係にならないようにするために機能します。
xsot

4
それはコンマがすることではありません。改行の代わりにスペースを追加します。
xsot

2
意味的に重要な改行を示すために、␤使用することができます
イーブイ

9

Java、212 196バイト(疑わしいハードコーディングルールを含む171バイト)

15バイトまで短縮してくれた@Cruncherに感謝します!

これがゴルフできることは間違いありません。

import java.nio.file.*;class A{public static void main(String[]a){new A();}A(){try{System.out.print(new String(Files.readAllBytes(Paths.get(getClass().getName()+".java"))));}catch(Exception e){}}}

または、静的メソッド(およびクラス名)を使用する別のメソッドでは、171バイトを取得します。ただし、これがハードコードされていると見なされるかどうかはわかりません。

import java.nio.file.*;class A{public static void main(String[]a)throws Exception{System.out.print(new String(Files.readAllBytes(Paths.get(A.class.getName()+".java"))));}}

コンストラクターを使用して、非静的メソッドによってクラス名を取得します。静的メソッド(A.class.getName())の使用は本当にハードコーディングされていたため、「適切な」方法を使用しました。を使用してA.class.getName()、このコードは171バイトに短縮されます。

読み取り可能なバージョン:

コンストラクターとを使用してthis.getClass()

import java.nio.file.*;
class A{
    public static void main(String[]a) {
        new A();
    }
    A(){
        try{
            System.out.print(
                new String(
                Files.readAllBytes(
                Paths.get(
                getClass().getName()+".java"))));
        }
        catch(Exception e) {}
    }
}

静的メソッドの使用A.class.getName()

import java.nio.file.*;
class A {
    public static void main(String[] a) throws Exception {
        System.out.print(
             new String(
                  Files.readAllBytes(
                       Paths.get(
                            A.class.getName()+".java"))));
    }
}

ファイルのすべてのバイトを一度に取得し、STDOUTに出力します。とても簡単です。


なぜ使用しないのA.class.getName()ですか?
ファビオF.

3
CodeReviewではなくCodeGolfです!;)
ファビオF.

1
@FabioF。ええ、しかし、ハードコードされたファイル名であることのルールに反していると思います。これはルールに反しています。重要なのは、ファイルの名前を変更する場合、クラスの名前を変更する必要があることは明らかですが、ハードコーディングされたファイル名のようなこの行も変更する必要があります。
ランチャー

1
コンストラクター内でprintステートメントを呼び出して、静的変数を設定する手間を省くことができませんか?
ランチャー

1
@Cruncher Nah。java.ioを取得します。java.nioに固執します-ポイントは勝つことではなく、さまざまな方法で非常に簡潔に行う方法を示します。
アディソンクランプ

8

AutoIt、34バイト

自身をクリップボードに出力します:

ClipPut(FileRead(@ScriptFullPath))


7

Go、111 105バイト

package main
import("io"
."os"
."runtime")
func main(){_,p,_,_:=Caller(0)
f,_:=Open(p)
io.Copy(Stdout,f)}

Goでの最初のコードゴルフ–ここで使用できるいくつかのトリック。


Goにはすでに答えがあります-これは同じ方法を使用していますか?
アディソンクランプ

@VoteToClose:実は、他の1つに触発されましたが、ここでパッケージの名前を変更する(安いトリック)と、ファイルを開いてstdoutにパイピングするためのさまざまな手法を使用しました。大量の22バイトを保存してくれました
;

この方法は実際には少し違う、良い方法です!
ファビアンシュメングラー

7

PowerShell、39 36 31 25バイト

私はそれを得ることができるほどタイトです:

gc $MyInvocation.MyCommand.Path | oh

一般的な需要に支えられて、これは次のように変更されました。

gc $PSCommandPath|echo -n

するプリントシェルホスト現在の標準出力を。


gc $MyInvocation.MyCommand.Path十分です。自動的に印刷されます。
アンドリュー

特にスクリプトがサイレントモードで実行されている場合は保証されません
チャドバクスター

はははい、私は気にしません。他にPowerShellの回答がなかった場合は投稿します。しかし、私はそれgcがエイリアスであることを忘れており、使用するだけだったcatので、とにかくそこにバイトがありました。
アンドリュー

ええと、私はそれについてそれほど厳しくはないでしょう。それ以外の場合、すべてのPSの回答は明示的にホストシェルにパイプする必要がありますが、それはあなた次第です
アンドリュー

代わりgc $PSCommandPathに17バイトを使用できます。私が見る問題は、これが改行(ソースには存在しない)を吐き出すことです。末尾の改行がOKかどうかは今では曖昧です...そのルールに応じてgc $PSCommandPath|write-host -n、31バイトのようなトリッキーな何かをする必要があるかもしれません。
AdmBorkBork


5

C、49バイト

s[];main(){read(open(__FILE__,0),s,48);puts(s);}

編集:明確にするために、49番目のバイトは改行です。

これは、ソースコードから最後の改行を引いたものを読み取り、puts出力の最後に追加する改行を考慮します。


このコードは、未定義の動作を2回呼び出します。
ジョシュア

5
まあ、これはコードゴルフです。私のコードは目的の出力を生成するので、有効な提出です。
xsot

1
@xsotその場合、おそらくコンパイラーのバージョン+オプションをリストする必要があります。そうでない場合、これは検証できない可能性があります。
ジャスティン

1
月のある段階で何らかのマシンで目的の出力を生成するコンパイラーがあれば、未定義の動作が許可されている場合、int main(void){* 0; }ソリューションとして。結局のところ、標準では、問題を解決するプログラムにコンパイルする実装が許可されます。コンパイラを指定する限り、実装依存の動作を使用しても問題ありませんが、未定義の動作では、同じマシン。
レイ

1
@MDXFそのソリューションを書くことを真剣に提案していませんでした。未定義の動作を許可しないことに反対しました。未定義の動作が含まれているため、既存のコンパイラでも動作するint main() {*0;} 可能性があります。同様に、xsotのソリューション、未定義の動作が含まれているため、既存のコンパイラで動作する可能性があります。どちらも問題を解決する保証はありません。(xsotの方が確かにそうする可能性が高いですが、同じように簡単にクラッシュする可能性があります)。私の実際の議論は、実装依存の動作または不特定の動作に依存するソリューションを許可すべきであるが、未定義の動作は許可しないことです。
レイ


4

Pyth、25バイト

$import sys$h'e$sys.argv

これは、そのファイル名を読み取ります。基本的に、argvを検索し、最後の引数に対応するファイルを開き、最初の行を出力します。


できませんh'$__file__$か?
kirbyfan64sos

@ kirbyfan64sosそれは私にエラーを与えますNameError: name '__file__' is not defined。PythはPythonにコンパイルされ、結果の文字列が実行されます。だから、それがうまくいくとは思わない。
isaacg

4

Go、133バイト

みんなクリア?行け!

package main
import("fmt"
"io/ioutil"
"runtime")
func main(){_,f,_,_:=runtime.Caller(0)
s,_:=ioutil.ReadFile(f)
fmt.Print(string(s))}

2
これにより、Goで独自の(そして最初の)コードゴルフソリューションを書くことになりました。いくつかの一般的なトリックを探している場合、たとえば、パッケージに1文字の名前を適用することにより、ここで123文字まで簡単に移動できますr"runtime"
-tomasz

4

> <>、13バイト

0:0go:c=?;1+!

オンライン通訳とオフライン通訳の両方でテスト済み。このgコマンドは、ソースファイルから読み取ることができるのに最も近いものであり、このチャレンジの目的に当てはまらない場合は、エントリを非競合としてマークします。私はそれが通常、クインの「不正行為」と考えられていると思います。

オンラインでお試しください。


4

Haskell、63バイト

科学のために!

import System.Environment
main=getProgName>>=readFile>>=putStr

runhaskellコマンドでのみ機能します。非常にクールな
HEGX64

4

> <>、31バイト

免責事項:> <>にはファイルI / Oはありませんが、Be <>>に影響を与えた言語の1つであるBefungeから継承したコードスペースI / Oを紹介するのは面白いと思いました。

00voa0+1;!?$~<
1+> :r:@g: ?!^o$

少し前に作った自読のクイン。ここで試してみることができます

短い> <>自己読解クインがあるのを見ました。コードゴルフ標準では明らかに優れていますが、コード長がハードコーディングされていることを指摘したいと思いますが、私は追加の行または列のコードをコピーします(元のコードを壊さない限り)。


「あなたは、ソースコードを読み取るために、ファイルI / Oを使用しなければなりません」:私は> <>内の投稿を考えていたが、私が原因ルールには不可能であろう> <>と思った
SP3000

実際、@ Sp3000は、私が課題を十分に読んでいないように見えます。免責事項を追加します
アーロン

3

F#、54バイト

printf"%s"(System.IO.File.ReadAllText __SOURCE_FILE__)

使用法:

fsi --exec a.fsx

3

Perl 5の、15、13バイト

これを刺激したBashソリューションの功績:

print`cat $0`

編集:セミコロンまたは最初のスペースは必要ありません。


純粋なperlではなく、他の実行可能ファイル、つまりcatに存在し、検索可能なものが必要$PATHです。しかし、それが存在する場合、それはに利用可能な単なるコマンドと見なすことができますperl
ゴラーランブラー

3

Node.js、66 63バイト

p=process;p.stdout.write(require('fs').readFileSync(p.argv[1]))

console.log改行を追加するを使用しません。


1
同期APIを使用して、数バイトを保存できますp=process;p.stdout.write(require('fs').readFileSync(p.argv[1]))
。– TehShrike

1
なぜconsole.log(require('fs').readFileSync(process.argv[1]))\n57バイトではないのですか?
コナーオブライエン

これは常に機能するとは限りません。ファイルの名前がであるとしtest.jsます。を実行して呼び出すことは有効node testであり、これによりエラーがスローされます。
パトリックロバーツ



3

JavaScriptを使用したHTML、115バイト(実際にはカウントされません)

<!DOCTYPE html><html><title>x</title><script>alert(new XMLSerializer().serializeToString(document))</script></html>

これはカウントされますか?私は気にしません、それは楽しかったです:)

技術的にはファイルを開きません。整形式のHTML5ドキュメントでもあります。XMLSerializerは、DOCTYPE部分も返す唯一のツールでしたが、非標準です。それでも、それはchromeとfirefoxで動作します、そして私は他のブラウザを賭けます。

ボーナスとして:

JavaScript、41バイト

alert(document.currentScript.textContent)

削除する ";" 最後に、1バイトを保存します:)
ЕвгенийНовиков17年

1
@ЕвгенийНовиковあなたは正しいです、なぜ私が当時それを残したのか分かりません。私はそれを数えなかったようです。
ドミノ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.