3つのタスクのコードを書く


8

最初にプログラムを実行すると、整数シーケンスが出力されます。2回目の実行では、「メアリーは小さな子羊」の曲を印刷する必要があります。3回目の実行で、ASCIIイメージファイルが生成されます。

得点

スコアは、3回の実行それぞれの開始時のコードのバイト数とファイルコンテンツの合計になります。最も低いスコアが勝ちます。

たとえば、myprogは1500バイトで、サイズは変更されませんが、実行ごとに4バイトのファイルを書き込むため、次の実行で何を行うかがわかります。スコアは1500 +(1500 + 4)+(1500 + 4)= 4508になります。

出力

最初の出力は、133個の整数のシーケンスで、単一のスペースで区切られています。

0 89 98 179 188 197 269 278 287 296 359 368 377 386 395 449 458 467 476 485
494 539 548 557 566 575 584 593 629 638 647 656 665 674 683 692 719 728
737 746 755 764 773 782 791 809 818 827 836 845 854 863 872 881 890 908
917 926 935 944 953 962 971 980 1079 1088 1097 1169 1178 1187 1196 1259
1268 1277 1286 1295 1349 1358 1367 1376 1385 1394 1439 1448 1457 1466 1475
1484 1493 1529 1538 1547 1556 1565 1574 1583 1592 1619 1628 1637 1646 1655
1664 1673 1682 1691 1709 1718 1727 1736 1745 1754 1763 1772 1781 1790 1808
1817 1826 1835 1844 1853 1862 1871 1880 1907 1916 1925 1934 1943 1952 1961
1970

2番目の出力は、正確にこのテキストです(大文字、句読点、空白を含みます-句読点の不一致は意図的なものです):

Mary had a little lamb,
Little lamb, little lamb,
Mary had a little lamb,
Its fleece was white as snow

And everywhere that Mary went,
Mary went, Mary went,
Everywhere that Mary went
The lamb was sure to go

It followed her to school one day
School one day, school one day
It followed her to school one day
Which was against the rules.

It made the children laugh and play,
Laugh and play, laugh and play,
It made the children laugh and play
To see a lamb at school

3番目の出力は、PPM ASCII(P3)形式のこのイメージで、というファイルに残されています blue.ppm。これはPNG形式の画像です。

ターゲット画像

PPMファイルは次のようになります。

P3 50 50 255
255 255 255 255 255 255 255 255 255 255 255 255 ...
...
255 255 255

ここに完全なPPMファイルのコピーがあります

実行例(Linuxの場合)

# ls
myprog
# interpreter myprog
0 89 98 179 188 197 269 278 287 296 359 ...
# interpreter myprog
Mary had a little lamb,
Little ...
# interpreter myprog
# ls
blue.ppm
myprog
# cat blue.ppm
P3 50 50 255
255 255 255 255 255 ...

ルール

  • あなたのコードはそれ自身を変更するかもしれません。
  • 4回目のプログラムの実行は、未定義の動作です。
  • 現在のディレクトリにあるファイルに書き込むことはできますが、このファイルのサイズは、各実行の開始時にスコアに追加されます。最終的なPPMファイルはこれから除外されます。
  • 最初の2つの出力はstdout(または同様の)です。最後の出力はファイルに書き込まれ、標準出力には何も送信されません。
  • 最初の2つの出力には、オプションで末尾の空白文字(スペースや改行など)を含めることができます。
  • 圧縮または画像ライブラリを使用することはできません。独自の圧縮または画像関数を使用できますが、このコードをプログラムに含める必要があります。
  • 標準の抜け穴は禁止されています。

1
大問題!それを解決しながら、かなりの数の新しいことを学びました。
Anmol Singh Jaggi 2015年

PPMファイルには256色のステップが必要ですか、それとも同じ画像を生成できるだけですか?
オベロン2015年

画像出力ファイルは質問で述べたものと正確に同じである必要がありますか、それとも空白に違いがありますか?改行が毎回正しい場所に挿入されるように特別な注意を払っているため、これは私の答えにとって重要です。
Anmol Singh Jaggi 2015年

@OberonとAnmol Singh JaggiのPPMはP3形式で、PNGとまったく同じ画像を表示する必要があります。ビット深度、内部の空白はあなた次第ですが、それは有効なファイルでなければなりません。
ロジックナイト

