さまざまなプリンターを使用して1〜15を印刷


22

汎用性のある整数プリンターを作成することは素晴らしいことですが、多くの異なる数字を印刷する単一のコードを書くのは面倒です。数字を出力するだけでなく、次の数字を取得するための新しいスクリプトを作成するスクリプトを作成する方が簡単ではないでしょうか?

チャレンジ:

単一の整数Nと実行可能コードを出力するコードを記述します。次のコードが出力さN+1れ、出力可能なコードが出力されますN+2。に到達するまでこのパスを続けますN = 15。(最後に印刷される番号は15でなければなりません)。

ルール:

  • 入力なし(入力が空であると想定)。
  • 完全なプログラムまたは機能、またはその他の便利な形式が許可されています。
  • 最初のコードが出力されるはず1です。
  • 先行ゼロを出力することはできません。あなたは印刷することができませんIE 01のために1
  • 出力はformatでなければなりませんN, Code_for_N+1。出力はコンマと単一のスペースで区切られていることに注意してください。のコードにN+1は、引用符がありません。 N , Code_for_N+1受け入れられません(コンマの前のスペース)。末尾の改行は問題ありません。
  • 出力の最初の文字は数字でなければなりません。(先行スペースなし、またはans = N)。
  • 印刷された番号は次のコードの一部であってはなりません(コードにはこの番号を含めることができますが、出力番号をコードの一部として使用することはできません)
    • 例:の出力はN=2次のとおり2, printer 2です。この場合、printer 2はのコードですN=3。出力全体を使用することはできません:の2, printer 2コードとしてN=3
  • スクリプトは異なる言語である場合があります
  • データ型は関係ありません(数値は文字列でもかまいません)が、何にも囲まれることはできません(引用符、括弧など)。
  • 出力されたコードがある場合は、N=15印刷するかSTOP!(ボーナスを参照)、何も印刷しない(スペースや改行も含めない)必要があります。
    • のコードN=15はクラッシュできません(ただし、STDERRへの出力は問題ありません)。
    • N=15プリントの出力コード16またはその他のもの(ボーナスケースを除く)の場合、失格となります。
  • 組み込みのクイン演算子は使用できません。
  • ファイルシステムを介したソースファイルへのアクセスは許可されていません。

ボーナス:

15を出力するコードが「STOP!」を出力するコードも生成する場合は-10バイト

Python構文を使用した例:(明らかに、これらは1〜15ではなく、選択した整数に対してのみ機能します。)

N = 1
print "1, print 2"
1, print 2

---
N = 15
print 15
15

---
N = 15   (Qualifies for the -10 bytes bonus)
print "15, print 'STOP!'"
15, print 'STOP!'

print 'STOP!'
STOP!

----

N = 15   (Qualifies for the -10 bytes bonus)
print "15, disp('STOP!')"
15, disp('STOP!')        (disp('STOP!') outputs STOP! in MATLAB)

----
N = 15   (This one is not OK. The submission is disqualified)
print "15, print 16"
15, print 16

標準的なゴルフ規則が適用されます!バイト単位の最小コード(N = 1の場合)が勝ちます!


だから、たとえば、f=>f+""無効になりますか?(f+""関数の構築コードを返します。)
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴ、それなしで、タスクを達成することさえ可能です
...-nicael

@nicael少なくともjsの回答では既に行われています
コナーオブライエン

1
@CᴏɴᴏʀO'Bʀɪᴇɴ...実行可能な方法で:D
ニカエル

ルールは混乱していますが、何かを出力14, print(14+1)できますか?
nyuszika7h

回答:


39

Pyth + ///、15バイト-10 = 5

