Superando o tamanho do cluster

37

Cansado da confiabilidade do armazenamento flash, você decidiu armazenar todos os seus programas em um daqueles bons e antigos disquetes de 1.440 KiB. No entanto, depois de copiar nem 3.000 programas, o disco estava cheio. Como isso é possível? Hábil na arte do código golf como você é, a maioria dos seus programas não tem nem 100 bytes de comprimento, portanto, deve haver muito espaço sobrando ...

Depois de perguntar sobre o Superusuário, você descobre que foi prejudicado pelo tamanho do cluster do sistema de arquivos , uma trama maligna dos designers do FAT12 que deixa uma parte significativa do seu disquete sem uso e obriga a comprar mais do que realmente precisa.

Compre mais disquetes? Nunca! O tamanho do cluster será menos problemático se simplesmente salvarmos vários programas em um arquivo, o que é possível porque diferentes compiladores / intérpretes se comportarão de maneira diferente para o mesmo código-fonte.

Tarefa

Escreva uma poliglota que se encaixe em um único cluster (512 bytes ou menos) e resolva o maior número possível de tarefas a seguir.

  1. Leia todas as entradas e imprima-as.

  2. Impressão Olá, mundo! .

  3. Leia uma linha / argumento ( nome ) como entrada e imprima Feliz Aniversário, [nome]! .

  4. Leia todas as entradas e imprima Eu amo guias! se ele contiver um ou mais tabuladores (0x09) e eu odeio espaços! se não

  5. Leia duas linhas / argumentos e imprima um valor verdadeiro se o segundo for uma subcadeia do primeiro e um valor falso se não.

  6. Leia uma linha / argumento e imprima um valor verdadeiro se seus caracteres estiverem em ordem estritamente crescente e um valor falso se não.

  7. Leia uma linha / argumento e um caractere e imprima os índices de todas as ocorrências desse caractere.

  8. Leia uma linha / argumento e imprima qualquer um dos caracteres com o maior número de ocorrências.

  1. Leia dois números inteiros entre 0 e 255 e imprima sua soma.

  2. Leia um número inteiro único entre 0 e 255 e imprima o quociente e o resíduo de sua divisão por 7 .

  3. Leia um número inteiro único entre 1 e 255 e imprima um valor verdadeiro se for um número composto (nem 1 nem primo) e um valor falso se não.

  4. Leia um número inteiro único entre 1 e 255 e imprima um valor verdadeiro, se for uma potência de 2, e um valor falso, se não.

  5. Leia dois números inteiros entre 0 e 255 e imprima o maior.

  6. Leia um número inteiro decimal entre 0 e 255 imprima sua representação hexadecimal.

  7. Leia um número inteiro único entre 0 e 255 e imprima seu peso de Hamming (número de 1 bits).

  8. Leia um número inteiro n entre 1 e 13 e imprima o F n , o n º número de Fibonacci .

    Por exemplo, para a entrada 13, imprima 233.

  1. Leia uma linha / argumento da entrada e enquadre-a.

    Por exemplo, para a entrada Programming Puzzles & Code Golf, imprima isto:

    +---------------------------------+
    | Programming Puzzles & Code Golf |
    +---------------------------------+
    
  2. Leia um bloco retangular de caracteres e gire-o um quarto de volta no sentido horário.

    Por exemplo, para a entrada

    tye
    xll
    epb
    tma
     id
     sa
    s e
    i r
    hsn
    Tiu
    

    imprima isto:

    This  text
    is  simply
    unreadable
    
  3. Leia um número inteiro entre 1 e 40 e imprima um diamante desse comprimento lateral.

    Por exemplo, para a entrada 3, imprima isto:

      /\
     /  \
    /    \
    \    /
     \  /
      \/
    
  4. Imprima isto:

    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    ....@@@@....@@@@....@@@@....@@@@
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    @@@@....@@@@....@@@@....@@@@....
    

Pontuação

A resposta que consegue incorporar o maior número de programas em um único arquivo que se encaixa em um único cluster de 512 bytes ganha. Os laços são quebrados pela contagem de bytes (quanto menor, melhor).

Regras adicionais

  • Para cada tarefa que você solicita sua pontuação, o mesmo arquivo (byte por byte) deve constituir um programa completo - em um idioma de sua escolha - que resolva essa tarefa específica.

  • Cada tarefa deve ser resolvida em um idioma diferente.

    Os idiomas contam como diferentes se não forem versões diferentes do mesmo idioma. Por exemplo, há apenas um JavaScript, um Python e um TI-BASIC, mas C, C ++, Octave e MATLAB são quatro idiomas diferentes.

  • O idioma selecionado para cada tarefa deve satisfazer nossa definição usual de linguagem de programação .

    Além disso, o idioma deve ter sido publicado e implementado antes de 9 de setembro de 2015.

  • Seu compilador / intérprete pode não exigir nenhum sinalizador não padrão para produzir o comportamento esperado.

    Exceções a esta regra incluem sinalizadores necessários para especificar um idioma específico, ler o programa de um arquivo (único) ou suprimir um banner.

  • A entrada para cada tarefa consistirá em caracteres ASCII imprimíveis (0x20 a 0x7E) e feeds de linha (0x0A), e não excederá 255 bytes de comprimento.

  • Todos os números inteiros podem ser lidos em decimal ou unário, a menos que indicado de outra forma na tarefa.

  • O comportamento para entrada inválida é indefinido.

  • Você pode ler a entrada do STDIN (ou sua alternativa mais próxima) ou como argumentos da linha de comando.

    Se uma tarefa exigir a leitura de duas partes de entrada, você poderá lê-las - em qualquer ordem - separadas por um delimitador de um byte de sua escolha, como argumentos separados da linha de comandos ou um do STDIN e o outro como argumento da linha de comandos.

    Se uma das partes de entrada for uma linha, o único delimitador possível é um avanço de linha.

  • Imprima a saída em STDOUT (ou alternativa mais próxima). Toda a saída para STDERR será ignorada.

  • Para cada tarefa, aplicam regras padrão de .

    Em particular, isso inclui as brechas proibidas por padrão , com a exceção de codificar a saída , o que é explicitamente permitido para esse desafio.

