Escrevendo código para três tarefas


8

Quando você executa seu programa primeiro, ele deve imprimir uma sequência inteira. A segunda execução deve imprimir a música 'Mary teve um cordeirinho'. A terceira execução deve produzir um arquivo de imagem ASCII.

Pontuação

Sua pontuação será a soma de seus bytes de código e qualquer conteúdo de arquivo no início de cada uma das três execuções. Menor pontuação ganha.

Por exemplo, myprogtem 1500 bytes e não altera seu tamanho, mas grava um arquivo de 4 bytes a cada execução para saber o que fazer na próxima execução. A pontuação seria 1500 + (1500 + 4) + (1500 + 4) = 4508.

Resultado

A primeira saída é essa sequência de 133 números inteiros, separados por espaços únicos:

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

A segunda saída é exatamente este texto (incluindo maiúsculas, pontuação e espaço em branco - a pontuação inconsistente é intencional):

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

A terceira saída é esta imagem no formato PPM ASCII (P3) deixada em um arquivo chamado blue.ppm. Esta é a imagem no formato PNG:

imagem alvo

O arquivo PPM deve ser algo como isto:

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

Há uma cópia do arquivo PPM completo aqui .

Exemplo de execução (no 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 ...

Regras

  • Seu código pode se modificar.
  • A execução do programa pela quarta vez é um comportamento indefinido.
  • Você pode gravar em um arquivo no diretório atual, mas o tamanho desse arquivo será adicionado à sua pontuação no início de cada execução. O arquivo PPM final é excluído disso.
  • As duas primeiras saídas são para stdout (ou similar). A última saída é gravada em um arquivo, sem nada enviado para stdout.
  • As duas primeiras saídas podem opcionalmente ter um caractere de espaço em branco à direita (por exemplo, espaço ou avanço de linha).
  • Você não pode usar bibliotecas de compactação ou imagem. Você pode usar suas próprias funções de compactação ou imagem, mas esse código deve ser incluído no seu programa.
  • As brechas padrão são proibidas.

1
Ótimo problema! Aprendeu algumas coisas novas ao resolvê-lo.
Anmol Singh Jaggi

O arquivo PPM precisa ter 256 etapas de cor ou deve ser capaz de gerar a mesma imagem?
Oberon

O arquivo de saída da imagem deve ser exatamente igual ao mencionado na pergunta ou pode haver diferenças nos espaços em branco? Isso é vital para minha resposta, pois tomei um cuidado especial para que as novas linhas sejam inseridas no lugar certo todas as vezes.
Anmol Singh Jaggi

@Oberon e Anmol Singh Jaggi, o PPM deve estar no formato P3 e mostrar exatamente a mesma imagem que o PNG quando visualizado. A profundidade de bits, o espaço em branco interno é com você, mas deve ser um arquivo válido.
Logic Knight

Respostas:


9

Python (897 + 814 + 386 = 2097)

Resposta simples de modificação automática. Vou ter que refinar a segunda corrida mais tarde.

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)

Além disso, se executado pela quarta vez, ele é degradado com segurança para um NOP:

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

Isso vai ser difícil de vencer. Eu queria saber quando algum código de auto-modificando sorrateira parece ;-)
Logic Cavaleiro

11

Ruby, 1356 1268 * 3 = 3804 bytes

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

Para acompanhar a chamada, estou criando um arquivo vazio ana primeira execução e um arquivo vazio bna segunda execução.

  • O primeiro programa usa uma certa propriedade dos números.
  • O segundo programa usa várias partes reutilizáveis ​​dos versos, mas atualmente economiza apenas 100 bytes ao imprimir ingenuamente a coisa toda.
  • O terceiro programa atualmente usa apenas uma codificação simples de duração. Mais adiante, analisarei a codificação do caminho da linha.

1
Solução agradável, especialmente os números (que é mais um problema de matemática). Você poderia economizar alguns bytes se você substituir i.to_s.chars.map(&:to_i).reduce(:+)com(j=i.to_s).sum-48*j.size
blutorange

@blutorange Oh, isso é legal. :) Ainda quero revisitar a geração de imagens. Vou trabalhar sua sugestão quando o fizer.
Martin Ender

