Políglota restringido

20

Los políglotas son programas que son válidos en múltiples lenguajes de programación simultáneamente. La mayoría de estos políglotas están escritos de tal manera que ciertas construcciones de un lenguaje se interpretan como comentarios de otro lenguaje (por ejemplo, #defineen C se interpreta como un comentario en varios lenguajes de secuencias de comandos).

Tengo curiosidad por ver si es posible hacer un políglota no trivial que no contenga comentarios, pero que también cambie inmediatamente cuando elimine cualquier carácter que no sea un espacio en blanco, por lo tanto, le desafío a que proponga dicho programa.

Las reglas concretas son las siguientes:

  1. (Salida). Su programa debe producir algún resultado en la consola en cada uno de sus idiomas. Es decir, su programa no puede simplemente salir sin imprimir nada.
  2. (Diferencia). Como una relajación de la definición políglota estándar, la salida del programa puede variar entre idiomas.
  3. (Errores) Su programa no debe producir ningún error (ampliamente definido) en ninguno de sus idiomas. Para la mayoría de los idiomas, esto se define como devolver un código de salida distinto de cero del compilador y / o intérprete.
  4. (Restricción). La eliminación de cualquier carácter que no sea un espacio en blanco de su código debería hacer que su programa cambie su comportamiento en cada uno de sus idiomas. El programa puede "cambiar" al volverse inválido para ese idioma o al cambiar la salida que se produce.
  5. Este es un desafío de código . Winner es el programa que es válido en la mayoría de los lenguajes de programación. Los lazos se romperán a favor de una duración más corta del programa.

La regla de restricción no se aplica a la eliminación de varios caracteres. Es decir, está bien si eliminar varios caracteres simultáneamente no produce cambios para uno de sus idiomas.

Observe que la regla de restricción implica que no puede usar Whitespace como uno de sus idiomas, ya que eliminar cualquier carácter que no sea un espacio en blanco no cambiará el comportamiento del programa Whitespace.

Aquí hay un ejemplo simple de un programa que cumple con todas las restricciones anteriores, para los lenguajes Python 2 y Python 3:

print("Hello World!")

Eliminar cualquier carácter printhará que ambos idiomas arrojen un NameError; eliminar cualquier paréntesis o cita arrojará un SyntaxError, y eliminar cualquiera de los caracteres de cadena cambiará la salida en ambos idiomas. (Tenga en cuenta que print("hello", "world")es un programa más sutil, pero aún válido según las reglas anteriores).

Este ejemplo es un poco aburrido porque Python 2 y Python 3 son muy similares, por lo que no aceptaré ninguna otra solución que solo use diferentes versiones del mismo lenguaje (especialmente Python 2 y Python 3).

nneonneo
fuente
@ IngoBürk: la regla le impide escribir un políglota funcional que incluya espacios en blanco , a menos que su otro idioma también sea solo en espacios en blanco.
nneonneo
1
FWIW su ejemplo, print("Hello World!")también es válido código Ruby
Cristian Lupascu
Es un poco molesto que las respuestas simples (como la mía) a un [políglota] tienden a tener tantos idiomas.
Justin
55
Para evitar las innumerables variantes de idiomas o idiomas con una sintaxis similar, sería más interesante requerir que dos idiomas cuenten como diferentes solo si el programa produce una salida diferente.
Gilles 'SO- deja de ser malvado'

Respuestas:

13

Bash + GolfScript + CJam

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

Salida

Golpetazo:

[]
p~

GolfScript:

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

CJam:

echo{ cat<&3;}-1echop

Hay un \x7ffinal de salida de CJam.

jimmy23013
fuente
... espera, ¿cómo funciona esto en los tres idiomas, sin ser redundante?
nneonneo
@nneonneo Simplemente imprime todo el código no utilizado en otros idiomas.
jimmy23013
8

Bash + Befunge

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

imprime 'hola' en befunge.

saeedn
fuente
1
Puedo dar fe de que cada personaje (excepto el espacio) hace algo en Befunge. Sin embargo, no puedo hacerlo por el Bash. Esto es impresionante
Justin
7

bc, GolfScript, Homespring, eh, Octave, Scilab (0 bytes)

Garantizado para cumplir con la regla 4. No es un ganador, pero le iría bien en el desempate.

Salida

antes de Cristo

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.

eh

?

Octava

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

-->
Dennis
fuente
2
Sé que hay un esolang que específicamente evita quines de longitud 0 al hacer este tipo de cosas (oh espera, eso es Homespring ). Yo creo eh? produce algo
Justin
¡Gracias! Lamentablemente, no puedo convencer, ¿eh? ejecutar en Linux ...
Dennis
1
Todo lo que necesitaba era un paquete extra para mono. Su programa imprime What?\n?, por cierto.
Dennis
1
También funciona en GNU Make (si es un lenguaje de programación):make: *** No targets. Stop.
jimmy23013
1
@ user23013: Correcto. En ese caso, no es una entrada válida, ya que el código de salida de make es 2.
Dennis
6

GolfScript + PHP + CJam + Mathematica + bc + Pyth + /// + TI-Basic + R + Octave + Matlab + Scilab + Numeric Topline +? Fueue + ¿eh?

10

En Golscript, PHP, CJam, Mathematica, bc, Pyth, /// y TI-Basic, genera 10.

En R, sale [1] 10

En Octave, sale ans = 10

En Matlab y Scilab, da salida ans = 10.

En la línea superior numérica, sale 0.

Si entiendo Fueue correctamente, genera una nueva línea y luego actúa como un programa cat.

¿En eh ?, sale

What?
?
Justin
fuente
1
También funciona en CJam
agosto
55
No creo que los intérpretes interactivos deban contar.
nneonneo
2
Esto funciona bien en muchos idiomas, pero no proporciona resultados en tantos ...
Justin
1
Esto también es válido en HTML , bc , Matlab y Scilab . Si cambia 72a 10, debería imprimirse 0en la línea superior numérica .
Dennis
HTML no es un lenguaje de programación de acuerdo con la meta discusión, ya que no tiene medios de aritmética o bucles simples.
Ingo Bürk
3

Parece que esta respuesta no es completamente correcta.
Lo arreglé parcialmente, y voy a mejorar la otra parte en unos días.

C ++ y Javascript

La idea es:

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: simplemente copie el código a la consola del navegador

Y un conjunto de soluciones para que satisfaga

(Restricción). La eliminación de cualquier carácter que no sea un espacio en blanco de su código debería hacer que su programa cambie su comportamiento en cada uno de sus idiomas. El programa puede "cambiar" al volverse inválido para ese idioma o al cambiar la salida que se produce.

Desde el lado de Javascript:

Cambiando int, maino putsse bloqueará con la lectura de la variable no declarada. Pero booly Hi from C++!puede ser cambios con seguridad. Vamos a arreglarlo:

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

Si las cadenas son iguales, verifica la existencia de bool, de lo contrario, se bloquea sin declarar nope.

Ahora, hay 2 puntos y comas finales que se pueden eliminar. El primero se soluciona solo: simplemente elimine la nueva línea antes int:

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

El segundo es antes }, por lo que necesito algo de constricción, válido en ambos idiomas y que no requiere punto y coma al final en C ++ o forzar un punto y coma en js. Multa:

while(0);

Es imposible omitir punto y coma en js ya que whilenecesita el cuerpo.

Entonces el programa en este momento es:

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

Desde el lado C ++:

Hay 2 problemas: evalpuede tener cualquier nombre y se puede cambiar todo el código js.

Intentaré arreglarlos en unos días.

Qwertiy
fuente
2

CJam + Golfscript

De acuerdo, esto es algo aburrido, pero es un comienzo.

1,

Imprime "0" en ambos idiomas. La eliminación de los 1causa un error, eliminando las ,impresiones "1" en su lugar.

Lo mismo se puede hacer con 1)o 1(. Hay muchas alternativas

(Sí, sé que esto no es código golf)

Ingo Bürk
fuente
2

C y C ++

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

C y C ++ son lenguajes diferentes que son casi compatibles entre sí; al contrario de lo que podría escuchar, C ++ no es un superconjunto de C. Consulte http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B para ver algunas diferencias . El ejemplo anterior no es C ++ idiomático, pero funciona y produce la misma salida tanto en C como en C ++.

Jerry Jeremiah
fuente
Puede eliminar el 0para C.
Dennis
@ Dennis no en C89.
Gilles 'SO- deja de ser malvado'
@Gilles: si la función principal ejecuta una devolución que no especifica ningún valor, el estado de terminación devuelto al entorno host no está definido. ( El borrador C89 - 2.1.2.2 Entorno alojado ) Eso no invalida el programa ni cambia su salida, por lo que para los propósitos de esta pregunta, 0se puede eliminar.
Dennis
@ Dennis Creo que un código de salida no especificado cuenta como invalidar el programa según las reglas de esta pregunta. Si no es así, realice una implementación C89 donde este programa devuelva un código de salida distinto de cero, como gcc -ansien x86 (o en muchas otras arquitecturas: lo que sucede es que el valor de retorno de putstermina en el registro donde el tiempo de ejecución lee el valor para volver de la mainfunción).
Gilles 'SO- deja de ser malvado'
@Gilles: Mi interpretación de la regla 3 es que el compilador debe devolver 0, no el programa.
Dennis
2

JavaScipt, Lua, R y Python 3 - 24 bytes

Puede funcionar en otros idiomas, lo probaré más tarde.

alert=print;alert(1)

JavaScript fue probado en la consola de Firefox y los otros idiomas aquí , aquí y aquí

William Barbosa
fuente
1

Perl + Ruby + Python

Creo que en PHP esto necesitaría un punto y coma si está ejecutando con -R.

print "Hello World!"
hmatt1
fuente
Esto también funciona en Python.
Agosto
1
También trabaja con Lua.
Trebuchette
1

Bash + sh + zsh + ksh, 4 bytes:

echo

Realmente simple y satisface todas las reglas:

  1. Emite una nueva línea en cada uno de los idiomas.
  2. La salida actualmente no varía de ninguna manera entre los idiomas.
  3. No produce un error en ninguno de los idiomas ...
  4. ... excepto cuando alguno de los caracteres se eliminan / cambian.
R. Kap
fuente
0

Bash + sh + zsh + ksh + Windows Batch, 4 bytes:

echo

Realmente simple y satisface todas las reglas:

Emite una nueva línea que no varía en cada uno de los idiomas (pero Windows Batch, que emite ECHO is on, en el idioma que usa), no produce errores, excepto cuando se elimina o cambia cualquier letra.

user75200
fuente
1
Su respuesta parece ser casi idéntica a esta: codegolf.stackexchange.com/a/100654/65326
Uriel