回答:


9

Python(897 + 814 + 386 = 2097)

簡単な自己修正の答え。後で2回目の実行を調整する必要があります。

def p(x):print x,
map(p,[0]+filter(lambda x:sum(map(int,`x`))==17,range(1971)))
#l="ittle lamb,";M="Mary ";w=M+"went";e="verywhere that "+w;s="chool one day";I="It followed her to s"+s+"\n";j="augh and play";i="It made the children l"+j;print M+"had a l"+l+"\nL"+l+" l"+l+"\n"+M+"had a l"+l+"\nIts fleece was white as snow\n\n"+"And e"+e+",\n"+w+", "+w+",\nE"+e+"\nThe lamb was sure to go\n\n"+I+"S"+s+", s"+s+"\n"+I+"Which was against the rules.\n\n"+i+",\nL"+j+", l"+j+",\n"+i+"\nTo see a lamb at school"
#print>>file("blue.ppm","w"),"P3 50 50 255"+' '.join(" %i"%(255-255*any(a<y<b and x==c or y==d and e<x<f for a,b,c,d,e,f in[(2,48,2,47,2,37),(9,48,36,9,27,37),(9,41,28,40,9,29),(0,41,10,1,9,49),(0,37,48,36,14,49),(2,37,15,3,2,16)]))*2+" 255"for x in range(50)for y in range(50))
import sys;x=file(sys.argv[0],"r+");y='#'.join(x.read().split('#')[1:]);x.seek(0);x.truncate();x.write(y)

さらに、4回目に実行すると、安全にNOPに低下します。

'.join(x.read().split('#')[1:]);x.seek(0);x.truncate();x.write(y)

それは打つのは難しいでしょう。卑劣な自己修正コードがいつ表示されるか疑問に思っていました;-)
Logic Knight

11

Ruby、1356 1268 * 3 = 3804バイト

if File.file?(?b)
s='P3
50 50
255
'
d=e=0
[153,44,6,1,42,1,6,1,42,1,6,1,42,1,6,1,42,1,6,1,42,1,6,1,42,1,4,40,5,1,4,1,1,1,36,1,5,1,4,1,1,1,36,1,5,1,4,1,1,1,36,1,5,1,4,1,1,1,36,1,5,1,4,1,1,34,3,1,5,1,4,1,34,1,3,1,5,1,4,1,34,1,3,1,5,1,4,1,34,1,3,1,5,1,4,1,34,1,3,1,5,1,4,1,34,1,3,1,5,1,4,1,34,1,3,1,5,1,4,1,34,1,3,1,5,1,4,1,34,1,3,1,5,1,4,1,34,1,3,1,5,1,4,1,34,1,3,1,5,1,4,1,34,1,3,1,5,1,4,1,34,1,3,1,5,1,4,1,8,31,5,1,4,1,8,1,25,1,9,1,4,1,8,1,25,1,9,1,4,1,8,1,25,1,9,1,4,1,8,1,25,1,9,1,4,1,8,1,25,1,9,1,4,1,8,1,25,1,9,1,4,1,8,1,25,1,9,1,4,1,8,37,4,1,34,1,14,1,34,1,14,1,34,1,14,1,34,1,14,1,34,1,14,1,34,1,14,1,34,1,14,1,34,1,14,1,34,1,14,1,34,1,14,1,34,1,14,36,63].map{|n|n.times{s+=[" 255 255 255"," 0 0 255"][d];s+=$/if (e+=1)%50==0};d=1-d}
File.write 'blue.ppm',s
elsif File.file?(?a)
puts [["","Mary had a ","little lamb",?,,?,,"Its fleece was white as snow"],["And ","everywhere that ","Mary went",?,,'',"The lamb was sure to go"],["","It followed her to ","school one day",'','',"Which was against the rules."],["","It made the children ","laugh and play",?,,'',"To see a lamb at school"]].map{|a,b,c,d,e,f|[a+b+c+d,c.capitalize+', '+c+d,b.capitalize+c+e,f]*$/}*"

"
`touch b`
else
1971.times{|i|$><<"#{i} "if i.to_s.chars.map(&:to_i).reduce(:+)%17<1}
`touch a`
end