pPt`S15", STOP!

これは、開始ブラケットと終了ブラケット1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, STOP!を取り除いてPythでrange(1,15+1)印刷し、すぐに「、STOP!」が続く印刷します。

次の14個のプログラムは///にあり、/またはを含まないすべてのプログラムを直接出力します\。だから2番目のプログラム

2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15

与える2と3番目のプログラム3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15。最後から二番目のプログラムは、15, STOP!、印刷物は15, STOP!、その最後のプログラムはただですSTOP!


3
生意気。私はそれが好きです。:)
マーティンエンダー

ないcat言語としてカウント?
user253751

@immibis catは素数テストを行わないため、いいえ。
user48538

1
プログラム#2以降もPHPで動作します。:)
イルマリカロネン16年

31

JavaScript、131238-10 = 131228バイト

素朴なアプローチは、予想よりも悪化しました。後知恵で私はそれを期待していたはずです。しかし、とにかく共有したいと思いました。完全なコードはこちら。

アイデア:繰り返しエスケープし、追加します N-1, ...

alert("14,alert(\"15, alert(\\\"STOP!\\\")\")")

7
これは、これまでのPPCG回答の中で最もバックスラッシュだと思います。
リルトシアスト

1
this =)にNP ++と正規表現を使用したことを認めます
-flawr

19
ハハ、この-10は大いに役立ちます:D-
ニカエル

2
私はわずかに素朴な87573バイトのソリューションを作成しました。
LegionMammal978

ボーナスなしでいくつかのバイトを保存できます。
Rɪᴋᴇʀ

8

CJam、26 25 24バイト

1{", "2$)@"_~"](_F<@*}_~

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

後続のプログラムでは、最初の番号が増加します。これにより、プログラムが16回実行されます。


または、同じスコアのボーナス付き:

1{", "\2$)_G<\@`+"_~"+"STOP!"`?}_~

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

後続のプログラムでは、最初の番号が増加します。これにより、プログラムが16回実行されます。

ボーナスの代替ソリューション:

1{", "\2$)Gmd@`+"_~"+"STOP!"`\?}_~

2
@ FryAmTheEggmancjam.tryitonline.net / はBase64を使用してプログラムをエンコードするため、コメントへのパーマリンクの投稿が少し簡単になります。</selfpromotion>
デニス

@Dennisありがとう、それは少し頭痛の種だった:Pとにかくマーティンが自分で書いたように見える。
FryAmTheEggman

@FryAmTheEggman私はあなたのリンクを見た後だけですが、提案に感謝します。;)
マーティン・エンダー

7

JavaScript(ES6)、62 61バイト-10ボーナス= 51スコア

_=>"1, "+(f=n=>`_=>"`+(n<16?n+`, "+(${f(n+1)})`:`STOP!"`))(2)

説明

独自のソースコードを読み取らず、またとんでもなく長くないソリューション。

最初のプログラムは、他の15個すべてのプログラムを作成し、再帰関数を使用してそれらを相互にネストします。文字列ではなく関数自体(出力中に文字列にキャストされる)をネストすることにより、バックスラッシュの問題を回避します。

_=>
  "1, "                // print the first number
  +(f=n=>`_=>"`+(      // f = recursive function for printing program N
    n<16?              // for programs 2 - 15:
      n+`, "+(${       // add N to the output of the nested function
        f(n+1)         // nest the code of program N + 1
      })`
    :`STOP!"`          // program 16 just outputs "STOP!" for the bonus
  ))(2)                // start from program 2

テスト


1
JavaScriptの組み込みの関数本体(quining用の灰色の領域)取得の機能を使用していないため1
Aᴄʜᴇʀᴏɴғᴀɪʟ

2
@Callodacityどのように"" + (n=>m)関数の本体を取得するとカウントしないのn=>mですか?
ニール

@Neilは実際にあなたは右のそれは、カウントんだ-私は唯一のプログラム1を見たいと出力を経ていなかったので、私はそれを見落としたい
Aᴄʜᴇʀᴏɴғᴀɪʟ

すべてのバックスラッシュはどこに行きましたか?
Noodle9

5

Matlab、226 212-10 = 202バイト

数バイトの@StewieGriffinに感謝します=)

'awFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)

最初の部分は、2行目(下)、実際のコード(ちょうど9シフト)を表す文字列です。Matlabでは、文字列は文字で満たされた行列であるため、スカラーを追加/減算するだけで簡単にシフトを実行できます。そのため、プログラムは同じ文字列*を再度出力し、さらに同じ文字列を出力しますが、結果はコードになります。

*完全ではない:最初のバイトは、各反復で増加する必要があるカウンターです。

ひもを使った馬鹿なトリックは、ここから恥知らずに盗まれました。

'awFjw|Dro)w1:26B?G:>DwF0\}xy*0Dnu|nDwFdw~v;|}{1w1:26B?2505)05<B5w1:24:5w1;Cnwm25<B5>B5w1;Cnwm26B500fDnwmDmr|y1w2';
n=ans;if n(1)-96>15;n='Stop!';else;n=[num2str(n(1)-96),', ',39,n(1)+1,n(2:end),39,59,n(2:end)-9,''];end;disp(n)

ここで、コンソールからコピーされたシーケンスの最後の数行:

>> 'mwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
13, 'nwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
>> 'nwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
14, 'owFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
>> 'owFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
15, 'pwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
>> 'pwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
STOP!

5

JavaScript、50 47 44 42 44 *バイト

a=_=>(x=1)+(x<15?", a="+a:"").replace(x,x+1)