Dennis
fonte
11
JavaScript e CoffeeScript são diferentes o suficiente para serem considerados idiomas diferentes?
Downgoat 15/09/2015
Sim, esses contam como diferentes.
Dennis
17
seu desafio # 4 é um absurdo> :(
Maçaneta da porta
Citação: Todas as saídas para STDERR serão ignoradas. Isso significa que, quando chamamos o script / programa com 2>/dev/nulle obtemos a saída correta para o stdout, está tudo bem? Só pra ter certeza.
precisa saber é o seguinte
2
@ Cabbie407 Precisamente. Por consenso sobre a meta , essa regra realmente se aplica por padrão a todos os desafios. Eu só queria ter certeza de que todos estavam cientes disso.
Dennis

Respostas:

17

12 idiomas, 418 bytes

"1\"# &&+.@\""" "" "
#=
''''
<<s
""'("']0=~2base{+}*}
 ?
 :_7/!\_7%!@
"
R"Happy Birthday, "[?S"!"*"
>0[0>i:0(?v:{)?v0n;\!/
$'main';n1< .95<
 \@-[I love tabs!]o#
  \ >qi---@
( @-[ ]e<''';print hex(
input())#-[I hate spaces!]o#"]];ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>"))?(!?)
'''=#print(([1 1;1 0]^int(readline()))[1,2])
#=
Tr is here.
>Tr, Hello, World!
>X Tr
s
l=gets
a='+-'+?-*~/$/+'-+'
puts a+'
| %s |
'%l+a#=#.91<0#'''#";

Este é um desafio divertido. Está ficando difícil encaixar mais idiomas, mas com tantos bytes restantes eu provavelmente poderia fazer mais um.

Faz uso gratuito de linguagens 2D. Observe que o caractere entre o [ ]na @-[ ]e<linha é uma guia. Além disso, isso requer \nfinais de linha para que TRANSCRIPT funcione.

Prelúdio (Tarefa 1 / Gato)

( 
      )?(!?)

?(!?)é apenas uma tradução direta de ,[.,]em BF. Os ()loops de prelúdio agem como []loops de BF ; portanto, tudo, desde a (coluna mais à esquerda até )antes do programa principal, não é executado.

As regras de sintaxe do prelúdio significam que os parênteses precisam ser correspondidos (leitura da coluna da esquerda para a direita), e só pode haver um parêntese por coluna. Fora isso, é uma linguagem muito fácil de se adaptar.

Verifique se NUMERIC_OUTPUTestá definido como Falsese você estiver usando o interpretador Python.

TRANSCRIÇÃO (Tarefa 2 / Olá mundo)

Tr is here.
>Tr, Hello, World!
>X Tr

TRANSCRIPT é um esolang temático baseado em ficção interativa. As linhas não reconhecidas pelo TRANSCRIPT são ignoradas, facilitando a adaptação.

Tr is here.declara uma Trvariável de cadeia, ea segunda linha define o conteúdo da variável para Hello, World!. X Tr( Xpara examinar) emite a sequência de caracteres.

Embora o TRANSCRIPT seja muito fácil de encaixar, é uma linguagem bastante detalhada, então eu fiz o desafio mais fácil.

Fissão (Tarefa 3 / mensagem de aniversário)