呼び出しを追跡するためaに、最初の実行で空のファイルを作成bし、2回目の実行で空のファイルを作成しています。

  • 最初のプログラムは、数値の特定のプロパティを使用します。
  • 2番目のプログラムは、詩の再利用可能な一連の部分を使用しますが、現在のところ、全体を単純に印刷するよりも100バイトしか節約できません。
  • 3番目のプログラムは現在、単純なランレングスエンコーディングのみを使用しています。実際に行のパスをエンコードする方法については後で説明します。

1
特に数値(これは数学の問題です)の素晴らしい解決策です。置き換えるi.to_s.chars.map(&:to_i).reduce(:+)と数バイト節約できます(j=i.to_s).sum-48*j.size
blutorange

@blutorangeああ、それは素晴らしいです。:)私はまだ画像生成を再訪したいと思います。私がそうするとき、私はあなたの提案をそれに入れます。
マーティンエンダー2015年

2回目と3回目の実行では、ソースファイルの一部を保持するだけで十分ですが、現在、最大の部分はパート3であるため、それほど効果はありません。ランレングスコーディングを使用すると、ランレングスコーディングされた行を使用すると、パート3を大幅に改善できます。
randomra 2015年

2

Python 3、1027 + 1028 + 1029 = 3084

0 or print('0 '+' '.join(str(i)for i in range(1971)if sum(map(int,str(i)))==17))
1 or print("""+$,
L$, l$,
+$,
Its fleece was white as snow

And e(@,
@, @,
E(@
The!was sure to go

#&
S&, s&
#&
Which was against the rules.

%l/,
L/, l/,
%l/
To see a!at school""".translate({43:'Mary had a l',36:'ittle lamb',40:'verywhere that ',64:'Mary went',35:'It followed her to s',38:'chool one day',47:'augh and play',37:'It made the children ',33:' lamb '}))
q=[153,44]+[e-63for e in b'E@i@E@i@E@i@E@i@E@i@E@i@CgD@C@@@c@D@C@@@c@D@C@@@c@D@C@@@c@D@C@@aB@D@C@a@B@D@C@a@B@D@C@a@B@D@C@a@B@D@C@a@B@D@C@a@B@D@C@a@B@D@C@a@B@D@C@a@B@D@C@a@B@D@C@a@B@D@C@a@B@D@C@G^D@C@G@X@H@C@G@X@H@C@G@X@H@C@G@X@H@C@G@X@H@C@G@X@H@C@G@X@H@C@GdC@a@M@a@M@a@M@a@M@a@M@a@M@a@M@a@M@a@M@a@M@a@Mc~?']
1 or open("blue.ppm","w").write("P3\n50 50\n255\n"+' '.join(q[r*2]*'255 255 255 '+q[r*2+1]*'0 0 255 'for r in range(140)).strip())
f=open(__file__);l=f.read();f.close();open(__file__,"w").write(l.replace("0 or","0 and",1).replace("1 or","0 or",1))

数値にはOEIS A166370を使用し、Mary's LambおよびASCIIバイトの手書き圧縮を使用して、PPMに数値の量を格納します。

(Ab)Pythonの機能を使用して、論理演算子の2番目の値を評価するのは、結果がまだわからない場合(短絡)1 or code0 and codeあり、評価しませんcode。次に、いくつかの置換を使用して、0 or有効にするコードの実行をa 0 andとの隣に変更1 or0 orます。

3番目の実行は、2番目の置換を強制終了し1 orます。4番目の実行は最初の置換を強制終了し、その後コードは基本的に何もしません。


2

C ++、1204 * 3 = 3612バイト

使用コンパイラー- フラグ 付きGCC 4.9.2-std=c++14