これは、独自のボディを(ちょうどa)抽出し、その中で置換を行う関数です。関数本体にJavaScriptの組み込み機能を取得しますが、明示的にはキイン演算子ではありません(無効な場合、答えは削除されます)。

a=_=>(x=1)+(x<15?", a="+a:"").replace(x,x+1);
alert(a());

そこに適切に埋め込まれて動作しない場合(私にとっては動作しないため)、そこに例を見ることができます。


*-スニペットは結果を生成しないように見えa=、それ以上の呼び出しは不可能になります


1
「関数本体を取得するための組み込み機能」は、クイン演算子とどのように異なりますか?私はそれが無効だと言っているのではなく、違いは何なのだろうと思っていますか?
スチューウィーグリフィン

私はちょうどそれに取り組んでいた。o_oできませんか.replace(x++,x)
コナーオブライエン

3
@StewieGriffin 1つはクイニング用に作成されたもので、もう1つは正当な機能です。
コナーオブライエン

@Stewieしかし、「クイン演算子」はプログラム全体を返すことになっていますが、私の例では、クインを作成する目的なしに関数を取得します(プログラムコード全体を返すビルトインはありません)。あなたが関数を許可したので、それは同様であるかもしれません、それで私は不思議でした。
ニカエル

DOESのa=_=>(x=1)+(x<15?`, ${a}`:"").replace(x,x+1)作品?
コナーオブライエン

5

パイソン2.7.10、196 92から10 = 82のバイト

おい!!! これは楽しかったです。ずっと短くなりました。:P

n=1;a='n=%d;a=%r;print n,a%%(n+1,a)if n!=15else"STOP!"';print n,a%(n+1,a)if n!=15else"STOP!"

説明:

私はこれから始めました:

a='a=%r;print a%%a';print a%a

それは単なる単純な馬です。これは、カウンターが追加されたものです。

n=1;a='n=%d;a=%r;print n,a%%(n+1,a)';print n,a%(n+1,a)

n先頭に出力されるカウンタ変数です。次に、そのn=部分を印刷すると、の代わりn+1になり%dます。したがって、ここから無限にカウントされます。

そして、これが最終バージョンです。15で停止するif節を追加し、「STOP!」を出力します。同様に。

n=1;a='n=%d;a=%r;print n,a%%(n+1,a)if n!=15else"STOP!"';print n,a%(n+1,a)if n!=15else"STOP!"

古いコード:

a= ['if num==15:print"STOP!!!";exit()','print num','print"a=",a','print"num=",num+1', 'for s in a:print s']
num= 1
print num
if num==15:print"STOP!!!";exit()
print"a=",a
print"num=",num+1
for s in a:print s

決して勝つつもりはないが、楽しい。:P今はずっと短くなっていますが、まだチャンスはありません。:P


ワオ。これはクールだから説明を追加できますが、何が起こっているのか分かりません:D
Sherlock9

@ Sherlock9完了。感謝します。
Rɪᴋᴇʀ

これをインタラクティブなpython 2.7.6セッションにカットアンドペーストすると、elsesの前にスペースがないと文句を言います。
エリック

@eric ...私のpython 2.7.10を使用していますが、それは私の作品
Rɪᴋᴇʀ

3

PowerShellは、(215から10まで)は205の= 197 167 106 104 103バイト

$d='$c=(,1*{2}).count;$d={0}{1}{0};(("$c, $d"-f[char]39,$d,($c+1)),$c)[$c-eq15]';"1, $d"-f[char]39,$d,2

(唯一のツールがPowerShellである場合、すべての問題は爪のように見えます。お待ちください...)

基本的に、我々は設定で始まる$dalmost-のビッグOLE-長い文字列に等しいQUINE元のコードの。これは、出力し1た後、$dフォーマット演算子で-f正しく移入する{0}{1}{2}スタンドインを、インクリメント{2}でナンバー,1*{2}1ずつセクションを。

,x*yPowerShell の操作により、yアイテムの新しい配列が作成されxます。各アイテムはに等しくなります。たとえば、,2*3はと同等@(2,2,2)です。

つまり、最初の出力はで1, $c=(,1*2).length;$d=(etc...)あるため、2番目のコードが実行される$cと、配列のカウントに等しくなります。@(1,1)または2、など$c

$c等しいかどうかを計算15して配列にインデックスを付けるだけで15を出力すると停止します。0 番目の要素は$c, $d上記のとおりで、もう1つはちょうど15です。したがって、$c15のときは出力され15、それ以外は何も出力されません。"15, {0}STOP!{0}"-10を使用するには5文字が長すぎるため、ボーナスの対象にはなりません。