R"Happy Birthday, "[?S"!"*
                   \!/

que imprime a primeira parte, agrupa a entrada com um pequeno loop 2D e gera o ponto de exclamação à direita. Os Rsignifica que um átomo começa aqui se deslocam para a direita, o que é útil porque este programa pode ser movido em qualquer lugar.

Rail (Tarefa 4 / Guias)

$'main'
 \@-[I love tabs!]o#
  \ >qi---@
  @-[ ]e<
         -[I hate spaces!]o#

Como o Fission, o Rail é uma linguagem 2D que tem a vantagem de poder ser movida para qualquer lugar. A execução começa a partir $da mainfunção, na direção sudeste.

Primeiro, abaixamos os \s, vire à esquerda na -, pressionando o [<tab>]botão que pressiona uma guia. e<depois ramifica com base no EOF - se o EOF, encabeçamos e imprimimos "I hate spaces!"antes de parar, caso contrário, encabeçamos. Se formos para cima, lemos o próximo caractere e o comparamos com a guia, mais uma vez ramificando - se a guia aparecer e imprimir "I love tabs!"antes de parar, então desça e continue o loop de entrada.

Este programa é bastante caro, mas desde que o TRANSCRIPT levou o Hello World, foi difícil escolher e executar a tarefa para o Rail.

> <> (Tarefa 6 / Entrada crescente)

"1\"#      \""" "" "


>0[0>i:0(?v:{)?v0n;
       ;n1< .95<


        .91<

Imprime 1se estritamente ascendente, 0caso contrário.

> <> é outra linguagem 2D e a execução começa no canto superior esquerdo. "..."é o modo de sequência, pressionando os caracteres internos um de cada vez. Após a primeira corda que tocamos #, que reflete o IP para a esquerda, pressionando mais cordas e contornando (> <> é toroidal) antes de bater \, um espelho que nos reflete para cima.

Na parte inferior do programa está .91<, que nos teleporta para (9, 1)onde está o programa principal. Depois que isso 0[remove todo o lixo das cadeias, 0pressiona um zero para representar a última leitura de caractere e, depois disso, ele apenas lê os caracteres, um de cada vez, para garantir que ainda estamos subindo.

Provavelmente é melhor mover o programa principal para baixo em vez de teleportar, mas tratarei disso mais tarde, se necessário.

Befunge (Tarefa 9 / Adição)

"1\"# &&+.@

Testado com o intérprete encontrado aqui . Este é um programa bastante simples, com o começo pressionando uma corda inútil e #pulando sobre o espaço. Depois disso, é apenas o programa principal &&+.@.

Labirinto (Tarefa 10 / Divmod por 7)

"1
 =
 '
 <
""'("']
 ?
 :_7/!\_7%!@

Convenientemente, 'e "são NOPs no Labirinto que agem como um caminho percorrível no labirinto. Vou pular a navegação bagunçada, mas basicamente há muitas mudanças antes de chegarmos ao ?, que é o início do programa principal.

O programa não está totalmente liberado para dar conta do Prelude (por exemplo, ?é entrada de leitura no Prelude).

Python 2 (tarefa 14 / hexadecimal)

"1\"# &&+.@\""" "" "
#=
''''
xxx
xxx''';print hex(
input())#xxx
'''
xxx
xxx'''#";

Os xxxs representam partes irrelevantes comentadas por sequências ou comentários de várias linhas. No meio está print hex(input())o programa principal. Isso resulta com uma liderança 0x, mas estou assumindo que está tudo bem (se não, então é uma solução fácil de qualquer maneira).

A primeira linha é uma sequência "1\"# &&+.@\""seguida por dois " "s. Essas três strings são concatenadas pelo analisador e deixadas sem uso (essa primeira linha funciona da mesma forma para Ruby e Julia posteriormente).

GolfScript (tarefa 15 / peso de Hamming)

"1\"# &&+.@\""" "" "
#=
''''
<<s
""'("']0=~2base{+}*}

A primeira linha empurra três strings e a segunda linha é um comentário. ''''empurra mais duas seqüências e, em seguida, <<faz duas comparações ( sé ignorado). Finalmente, ""'("'pressiona mais duas cordas.

Tudo isso é lixo é então removido, envolvendo-o em uma matriz e obtendo o primeiro elemento ( ]0=), que é a entrada inicialmente na pilha. Em seguida, avaliamos a entrada com ~, transformamos em binário com 2baseentão somamos os bits com {+}*. O próximo }é incomparável e super-comenta o restante do programa.

Julia (tarefa 16, Fibonacci)

"1\"# &&+.@\""" "" "
#=
xxx
xxx=#print(([1 1;1 0]^int(readline()))[1,2])
#=
xxx
xxx=#.91<0#xxx

#=inicia um comentário com várias linhas e =#termina um comentário com várias linhas. O programa principal usa exponenciação de matriz para calcular números de Fibonacci (extraídos de Rosetta ).

Ruby (quadro da Tarefa 17 / ASCII)

"1\"# &&+.@\""" "" "
#=
''''
<<s
xxx
s
l=gets
a='+-'+?-*~/$/+'-+'
puts a+'
| %s |
'%l+a#xxx

Este programa assume que a entrada não termina com uma nova linha à direita.

Temos uma string inútil, um comentário, outra string inútil e depois um heredoc que comenta a maior parte do programa. Depois disso, é o programa principal, seguido por um #comentário de linha única .

CJam (Tarefa 19 / Diamante)

"1\"# &&+.@\""" "" "
#=
''''
<<s
""'("xxx
"
R"xxx"[?S"!"*"
xxx
xxx"ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>"xxx
xxx
xxx";

As duas cadeias de espaço no final da primeira linha devem satisfazer o CJam, pois #=são dois operadores binários. Não vou entrar em muitos detalhes com este, mas basicamente é uma bagunça, com o programa principal sendo o mero

ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>

entre.

O principal diferencial entre o GolfScript e o CJam é que, no CJam, uma única citação 'não inicia e termina as strings, mas empurra o próximo caractere para a pilha. Isso significa que no CJam

'("'

empurra um (e inicia uma sequência com "(o primeiro caractere é '), enquanto o acima é apenas uma sequência direta no GolfScript.

Experimente online . 1>é usado em vez de (dar conta do Prelude.


Aqui estão 12 idiomas, 373 bytes . Algumas tarefas mudaram, o TRANSCRIPT foi removido (tornou o Rail muito caro) e o Scheme (chicken) foi adicionado. Este é apenas o meu campo de golfe para futuras atualizações, já que a atualização do post principal leva uma eternidade.

"1\"09!#.&&+.@"" "" "#|"
#=
''''
<<s
11]0=~2base{+}*}
 ?
 :_7/!\_7%!@
"
R"Happy Birthday, "[?S"!"*"
>0[0>i:0(?v:{)?v0n;\!/
$'main';n1< .95<
(-[Hello, World!]o#''';print(input()in input());'''"]];ri:X{_~X+S*'/@S*_'\4$N}%_sW%1>"=#print(([1 1;1 0]^int(readline()))[1,2])#=)?(!?)
s
l=gets
a='+-'+?-*~/$/+'-+'
puts a+'
| %s |
'%l+a# =##'''#";e# |#(print(format"~x"(eval(read))))

Eu poderia salvar alguns bytes para Julia, pois os comentários multilinhas não terminados geram um erro para STDERR.

Sp3000
fonte
Coisas boas. Qual é a tarefa do TRANSCRIPT?
precisa saber é o seguinte
@ Cabbie407 Ainda estou tentando otimizar qual idioma obtém qual tarefa, mas atualmente o TRANSCRIPT pegou o Hello World e o Rail mudou para a tarefa de guias.
Sp3000 27/09/15
Ah, agora percebo que ;)estou procrastinando a alteração de qualquer coisa na minha resposta, devido à longa descrição. lol
Cabbie407
26

7 8 9 10 idiomas, 398 431 447 507 bytes

Este é provavelmente o máximo que posso ajustar na solução atual.

#if      + 0+0/*^",v  +- '[.,][[" ,yadhtrib yppaH"l?!;offf4+ + +0.0 +aa<*/
a=0--0;b=input();print(sorted(set(b))==list(b));[[""""                 ^ <
print("Hello, World!")--[[vv? +<
#endif/*  >.!0 + +1ffr"!"~< */
#include<stdio.h>/*>:1 +?!^>i:1^*/
int main(){int a=1,b=1,c,i;scanf("%d",&i);if(1//**/1==2
){printf("%x",/*>&:7/.7%.@*/i);}else{for(;--i-1>0;a=b,b=c)c=a +b;printf("%d",b);}}/*]]--"""]];#@;_J + + \+*\-hhlz \+s[\|dzd\|)J "` + +,*.]]]*/SSSTNSSNSNSTNTTTTTSSSTNSNSTNTTTTTTSSTNTTSNSSNNSSSNTTTTNSTNNNN

A última linha contém o código de espaço em branco codificado para que o SE não o coma. Para executar o código, substitua todos Spor espaços, Tpor guias e Npor novas linhas.

C89, tarefa 16

Aqui está o que o compilador vê:

int main(){int a=1,b=1,c,i;scanf("%d",&i);if(1/ 1==2
){printf("%x",i);}else{for(;--i-1>0;a=b,b=c)c=a+b;printf("%d",b);}}

Todo o resto é retirado como comentários ou dentro do #if 0.

C ++, tarefa 14

Eu usei um truque roubado daqui para diferenciar entre C89 e C ++.

int main(){int a=1,b=1,c,i;scanf("%d",&i);if(1
){printf("%x",i);}else{for(;--i-1>0;a=b,b=c)c=a+b;printf("%d",b);}}

Lua, tarefa 2

Aqui está a estrutura básica.

#comment
a=0--comment
print("Hello, World!")--[[
... multiline comment ...
]]--comment

Brainfuck, tarefa 1

Eu só tinha que garantir que nenhum loop infinito ou .,s perdidos fossem encontrados. Os comentários multilinhas de Lua também dobram como comentários BF. Tudo, exceto os 2 primeiros caracteres, é um grande loop NOP.

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

Python, tarefa 6

Mais uma vez, estou usando recursos específicos do idioma para o NOP ou comentar o outro código.

#comment
a=0--0;b=input();print(sorted(b)==list(b));[["""
... multiline string ...
"""]];#comment

Pitão, tarefa 17

Pyth é legal por isso. Leva o primeiro #como um while True:loop que sai silenciosamente por erro . Então, apenas transformo a maior parte do código (para evitar ;que o loop seja finalizado mais cedo), depois finalizo o loop, saio de outro criado pelo comentário do Python e faço a tarefa. Aqui está ele com todas as strings não vazias substituídas por " string ", ainda é funcionalmente equivalente:

#if      + 0+0/*^" string " ,yadhtrib yppaH" string """" string "Hello, World!" string "!"  string "%d"  string "%x" string "%d" string """]];#@;_J + + \+*\-hhlz \+s[\|dzd\|)J " string

> <>, tarefa 3

Este é muito interessante. A execução ricocheteia no código, usando saltos sempre que necessário para contornar obstáculos. As partes relevantes:

#                  v            " ,yadhtrib yppaH"l?!;offf4+ + +0.0 +aa<*/
                   i                                                   ^ <
                   !      vv? +<
          >.!0 + +1ffr"!"~<
                   >:1 +?!^>i:1^

Estrelado , tarefa 9

Aqui eu tive que começar a usar os idiomas "descartar todos os caracteres, exceto". Qualquer outra coisa retirada, parece:

      + +*,  + '., , + + +. +*                  ,  +*  . + + *.* +*  ,,,,**,*..*, +,* + + +* + ` + +,*.*

O código pula a maior parte da pontuação com um salto para evitar dificuldades, apenas usando o início e o final do código. O código é funcionalmente equivalente a

      + +*,  + + +,*.*

Befunge-98, tarefa 10

Funciona de maneira semelhante à> <> uma. Felizmente, #é um espelho em> <> e um pulo no Befunge, para que possamos implementar um comportamento diferente. Além disso 0/0 == 0,.

#if      + 0+0/*^
                >&:7/.7%.@

Espaço em branco , tarefa 13

Essa foi a última coisa em que me encaixei. As primeiras linhas estão apenas pressionando zeros na pilha, pois elas contêm apenas espaços e novas linhas do código "normal". O código está codificado; substitua tudo Spor espaço, Tpor guias e Npor novas linhas.

SSSSSSSSSSSSSSSN
SSSSSSSSSSSSSSSSSSN
SSN
SSSSSN
SN
SSN
SSSSSSSSSSSTN
SSN
SN
STN
TTTTTSSSTN
SN
STN
TTTTTTSSTN
TTSN
SSN
N
SSSN
TTTTN
STN
N
N
PurkkaKoodari
fonte
9

17 versões diferentes do Pip, 383 bytes (inválido)

Enquanto essa pergunta estava na área restrita, vasculhei todas as revisões do meu idioma Pip e criei um poliglota usando 17 delas. Infelizmente, as versões do mesmo idioma não são permitidas pelas regras de desafio agora, mas com a permissão de Dennis e um aviso, estou postando meu trabalho de qualquer maneira.

O código bruto

I!ga:0m@0:0v:uIN[(oTM0,0i)EN1N1Y1RCkw(hR`1.+0``&2o`)@>3@AB0`u`rZ4AB6({a}V7)BN8AZ9@m]Iv<2W##YqlPByc:((J['.'@]X4)X4RL3)Jnc.:n.RVcc:cRL4|0Iv=3{d:sXaRLaFj,ad@j@j:'\d:(RVdR'\'/).d|0dJ:n}m:'+.'-X#a+2.'+.n."| "Iv=5La{i+:oSio}j:ak:bPv=11?a>1&0INa%(2,a)[((J_M ZRVl)|0)Jnl?lJnlcJnd.n.RVdm.a.RVmih:$+TBa({j@aEQk}FI0,#a).saTB16a>b?abh=1ua//7.s.a%7a+bbINa"Happy Birthday, ".a.'!"Hello, World!"]@v

A estratégia

No Pip, letras minúsculas são variáveis. Letras maiúsculas são mais complicadas: são divididas em execuções de no máximo dois caracteres, que podem ser operadores ou variáveis. Se um token em maiúscula não for definido especificamente como uma variável ou operador, será considerado uma variável indefinida, que será avaliada como nula.

Portanto, para distinguir entre duas versões do Pip, só preciso encontrar algum operador variável ou alfabético que foi adicionado na mais recente das duas. No mais antigo, será nulo. O código v:uIN[...]reúne uma grande lista contendo uma dessas verificações para cada versão que eu quero testar, descobre quantos unil estão nessa lista (a variável é explicitamente inicializada como nil) e armazena o número em v(para "versão") .

Após alguns outros cálculos, há outra grande lista que calcula os resultados para 17 das tarefas do desafio e usa vpara selecionar um com base em qual versão é essa.

Versões e tarefas

0.15.09.04

Diagnóstico: (oTM0,0i)(corrigido um erro com o operador Tri M, em que aparar 0 caracteres de cada extremidade de uma string forneceria a string vazia; indexar para uma string vazia não forneceria nada)

Tarefa 18: Iv<2W##YqlPBy(configuração: leia todas as linhas de stdin se vfor menor que 2) seguida por ((J_M ZRVl)|0)Jn(lista reversa de linhas, transponha e junte novamente à string)

0.15.08.06

Diagnóstico: EN1( ENoperador umerado adicionado )

Tarefa 1: Iv<2W##YqlPBy(o mesmo código de configuração acima) seguido por l?lJnl(ingressar em novas linhas)

0.15.08.03

Diagnóstico: 1N1(adicionado Ncomo versão curta do INoperador)

Tarefa 20: c:((J['.'@]X4)X4RL3)Jnc.:n.RVcc:cRL4|0(configuração: gerar lista contendo as metades superior e inferior do tabuleiro de xadrez e armazenar c) seguida por cJn(ingressar na nova linha)

0.15.08.01

Diagnóstico: Y1( Yoperador ank adicionado )

Tarefa 19: Iv=3{d:sXaRLaFj,ad@j@j:'\d:(RVdR'\'/).d|0dJ:n}(configuração: se vfor 3, construa metade superior do diamante em d) seguida de d.n.RVd(inverta a metade inferior e entre na nova linha)

0.15.06.19

Diagnóstico: RCk( operador Random hoice adicionado C)

Tarefa 17: m:'+.'-X#a+2.'+.n."| "(configuração: construção da +----+\n| string m) seguida de m.a.RVm(quebra automática de entrada me reversão de m)

0.15.06.12

Diagnóstico: k( kvariável pré-inicializada para ", "; anteriormente era indefinida e, portanto, nula)

Tarefa 16: Iv=5La{i+:oSio}(se vfor 5, gere o número de Fibonacci i) seguido pori

0.15.06.08 (nota: o número da versão não foi alterado até o seguinte commit)

Diagnóstico: w( wvariável pré-inicializada para `\s+`)

Tarefa 15: h:$+TBa(converter entrada em dígitos binários e de soma; salvar o resultado na htarefa 12 posteriormente)

0.15.05.29

Diagnóstico: (hR`1.+0``&2o`)@>3@AB0

Esta versão foi adicionada &como um padrão de substituição para toda a cadeia correspondente em uma substituição de regex (inspirada no sed). O código acima pega h( 100) e o substitui por `&2o`(ou seja, "1002o"nas versões mais recentes, mas simplesmente "&2o"nas versões mais antigas). Em seguida, divide todos os caracteres após o terceiro ( "2o"nas versões mais recentes, ""nas versões mais antigas) e tenta indexar nessa sequência. A indexação em uma string vazia não fornece nada.

Tarefa 7: j:ak:b(configuração: copia vars locais a, bpara vars globais j, kpara que estejam disponíveis em uma função), seguida por ({j@aEQk}FI0,#a).s(filtre os índices em aque o caractere correspondente é igual be junte-se ao espaço)

0.15.05.26

Diagnóstico: `u`(tipo de padrão adicionado; nas versões anteriores, os backticks são ignorados como caracteres não reconhecidos e a expressão é avaliada como unula)

Tarefa 14: aTB16(converter To Base 16)

0.15.05.24

Diagnóstico: rZ4( rvariável especial criada que retorna um valor aleatório entre 0 e 1 cada vez que é referenciada; antes era indefinida e, portanto, a expressão era avaliada como nula)

Tarefa 13: a>b?ab(expressão ternária)

0.15.05.12

Diagnóstico: rZ4( Zoperador IP adicionado )

Tarefa 12: h=1(a soma dos bits da tarefa 15 deve ser igual a 1)

0.15.05.11

Diagnóstico: AB6( ABoperador de valor acrescentado ao soluto)

Tarefa 11: Pv=11?a>1&0INa%(2,a)[...]@v(se vfor 11, produzirá 1se a entrada for maior que 1 e um número menor a dividir exatamente, 0caso contrário; se vhouver outra coisa, use vcomo índice na lista para decidir o que produzir)

0.15.05.02

Diagnóstico: ({a}V7)( Voperador adicionado ; quando não Vfoi definido, isso enviou argumentos nulos e 7 para uma função {a}que retorna seu primeiro argumento)

Tarefa 10: a//7.s.a%7(entrada int-dividida por 7 e mod 7, separadas por espaço)

0.15.04.26

Diagnóstico: BN8( operador de Bintegração itwise adicionado N)

Tarefa 9: a+b

0.15.04.23

Diagnóstico: AZ( AZvariável pré-inicializada para alfabeto maiúsculo)

Tarefa 5: bINa( INfornece a contagem de ocorrências)

0.15.04.20

Diagnóstico: m@0:0seguido por9@m

A mvariável é pré-inicializada para 1000. Nesse commit, o @operador foi corrigido para retornar lvalues; anteriormente, atribuindo a m@0deu um aviso e não fez nada. Portanto, após a correção de bug, a primeira instrução é definida mcomo 0000, que é um índice legal para 9; pre-bugfix, mpermanece 1000, que não é um índice legal. (Os índices ainda não eram cíclicos.)

Tarefa 3: "Happy Birthday, ".a.'!

0.15.04.18

Todos os diagnósticos anteriores resultam em um valor nulo sendo adicionado à lista de diagnósticos.

Tarefa 2: "Hello, World!"


A maioria dos outros códigos são ajustes que eu tive que fazer para evitar erros em várias versões. Este post já é muito longo, portanto, se você quiser saber sobre algo que não expliquei, vamos levar a discussão para a sala de chat de idiomas esotéricos .

DLosc
fonte
4

6 idiomas, 226 bytes (229, dependendo de como \x1bé aceito!)

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;#<?die("\x1bc".max($argv[1],$argv[2]));/*
$a=['Hello','World'];//;printf"%s, %s!
",$a[0]||'Happy Birthday',$a[1]||pop;#";$a="\
#";alert(prompt().match("\t")?"I hate tabs!":"I love spaces!");/\]/

Portanto, acho que não fiz a melhor escolha de idiomas e imagino que isso não seja particularmente competitivo, mas achei um desafio interessante! No geral, não há muitos desafios completos, mas eu provavelmente poderia desafiar um desafio no espaço em branco ou algo semelhante, mas é o que tenho até agora:


1. Brainfuck

[+.]>>+[>,]<[<]>>[.>]>[<.[],[][,],,[],[].]

Testado em http://copy.sh/brainfuck/ e http://brainfuck.tk/ .

Depois de remover todos os caracteres ignorados, o programa acima é o que nos resta, que é apenas o exemplo de programa cat com alguns loops vazios extras para ignorar o uso dos símbolos em outros idiomas.

2. Ruby

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;
$a=['Hello','World'];//;printf"%s, %s!
",$a[0]||'Happy Birthday',$a[1]||pop;

Uso:

ruby cluster

O código acima é o código após todos os comentários serem removidos. A primeira linha é totalmente inútil em Ruby como nós definimos algumas expressões regulares para conter o código Befunge-93 e brainfuck, então criar uma matriz para conter Helloe Worlde imprimi-lo usando printf(para adicionar o ,e !).

3. Perl

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;
$a=['Hello','World'];//;printf"%s, %s!
",$a[0]||'Happy Birthday',$a[1]||pop;

Uso:

perl cluster <name>

Muito parecido com Ruby, exceto que, como estamos armazenando uma referência de matriz $a, quando tentamos acessá- $a[0]la, podemos substituí-la pelo texto do desafio 3, Happy Birthdaye pop(que mostra o último argumento para o programa de linha de comando )

4. JavaScript

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;
$a=['Hello','World'];
",$a[0]||'Happy Birthday',$a[1]||pop;#";$a="\
#";alert(prompt().match("\t")?"I hate tabs!":"I love spaces!");/\]/

Uso: cole no console do navegador e execute.

Assim como Ruby e Perl, a primeira linha cria essencialmente RegExpobjetos inúteis . Em seguida, armazenamos uma matriz inútil $ae instanciamos duas cadeias inúteis, uma contendo o código Ruby / Perl e outra contendo uma nova linha e a #, então, prompt()para entrada e alert()resultado esperado pela maioria dos humanos para o desafio 4. Terminamos com outro RegExpobjeto inútil para fechar o ciclo do cérebro.

9. Befunge-93

/&&#[+.#]@

Testado em http://www.quirkster.com/iano/js/befunge.html .

Pelo que entendi, /divide a pilha e empurra o resultado que não tem efeitos negativos, exceto pressionar NaNno site acima, &solicita a entrada de um número inteiro para que lemos os dois números exigidos pelo desafio 9 na pilha, #garantindo que pulamos o [que existe para o brainfuck, +depois adiciona os dois primeiros números na pilha, os .produz, #]para o brainfuck novamente e @sai.

13. PHP (executando no Bash)

/&&#[+.#]@>>+[>,]<[<]>>[.>]>\[/;//;#<?die("\x1bc".max($argv[1],$argv[2]));

Uso:

php cluster <x> <y>

No PHP, tudo o que não está incluído nas <?tags é produzido literalmente; portanto, produz o código Befunge-93 e brainfuck, para que die()imediatamente no código, exibimos uma tela clear ( \x1bc) e, em seguida, o max()dos dois primeiros argumentos.

Dom Hastings
fonte
Você pode colocar o caractere ESCape literal na string literal, basta adicionar uma nota de que está lá ( the first character in the first string literal is the byte ASCII 27); sua pontuação é 226.
cat
@cat Sim, acho que você está certo, deixei como está por enquanto, mas coloquei 226 no título. Eu esqueci o quanto eu gostei desse desafio, provavelmente poderia fazer um pouco mais agora e usando o ES6 que eu poderia ter .match'\x09'(onde estão ') talvez eu veja se posso adicionar mais em algum momento!
Dom Hastings
4

6 idiomas, 450 404 bytes

bash, brainfuck, C, gawk4, JavaScript e Minimal-2D

/*\t/#[R,+/D
/\t/ # UL.-L<script>var s=prompt().split(' ');alert(+s.pop()+ +s.pop())</script>
sed "s/^\(.*\)$/Happy Birthday, &!/;q"&&0
/\t/#*/
#define func
func main(){puts("Hello, World!");}
//{split($0,b,_);for(i in b)a[NR][i]=b[i++]}END{for(;j++<i;print"")for(k=NR;k;)printf a[k--][j]}
#//]++++++++[>+>+>++++++>++++++++<<<<-]>>++>--<<[>>>>>+++[<++++[<<....>....>-]<<<.>>>>-]<<<[>>+<<-]<[[>+<-]<]>>-]

Atualização: Golpeou um pouco. Ainda não tenho certeza do que mais acrescentar, e não tenho certeza de como os membros concorrentes pensariam em mim usando seus idiomas para tarefas diferentes. Tentando explicar o algoritmo brainfuck.

Bem, essa é / foi minha primeira experiência poliglota, então tive que aprender tudo do zero. Começar com awk não foi a idéia mais inteligente que eu acho, porque é relativamente implacável. Como o número de tarefas concluídas é relevante, comecei com as tarefas mais fáceis primeiro. Não tenho certeza se essa foi uma jogada inteligente. Isso não é muito disputado, porque eu tive problemas para conseguir trabalhar esses seis juntos, mas fiz o que pude para mantê-lo curto.

Aqui estão os idiomas e o que eles fazem em ordem alfabética. Vou mostrar uma maneira fácil de testá-los mais abaixo. Como parte disso pode ser específica da versão, fornecerei os números de versão das ferramentas que usei.

bash, tarefa 3

Bem, é óbvio que eu usei sed. Tentei colocar um script sed nisso de alguma forma, mas não consegui fazê-lo funcionar, então segui o caminho do bash. Do jeito que eu dito, está dentro de um comentário C e o awk avalia False.

sed --versionsed (GNU sed) 4.2.2

bash --versionGNU bash, Version 4.3.30(1)-release (x86_64-pc-linux-gnu)

Então a parte sed se resume a

sed "s/^\(.*\)$/Happy Birthday, &!/;q"

Ele agrupa a entrada, cola-a em uma nova string e imprime o resultado. Coisas bastante comuns.

brainfuck, tarefa 20

Bem, isso é sempre muito fácil de esconder, eu acho. Uma linha iniciada com #//é ignorada por C e awk. Ou pelo menos eles podem viver com o lixo por trás disso.

bfbf - a Brainfuck interpreter version 20041219

Este é o código condensado. A primeira linha é apenas o lixo dos outros idiomas.

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

Vou tentar explicar como funciona

++++++++[>+>+>++++++>++++++++<<<<-]>>++>--<<

isso organiza a fita e o ponteiro para este

0 8 10 46 64 C2 C1
  ^

a célula que contém 8 é o contador global para o seguinte loop
: é o número de vezes que 3 mesmas linhas são impressas

[>>>>>+++

define C1para 3, o número de mesmas linhas

    [<++++

define C2para 4, o número de " ....@@@@" em uma linha (no começo)

        [<<....>....>-]<<<.>>>
    >-]

imprime uma linha completa decrementando C2no processo
quando C2é zero, imprime uma nova linha e decrementa C1.

se C1for zero a mágica acontece

    <<<[>>+<<-]
    <[[>+<-]<]

o 46 é movido para trás do 64
o 10 e o contador global é movido um para a direita

>>-]

então o contador global é diminuído
se for zero, o programa sai

C, tarefa 2

Esgoto cada pequena habilidade de C aqui imprimindo "Olá, Mundo!". Bem, alguém teve que fazer o trabalho ...

gcc --versiongcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2

O código C real

#define func
func main(){puts("Hello, World!");}
#

O #define funcé tornar o awk bem com isso. Ele acha que essa é uma função awk. A abreviação para func é um recurso gawk.

gawk4, tarefa 18

Desde que eu usei o awk para praticamente tudo aqui, eu decidi que tinha que estar nisso.

awk --versionGNU Awk 4.1.1, API: 1.1 (GNU MPFR 3.1.2-p11, GNU MP 6.0.0)

awk vê isso

/*\t/
/\t/
sed "s/^\(.*\)$/Happy Birthday, &!/;q"&&0
/\t/
func main(){puts("Hello, World!");}
//{split($0,b,_);for(i in b)a[NR][i]=b[i++]}END{for(;j++<i;print"")for(k=NR;k;)printf a[k--][j]}
#

Os padrões de pesquisa, incluindo \tavaliar para false. Eu escolhi a guia aqui, porque acho que não pode estar na entrada. sedavalia como false. "the string"&&0avalia como falso. A função está boa. O programa é executado se um padrão vazio for correspondido, o que é para qualquer entrada.

Faz isso

Entrada

elaic
parli
ucfit
srigs

Saída

supe
rcal
ifra
gili
stic

Você precisa garantir que todas as linhas de entrada tenham o mesmo comprimento. Use espaços para preenchê-los.

JavaScript, tarefa 9

Não tenho certeza se isso é legítimo, porque isso foi muito fácil. Se você der ao arquivo de programa um html final e o abrir em um navegador (usei o Firefox 40.0.3 e o chrome 45.0.2454.85), ele solicitará uma entrada. Você precisa digitar dois números separados por espaço, e ele alertará a soma deles.

<script>var s=prompt().split(' ');alert(+s.pop()+ +s.pop())</script>

Minimal-2D , tarefa 1

Isso foi muito fácil de se encaixar nas linhas de comentários. Eu usei o intérprete , que roda em python, para testar isso. Imprime a entrada na saída. O programa se parece com isso

R,+/D
UL.-L

RUDL estão à direita, para cima, para baixo e para a esquerda. Então começa a dar certo, lê um personagem de stdin na memória e adiciona um. A barra pula o próximo comando se a memória tiver o valor 0. Isso é para finalizar isso. Se um caractere com o valor -1 for lido, a entrada será finalizada. Portanto, se -1 for lido, pula o D e termina. Se outra coisa for lida, ela desce à esquerda, adiciona 1 à memória e imprime o caractere em stdout. Então ele sobe e sobe e recomeça.

Teste

Isenção de responsabilidade: não me responsabilizo por nenhum dano causado ao seu sistema com isso.

Isso pressupõe que você tenha o bash & co, gawk (pelo menos a versão 4, porque isso usa matrizes multidimensionais), gcc, python, bf como intérprete cerebral e o Firefox instalado.

Para facilitar, copie a fonte do programa para um arquivo chamado cluster.html. Torne esse arquivo executável para a tarefa bash. Copie e cole o intérprete do Minimal-2d em um arquivo nomeado minimal2D.pyno mesmo diretório. Em seguida, copie e cole o script a seguir em um arquivo de script e coloque-o no mesmo diretório, torne-o executável e execute-o ... bem, com quem estou falando. Se você ler isso, provavelmente não precisará de muitas explicações e poderá fazê-lo funcionar de alguma maneira.

#!/bin/bash
# Task  3: bash
echo "Dr. Hfuhruhurr" | ./cluster.html 2>/dev/null;echo
# Task 18: awk 
printf "elaic\nparli\nucfit\nsrigs\n" | awk -f cluster.html 2>/dev/null;echo
# Task  2: C
cp ./cluster.html ./cluster.c;gcc -w -o cluster cluster.c;./cluster;rm cluster cluster.c;echo
# Task  1: Minimal-2D
python minimal2D.py cluster.html <<<"This
has
to be
copied     !!!";echo
# Task 20: brainfuck
bf cluster.html;echo
# Task  9: JavaScript
firefox cluster.html 2>/dev/null
#google-chrome cluster.html 2>/dev/null

Lá você também encontra o comando para executar os testes individualmente.

Diverta-se!

Cabbie407
fonte
O cérebro de quem tem um problema; o código possui colchetes desequilibrados e não será executado corretamente (você deve executar o arquivo inteiro, não apenas a parte relevante). Além disso, os quadrados do tabuleiro de damas são na verdade 4x3 em vez de 4x4 para parecerem mais quadrados no texto.
PurkkaKoodari
Obrigado pela dica. Bem, ele corre bem aqui. Eu sempre corro o arquivo inteiro, como você pode ver no meu script. Não tenho certeza se o intérprete deve verificar os colchetes antes de executar. O meu não se importa. Mas eu ignorei essa contagem de linhas. Tem que mudar isso.
precisa saber é o seguinte
Bem, eu olhei novamente e espero consertar.
precisa saber é o seguinte