Você só precisa manter uma parte do seu arquivo de origem para a segunda e a terceira execuções, mas talvez não seja tanto ganho quanto a maior parte é a parte 3 atualmente. Com a codificação de comprimento de execução, as linhas codificadas de comprimento de execução podem melhorar bastante a parte 3.
Random # 9/15

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))

Utiliza OEIS A166370 para os números, alguma compactação escrita à mão para Mary's Lamb e bytes ASCII para armazenar as quantidades de números no PPM.

(Ab) usa o recurso Python para avaliar apenas o segundo valor para operadores lógicos se o resultado ainda não for conhecido (curto-circuito): 1 or codee 0 and codenão avaliar code. Em seguida, usa algumas substituições para alterar a 0 orexecução de código que permite a um 0 andea próxima 1 orpara 0 or.

A 3ª execução mata a segunda substituição, pois não há mais 1 or. A quarta execução mata a primeira substituição, após a qual o código basicamente não faz nada.


2

C ++, 1204 * 3 = 3612 bytes

Compilador usado - GCC 4.9.2 com -std=c++14sinalizador

#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++;}}}

Explicação -:

#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

Há muito golfe que pode ser feito.

O código grava 1 byte em outro arquivo chamado z, para verificar o status.

Aqui está o código:

<?$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);}

Eu sei que este é um código MUITO horrível e posso tentar jogar na lista.

Mas ei, não consigo encontrar um padrão naqueles: /


Percebo que você compactou a imagem na última linha e minimizou o tamanho da música lamb nas outras linhas, mas não consigo ver onde está a sequência inteira. Eu preciso de alguma orientação.
Logic Knight

@CarpetPython Mais compactação. É a última parte.
Ismael Miguel

Obrigado. Se você está procurando o padrão na sequência inteira, algumas das outras respostas podem fornecer algumas dicas. por exemplo: os dígitos dos números têm uma propriedade interessante.
Logic Knight

@CarpetPython Eu não sou uma cópia-gato. Mas dei uma olhada nas outras respostas, mas ainda não consegui encontrar o padrão.
Ismael Miguel

1

Ruby, 691 + 612 + 225 = 1528 bytes

Outra resposta auto-modificadora, desta vez em rubi. Ontem esbarrei nisso ontem e a compressão do poema chamou minha atenção. Eu só consegui salvar 92 bytes do pensamento de texto bruto.

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]!@

Cada execução do programa reescreve o programa para a próxima execução. Eu não descobri a propriedade especial dos números até olhar as outras respostas. E tive a mesma inspiração da resposta de Martin, mas não usei a sugestão de blutorange porque não conseguia descobrir por que funcionava.

Provavelmente há mais alguns bytes para extrair do poema, mas não muito. Basicamente, está apenas subdividindo em seqüências comuns e está usando a ordem da sequência como peça a ser substituída.

Para a parte final, codifiquei todos os 255 bytes em uma matriz e os colei com os zeros. E então codifiquei as seqüências repetidas nessa matriz.


0

JavaScript + HTML, 3909 bytes

Este é um aplicativo HTML / JavaScript que usa o recarregamento de página para executar novamente os arquivos. Eu brinquei em analisar o PPM. Se você souber ler arquivos PPM, entre em contato. O Stack Exchange não permite armazenamento local. Então você terá que executar o JSFiddle.

Novamente, eu sei que bombardeei o arquivo ppm.

Mas no final:

JavaScript : 1.232 bytes * 3 = 3696

HTML : 71 bytes * 3 = 213

Total : 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>


Olá @Neoaptt e bem-vindo ao PPCG. Pode ser necessário ler a pergunta com atenção para garantir que sua resposta atenda aos requisitos. Sua sequência inteira não corresponde à sequência necessária e a imagem não é gravada em um arquivo no formato PPM. O objetivo da pergunta é desafiá-lo a armazenar as três saídas de maneira compactada dentro do seu programa, explorando padrões. Além disso, o download de arquivos da rede é uma das "brechas padrão" proibidas na questão.
Logic Knight

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.