幅>〜150のPowerShellターミナルが必要です。または、コードをコピーして貼り付けるときに、余分な改行(端末が出力ラップに役立つように挿入する)を手動で削除します。または、出力を変数にキャプチャしてから、その変数を再実行します。等。

編集1-「STOP!」を削除して、いくつかのバイトを保存しました 文言。
編集2 -デュールは、一度だけ、それを呼び出す、.LENGTHたびに使用していない
最初の実行がたくさん短くすることができるそうするには、QUINEである必要はない-編集3
編集4 -に文字列を使用してから変更計算する配列$c。2バイトを節約しました。これは、このアプローチにほぼ最適であると確信しています。
編集5-改造ではなく、等価性を直接カウントすることで別のバイトを保存しました


Windows 10コンソールウィンドウは、出力ラップの改行をコピーしなくなりました。
ニール

2

JavaScript、79-10 = 69バイト

s='STOP!';for(i=15;i;){s=i--+',alert("'+s.replace(/[\\"]/g,"\\$&")+'")'};alert(s)

Function.prototype.toStringまったく使用せずに。



2

バッチ、73 + 5-10 = 68バイト

@set a=STOP!
@for /l %%a in (15,-1,1)do @set a=%%a, @echo !a!
@echo %a%

必要なCMD /V:ONので、そのために5バイトを追加しました。


2

Python 2.7、107文字

再帰を使用し、馬を書かないことで、私は多くを節約できると思った。それは本当だが、十分ではない。勝者ではありませんが、このアプローチは楽しいものだと思います。

N = 4の文字列を作成し、文字\"文字をエスケープすることから始めました。

print "1, print \"2, print \\\"3, print \\\\\\\"4, print \\\\\\\\\\\\\\\"STOP!\\\\\\\\\\\\\\\"\\\\\\\"\\\"\""

次に、再帰を使用して、開始インデックスと停止インデックスに基づいてこの文字列を作成するラムダ関数を作成しました。これです:

l=lambda n,m:str(n)+", print "+"\\"*(2**(n-1)-1)+"\""+l(n+1,m)+"\\"*(2**(n-1)-1)+"\"" if n<m else "STOP!"

次のように使用します。

print l(1,15)

出力:[32902文字、処理するには長すぎます]

だから、私のコルモゴロフの複雑さのアプローチはそれほど成功していないようです;-)


2

SMBF、28バイト

\x10リテラルバイト(10進値16)を表します。整数は整数(バイト)として出力されます。したがって、最初の文字出力は\x01です。その後、プログラムは「、」を出力します。独自のソースを印刷する場合+、最初に余分なものを印刷します。

+.<-<<.>.>[[<]>.[.>]<[-]], \x10

説明:

+.                                  Increment number and print
  <-                                Pre-decrement loop counter
    <<.>.>                          Print comma and space from own source
          [             ]           Only execute if loop counter != 0
           [<]>.                    Move to left of source, then print `+`
                [.>]                Print entire source.
                    <[-]            Zero out the loop counter so this program halts.
                         , \x10     The comma, space, and loop counter used earlier.
                                    Input is empty, so `,` doesn't do anything.

入力に16進リテラルが必要なため、これを標準インタープリターで実行できないことに注意してください。また、16進出力が適切に機能するために特別なターミナルが必要です。


1

Bash、78 74 73-10 = 63バイト(例、勝てない)

p='if(($((++a>15))));then unset a p;fi;echo ${a-STOP\!}${p+, $p}';eval $p

遅れて来ますが、bashが試されていなかったので、試してみました。最初の湾の挑戦と馬のようなパズル。彼らは楽しいです!

説明:

これは動作しますa1から15までのステップと、その後でunset一緒にp。スクリプト(に格納されているp)はset、それらが「STOP!」である場合に両方を出力します さもないと。算術展開で表示されるため、最初unset aset0です。


1

𝔼𝕊𝕄𝕚𝕟、30文字/ 47バイト(非競合)

⟮a=1)+(a<ḏ?⬬+ⒸⅩ222+ᶈ0:⬯)ē(a,⧺a

Try it here (Firefox only).

最後に、forの良い昔ながらの馬を見つけました。

説明

ここに私が使った本当の馬があります: ⟮ⒸⅩ222+ᶈ0

私の答えにそれが見えますか?うまくいけば、y'allがそこから拡大できるようになるでしょう。


1

+ PHP、19-10 = 10バイト

ï_(. \,,,)\!POTS(,

1から15までカウントしてから停止します。TIO

樽、13バイト

ï_(. \,,,).
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.