Poliglota Restrita


20

Poliglotas são programas que são válidos em várias linguagens de programação simultaneamente. A maioria desses poliglotas é escrita de tal maneira que certas construções de um idioma são interpretadas como comentários de outro idioma (por exemplo, #defineem C sendo interpretado como um comentário em várias linguagens de script).

Estou curioso para ver se é possível criar uma poliglota não trivial que não contenha comentários, mas também muda imediatamente quando você remove qualquer caractere que não seja um espaço em branco. Por isso, desafio você a criar esse programa.

As regras concretas são as seguintes:

  1. (Saída). Seu programa deve produzir alguma saída no console em cada um dos seus idiomas. Ou seja, seu programa não tem permissão para simplesmente sair sem imprimir nada.
  2. (Variância). Como um relaxamento da definição poliglota padrão, a saída do programa pode variar entre os idiomas.
  3. (Erros). Seu programa não deve produzir nenhum erro (definido de forma ampla) em nenhum dos seus idiomas. Para a maioria dos idiomas, isso é definido como o retorno de um código de saída diferente de zero do compilador e / ou intérprete.
  4. (Restrição). A remoção de qualquer caractere que não seja um espaço em branco do código deve fazer com que o programa altere o comportamento dele em todos os idiomas. O programa pode "mudar" se tornando inválido para esse idioma ou alterando a saída produzida.
  5. Este é um desafio de código . Winner é o programa que é válido na maioria das linguagens de programação. Os laços serão quebrados em favor da duração mais curta do programa.

A regra de restrição não se aplica à remoção de vários caracteres. Ou seja, é bom se a remoção de vários caracteres simultaneamente resultar em nenhuma alteração para um dos seus idiomas.

Observe que a regra de restrição implica que você não pode usar o espaço em branco como um dos seus idiomas, pois a remoção de caracteres que não sejam espaços em branco não mudará o comportamento do programa em branco.

Aqui está um exemplo simples de um programa que cumpre todas as restrições acima, para os idiomas Python 2 e Python 3:

print("Hello World!")

A remoção de qualquer caractere printfará com que os dois idiomas atinjam a NameError; a remoção de qualquer colchete ou aspas gerará um SyntaxErrore a remoção de qualquer um dos caracteres da sequência alterará a saída nos dois idiomas. (Observe que print("hello", "world")é um programa mais sutil, mas ainda válido, de acordo com as regras acima).

Este exemplo é um pouco ruim porque o Python 2 e o Python 3 são muito semelhantes, portanto, não aceitarei outras soluções que usem apenas versões diferentes da mesma linguagem (especialmente Python 2 e Python 3).


@ IngoBürk: A regra impede que você escreva uma poliglota funcional que envolva espaço em branco, a menos que, de alguma forma, seu outro idioma também seja somente espaço em branco.
Nneonneo 28/09/14

1
FWIW, seu exemplo, print("Hello World!")também é um código Ruby válido
Cristian Lupascu 28/09

É um pouco chato que as respostas simples (como as minhas) para um [poliglota] tendem a ter tantos idiomas.
Justin Justin

5
Para evitar as inúmeras variantes de idiomas ou idiomas com sintaxe semelhante, seria mais interessante exigir que dois idiomas sejam contados como diferentes apenas se o programa produzir uma saída diferente.
Gilles 'SO- stop be evil'

Respostas:


13

Bash + GolfScript + CJam

"echo" []
{ cat<&3;} \
3<""<("echo" 'p'~)

Saída

Bater:

[]
p~

GolfScript:

"echo"
echo{ cat<&3;}0

CJam:

echo{ cat<&3;}-1echop

Existe um \x7fno final da saída do CJam.


... espere, como isso funciona nos três idiomas, sem ser redundante?
Nneonneo

@nneonneo Simplesmente imprime todo o código não utilizado em outros idiomas.
precisa saber é o seguinte

8

Bash + Befunge

"echo" $,$,"ol":,,,@

imprime 'olá' em befunge.


1
Eu posso atestar que todo personagem (exceto o espaço) faz algo em Befunge. Mas não posso fazer isso pelo Bash. Isso é impressionante.
237 Justin Justin

7

bc, GolfScript, Homespring, huh, Oitava, Scilab (0 bytes)

Garantido em conformidade com a regra 4. Não é um vencedor, mas faria bem no desempate.

Saída

bc

Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.

GolfScript


Homespring

In Homespring, the null program is not a quine.

?

Oitava

GNU Octave, version 3.6.4
Copyright (C) 2013 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type `warranty'.

Octave was configured for "x86_64-redhat-linux-gnu".

Additional information about Octave is available at http://www.octave.org.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/get-involved.html

Read http://www.octave.org/bugs.html to learn how to submit bug reports.

For information about changes from previous versions, type `news'.

Scilab

Startup execution:
  loading initial environment

-->

2
Eu sei que há um esolang que evita especificamente o comprimento 0, fazendo esse tipo de coisa (oh espera, isso é Homespring ). Eu acredito hein? produz alguma coisa.
Justin

Obrigado! Infelizmente, não consigo convencer, hein? rodar em Linux ...
Dennis

1
Tudo o que eu precisava era de um pacote extra para mono. A What?\n?propósito, seu programa é impresso .
Dennis

1
Também funciona no GNU Make (se essa é uma linguagem de programação):make: *** No targets. Stop.
jimmy23013 5/14

1
@ user23013: Certo. Nesse caso, não é uma entrada válida, pois o código de saída do make é 2. #
Dennis

6

GolfScript + PHP + CJam + Mathematica + bc + Pyth + /// + TI-Basic + R + Oitava + Matlab + Scilab + Linha superior numérica +? Fueue + hein?

10

Em Golscript, PHP, CJam, Mathematica, bc, Pyth, /// e TI-Basic, ele gera 10.

Em R, ele gera [1] 10

No Octave, ele gera ans = 10

No Matlab e Scilab, ele gera ans = 10.

Na Linha superior numérica, ele gera 0.

Se eu entendo o Fueue corretamente, ele gera uma nova linha e atua como um programa para gatos.

Em hein ?, ele gera

What?
?

1
Também trabalha com CJam
agosto

5
Eu não acho que os intérpretes interativos devem contar.
Nneonneo 28/09/14

2
Esta multa é executado em um monte de línguas, mas não fornece saída em que muitos ...
Justin

1
Isso também é válido em HTML , bc , Matlab e Scilab . Se você mudar 72para 10, ele deverá ser impresso 0na Linha Superior Numérica .
Dennis

O HTML não é uma linguagem de programação de acordo com a meta-discussão, pois não possui meios de aritmética ou loops simples.
Ingo Bürk

3

Parece que esta resposta não está totalmente correta.
Eu o consertei parcialmente e vou melhorar a outra parte em alguns dias.

C ++ e Javascript

A ideia é:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(){};int=0");
int
main()
{
puts("Hi from C++!");
}

C ++: http://codepad.org/SK2wbIDL
Javascript: basta copiar o código no console do navegador

E um conjunto de correções para satisfazer

(Restrição). A remoção de qualquer caractere que não seja um espaço em branco do código deve fazer com que o programa altere o comportamento dele em todos os idiomas. O programa pode "mudar" se tornando inválido para esse idioma ou alterando a saída produzida.

Do lado do Javascript:

Alterar int, mainou putsirá falhar com a leitura da variável não declarada. Mas boole Hi from C++!pode ser com segurança muda. Vamos consertar:

puts=function(){}
puts=function(s){s=='Hi from C++!'?bool:nope}

Se as strings são iguais, verifica a existência de bool, caso contrário, trava com não declarado nope.

Agora, existem dois pontos e vírgulas finais que podem ser removidos. O primeiro é corrigido esyly - basta remover a nova linha antes int:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(){};int=0");int

O segundo é anterior }, então eu preciso de alguma constrição, válida em ambos os idiomas e sem exigir ponto e vírgula no final em C ++ ou forjar um ponto e vírgula em js. Bem:

while(0);

É impossível omitir ponto e vírgula em js conforme a whilenecessidade do corpo.

Portanto, o programa no momento é:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(s){s=='Hi from C++!'?bool:nope};int=0");int
main()
{
puts("Hi from C++!");while(0);
}

Do lado de C ++:

Existem 2 problemas: evalpode ter qualquer nome e todo o código js pode ser alterado.

Vou tentar consertá-los em alguns dias.


2

CJam + Golfscript

Ok, isso é um pouco chato, mas é um começo.

1,

Imprime "0" nos dois idiomas. A remoção das 1causas causa um erro, removendo as ,impressões "1".

O mesmo pode ser feito com 1)ou 1(. Existem muitas alternativas.

(Sim, eu sei que isso não é código-golfe)


2

C e C ++

#include <stdio.h>
int main() { puts("Hello!"); return 0; }

C e C ++ são linguagens diferentes que são quase compatíveis entre si - ao contrário do que você pode ouvir, C ++ não é um superconjunto de C. Veja http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B para algumas diferenças . O exemplo acima não é C ++ idiomático, mas funciona e produz a mesma saída em C e C ++.


Você pode remover o 0C.
Dennis

@ Dennis Não está em C89.
Gilles 'SO- stop be evil'

@Gilles: Se a função principal executar um retorno que não especifica nenhum valor, o status de encerramento retornado ao ambiente host é indefinido. ( O ambiente hospedado do C89 Draft - 2.1.2.2 ) Isso não invalida o programa nem altera sua saída; portanto, para os fins desta pergunta, ele 0pode ser removido.
Dennis

@ Dennis Acho que um código de saída não especificado conta como invalidar o programa, de acordo com as regras desta pergunta. Caso contrário, faça uma implementação C89 em que este programa retorne um código de saída diferente de zero, como gcc -ansino x86 (ou em muitas outras arquiteturas: o que acontece é que o valor de retorno putsacaba no registro em que o tempo de execução lê o valor para retornar da mainfunção).
Gilles 'SO- stop be evil'

@ Gilles: Minha interpretação da regra 3 é que o compilador deve retornar 0, não o programa.
Dennis

2

JavaScipt, Lua, R e Python 3-24 bytes

Pode funcionar em alguns outros idiomas, testarei mais tarde.

alert=print;alert(1)

O JavaScript foi testado no console do Firefox e nos outros idiomas aqui , aqui e aqui


1

Perl + Ruby + Python

Eu acho que em PHP isso precisaria de um ponto e vírgula se você estiver executando -R.

print "Hello World!"

Isso funciona também em Python.
agosto

1
Também funciona com Lua.
Trebuchette

1

Bash + sh + zsh + ksh, 4 bytes:

echo

Realmente simples e satisfaz todas as regras:

  1. Gera uma nova linha em cada um dos idiomas.
  2. A saída atualmente não varia de forma alguma entre os idiomas.
  3. Não produz um erro em nenhum dos idiomas ...
  4. ... exceto quando qualquer um dos caracteres é removido / alterado.

0

Bash + sh + zsh + ksh + Lote do Windows, 4 bytes:

echo

Realmente simples e satisfaz todas as regras:

Gera uma nova linha que não varia em cada um dos idiomas (mas o Lote do Windows, que gera ECHO is on, no idioma que você usa) não gera erro, exceto quando qualquer letra é removida ou alterada.


1
Sua resposta parece ser quase idêntica a esta: codegolf.stackexchange.com/a/100654/65326
Uriel
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.