#include<bits/stdc++.h>
int i,j,c;
using namespace std;int main(){fstream f("F"),g("G");if(!f){while(i<=1970){j=i,c=0;while(j)c+=j%10,j/=10;if(c==17||i==0)cout<<i<<" ";i++;}ofstream f("F");}else if(f&&!g){cout<<R"(Mary had a little lamb,
Little lamb, little lamb,
Mary had a little lamb,
Its fleece was white as snow

And everywhere that Mary went,
Mary went, Mary went,
Everywhere that Mary went
The lamb was sure to go

It followed her to school one day
School one day, school one day
It followed her to school one day
Which was against the rules.

It made the children laugh and play,
Laugh and play, laugh and play,
It made the children laugh and play
To see a lamb at school)";ofstream g("G");}else{ofstream F("blue.ppm");F<<"P3 50 50 ";vector<int> L={1,2,4,10,13,16,19,25,28,43,76,103,109,127,190,460};vector<string> R={"1","?","43","10","6","161=","1","14","39","10","4","1514121<","1","151412","33","10","12","1315141;","1","13151417","30","10","1","1514171","7",":1814171","36","01","1","41","11",";191","35","01","1",">"},C={"255","0"};string r;i=j=0;while(i<R.size()){stringstream S(R[i]);S>>c;while(c--)r+=R[i+1];i+=2;}i=0;while(i<r.size()){c=L[r[i]-48];while(c--){F<<C[j]<<" ";}j=1-j;i++;}}}

説明 -:

#include<bits/stdc++.h>
using namespace std;

int main()
{
    fstream f( "F" ), g( "G" ); // Creating empty files so that the program can decide when to run which task

    /**************************** TASK 1 ****************************/

    if ( !f ) // Print all the numbers within the range whose sum of digits is 17
    {
        for ( int i = 0; i <= 1970; i++ )
        {
            int j = i, c = 0;
            while ( j )
            {
                c += j % 10, j /= 10;
            }
            if ( c == 17 || i == 0 )
            {
                cout << i << " ";
            }
        }       
        ofstream f( "F" );
    }

    /**************************** TASK 2 ****************************/

    else if ( f && !g )  // Print the second task as it is using raw literals
    {
        cout << R"(Mary had a little lamb,
Little lamb, little lamb,
Mary had a little lamb,
Its fleece was white as snow

And everywhere that Mary went,
Mary went, Mary went,
Everywhere that Mary went
The lamb was sure to go

It followed her to school one day
School one day, school one day
It followed her to school one day
Which was against the rules.

It made the children laugh and play,
Laugh and play, laugh and play,
It made the children laugh and play
To see a lamb at school)";

        ofstream g( "G" );
    }

    /**************************** TASK 3 ****************************/

    else // Third task using Run-Length encoding
    {
        ofstream F( "blue.ppm" );
        F << "P3 50 50 ";

        /*
        L = set of all the lengths found during run-length encoding.
        R = vector containing the run-length encoding of "255" and "0" alternatingly.
                {1,"?") means 1 times print '255'/'0' "x" number of times where x = L[ASCII(?)-48] = L[15] = 469
        C = vector containing the two strings to be printed alternatingly.
        */

        vector<int> L = {1, 2, 4, 10, 13, 16, 19, 25, 28, 43, 76, 103, 109, 127, 190, 460};
        vector<string> R = {"1", "?", "43", "10", "6", "161=", "1", "14", "39", "10", "4", "1514121<", "1", "151412", "33", "10", "12", "1315141;", "1", "13151417", "30", "10", "1", "1514171", "7", ":1814171", "36", "01", "1", "41", "11", ";191", "35", "01", "1", ">"};
        vector<string> C = {"255", "0"};
        string r; // Contains the normal/expanded version of R
        i = j = 0;

        while ( i < R.size() ) // Expanding "R" into normal form and putting it into "r"
        {
            stringstream S( R[i] );
            S >> c; // Convert R[i] to its integer representation and put it in "c" with the help of stringstream.
            while ( c-- )
            {
                r += R[i + 1];
            }
            i += 2;
        }

        i = 0;
        while ( i < r.size() )
        {
            c = L[r[i] - 48];  // "c" is the number of times the current character has to be printed consecutively.
            while ( c-- )
            {
                F << C[j] << " ";
            }
            j = 1 - j; // Alternate "255" and "0"
            i++;
        }
    }
}

1

PHP (1552 * 3)+2 = 4658

できるゴルフがたくさんあります。

コードは1バイトをと呼ばれる別のファイルに書き込みz、ステータスを確認します。

これがコードです:

<?$Y=base64_decode;$Z=gzdecode;$r=file_put_contents;switch(include z){case 2:$M=Mary;$l=lamb;$L=ittle;$H="$M had a l$L $l,";echo"$H
L$L $l, l$L $l,
$H
Its fleece was white as snow
";$W="$M went";$H="verywhere that $W";echo"
And e$H,
$W, $W,
E$H
The $l was sure to go
";$S=chool;$O="$S one day";$I="
It followed her to s$O";echo"$I
S$O, s$O$I
Which was against the rules.";$L="augh and play";$I="
It made the children l$L";echo"$I,
L$L, l$L,$I
To see a $l at s$S";$r(z,3);break;case 3:$r($Z($Y("H4sIAAAAAAAAA+3ay63CMBSE4X2qSAkRKH3QfzXAmkf8mBOfiX9dRXcBfIJ47Ewwj/uyb+u+Lbd9fx+r4gACAgICApoO2l5/Jf+X0icCfT4gG7ka0DSQQMdPOopB9bv5BpqeG6D2F8tjQK6AImJAroAiYkCugCJiQK6AemKQ51bWF+oaxe6Rk2DhAQUKjIIEIU9Xg8gTkBIiT0BKKG+e8nXMcVBRDFr3oyQIq4ADVLW1JNnfbEYkafYcJR+oatZLtrebEfluPVAAVDNKkn3yZoQfazhAvXkaW4WNTvQkEIUcSAlRyIGUEIUcSApRyIGUEIUcSAlRyIGUEIUcSAlRyH+/w/H7qudDXUHMf+nhpq4NGlM28196KOFtx5iy6XPpyTdiyaEhZdPg3p0S3gaN+baOAnVViAKV6bz4QxSoTOflAhAF6v95yfdVTT7otOEPCSNQ+Sgl/1jc9RhAhrOfux8HyG/2Gy6xE0J+v+AyXGInhAxnv98SOyFkOPspWA6Q3+w3XGInhChYQBGQ4ez3W2InhAxnPwXLAfKb/RfYvQqH8o0aENBJ0BPXPoC/PXEAAA==")),'blue.ppm');$r(z,1);break;default:echo$Z($Y("H4sIAAAAAAAAAxXSuQHAMAwCwFUYIehF+y8WXCWWaDj7gw4ncA+Uv7eIOcQKIf/fIPuQI+QuUj5fo+pQLdQsagclz67QeegSuhc9g95Gy/NLTBwmhanF9GCmMVsYeXeB5WFD2FxsDbYbO4XdxMr7I/QdREGxUA5UDXVBk9AGJGfuw33CcXExuGxcFa4TN4FbuvIHfq/091p/rk26N+nipN7R1RnuznB5htsz9GbuzzQA0wJMEzBtwNRbWIFlBpYdWIZgWYJlCpbe1hhsa7DNwbYH2yBsi7BNwtaLGIVjFY5ZOHbhGIZjGY5pOLbh6OWswzUPl+8+DcS1ENdEXBtxjcS1kku+sJ0oQ1GWokxF2YoyFmUtylzG4HsbDt/n3NG5C+cunbty7tq5G7738/3WJLxlVAIAAA=="));$r(z,2);}

これは非常に恐ろしいコードであることを知っているので、リストを試してみることができます。

しかし、ちょっと、私はそれらのパターンを見つけることができません:/


最後の行で画像を圧縮し、他の行の子羊の歌のサイズを最小化したことがわかりますが、整数シーケンスがどこにあるかはわかりません。ガイダンスが必要です。
ロジックナイト

@CarpetPythonより多くの圧縮。最後のパートです。
Ismael Miguel

ありがとう。整数シーケンスのパターンを探している場合、他のいくつかの答えがいくつかの手掛かりを与える可能性があります。例:数字の桁には興味深い特性があります。
ロジックナイト

@CarpetPython私は模倣者ではありません。しかし、私は他の答えを調べましたが、それでもパターンを見つけることができませんでした。
Ismael Miguel

1

Ruby、691 + 612 + 225 = 1528バイト

別の自己修正の答え、今度はルビーで。私は昨日これにぶつかっただけで、詩の圧縮が私の目を引きました。私は生のテキストの考えから92バイトしか節約できませんでした。

puts (0..1970).select{|i|eval(i.to_s.gsub /\B/,'+')%17<1}*' '
File.write $0,%@
m='lamb:little 0,:Mary :2had a 1:2went:laugh and play:It made the children 5:It followed her to 10: was : that :11 one day:school:everywhere:3
1 1
3
Its fleece8white as snow

And 1294,
4, 4,
1294
The 08sure to go

7
10, 10
7
Which8against the rules.

6,
5, 5,
6
To see a 0 at 11'
12.downto(0){|i|m.gsub! i.to_s,m.split(':')[i]}
puts m.split(':')[13].gsub /^./,&:upcase
File.write $0,%!a=[1]
s=[16,13]
File.write 'blue.ppm',(' P3
50 50 '+[460,a*43,[19,127]*6,13,a*39,[s,4,109]*4,s,4,a*33,10,s,[103,10,s]*12,25,a*30,s,25,[76,28,13,25]*7,a*36,13,[103,43]*11,a*35,190].flatten.map{|i|('255 '*i)+'0 0 '}*' ')[1..-6]!@

プログラムを実行するたびに、次の実行のためにプログラムが書き換えられます。他の答えを見直すまで、数字の特別な性質を理解しませんでした。そして、マーティンの答えも同じインスピレーションを受けましたが、それが機能する理由を理解できなかったため、ブルートレンジからの提案は使用しませんでした。

詩からスカベンジするバイトはおそらくあと数バイトありますが、多くはありません。これは基本的には一般的なシーケンスで下塗りするだけであり、シーケンスの順序を置き換えるパーツとして使用しています。

最後の部分では、255バイトすべてを配列に長さエンコードし、ゼロと一緒に接着しました。そして、その配列の繰り返しシーケンスをエンコードしました。


0

JavaScript + HTML、3909バイト

これは、ページのリロードを使用してファイルを再実行するHTML / JavaScriptアプリケーションです。PPMの解析に失敗しました。PPMファイルの読み方がわかっている場合は、お知らせください。Stack Exchangeはローカルストレージを許可しません。したがって、JSFiddleを実行する必要があります。

繰り返しますが、ppmファイルを爆撃しました。

でも最後には:

JavaScript:1,232バイト* 3 = 3696

HTML:71バイト* 3 = 213

合計:3909

JSFiddle

var mary = '</br>\
Mary had a little lamb,</br>\
Little lamb, little lamb,</br>\
Mary had a little lamb,</br>\
Its fleece was white as snow</br>\
</br>\
And everywhere that Mary went,</br>\
Mary went, Mary went,</br>\
Everywhere that Mary went</br>\
The lamb was sure to go</br>\
</br>\
It followed her to school one day</br>\
School one day, school one day</br>\
It followed her to school one day</br>\
Which was against the rules.</br>\
</br></br>\
It made the children laugh and play,</br>\
Laugh and play, laugh and play,</br>\
It made the children laugh and play</br>\
To see a lamb at school\
';
var img = '<img src="http://i.stack.imgur.com/sHCba.png"/>'

function run() {
  var step = localStorage.getItem("step");
  step++;
  localStorage.setItem("step", step);
  $('#step').text(step);
  var r = $('#results')
  switch (step) {
    case 1:
      for (var i = 0; i < 133; i++) {
        r.append(i + 1 + ' ');
      }
      break;
    case 2:
      r.html(mary);
      break;
    case 3:
      r.html(img);
      localStorage.setItem("step", 0);
      break;
    default:
      localStorage.setItem("step", 0);
      break;
  }
}
run();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label>Step: <span id='step'></span>
</label>
<div id='results'></div>


こんにちは@NeoapttとPPCGへようこそ。回答が要件を満たしていることを確認するには、質問を注意深く読む必要がある場合があります。整数シーケンスが必要なシーケンスと一致せず、画像がPPM形式のファイルに書き込まれていません。問題の要点は、パターンを利用して、プログラム内に3つの出力を圧縮された方法で格納するように挑戦することです。また、ネットワークからファイルをダウンロードすることは、質問で禁止されている「標準の抜け穴」の1つではありません。
ロジックナイト

これらの抜け穴については、meta.codegolf.stackexchange.com/questions/1061/…で読むことができます。
ロジックナイト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.