¿No es molesto cuando encuentras un código y no sabes en qué idioma está escrito? Este desafío intenta resolver esto de alguna manera.
Desafío
Tendrá que escribir un programa que, cuando se ejecute en dos idiomas diferentes, genere la cadena:
This program wasn't written in <language program compiled/interpreted in>, it was built for <other language the program can be run in>!
En la salida, los nombres de los idiomas deben tener mayúsculas oficiales. por ejemplo: CJam, C ++
Ninguno de los programas debe recibir ninguna entrada del usuario.
Cuando se ejecuta en ambos idiomas, la salida debe ser stdout o equivalente.
No debería haber salida para stderr en ninguno de los programas.
Puede usar comentarios en cualquier idioma.
Dos versiones diferentes del mismo idioma cuentan como idiomas diferentes.
Si se hace esto, el programa debería generar el número de versión principal y, si se ejecuta en dos versiones menores diferentes, también debería informar la versión menor.
No debe usar funciones de versión preconstruidas (esto incluye variables que ya se han evaluado en tiempo de ejecución).
Salida de ejemplo:
Perl y Ruby:
Perl:
This program wasn't written in Perl, it was built for Ruby!
Rubí:
This program wasn't written in Ruby, it was built for Perl!
Python y C:
Pitón:
This program wasn't written in Python, it was built for C!
C:
This program wasn't written in C, it was built for Python!
Python 2 y Python 3:
Python 2:
This program wasn't written in Python 2, it was built for Python 3!
Python 3:
This program wasn't written in Python 3, it was built for Python 2!
Python 2.4 y Python 2.7:
Python 2.4:
This program wasn't written in Python 2.4, it was built for Python 2.7!
Python 2.7:
This program wasn't written in Python 2.7, it was built for Python 2.4!
Este es el código de golf, por lo que gana el código más corto en bytes.
argv[0]
?Respuestas:
Foo / CJam, 70 bytes
En Foo, como muchos han descubierto, simplemente imprime todo entre comillas dobles e ignora la mayoría de los otros caracteres o hace algo que no afecta la salida en la mayoría de los casos. En resumen,
\@
no hace nada y las cadenas se imprimen tal cual.En CJam,
\
intercambia los dos elementos superiores y@
mueve el tercer elemento a la parte superior, que organiza las cadenas en el orden correcto. Y una vez que finaliza el programa, todo lo que queda en la pila se imprime automáticamente.fuente
R"This program wasn't written in ""Fission"", it was built for ""CJam"\@'!O
"This program wasn't written in Clip, it was built for CJam!"3{4-_36+e\}/
para Clip / CJam.C89 / C99,
171152136114111107105 bytesGracias a @Hurkyls, @Qwertiys, @ jimmy23013 y @MD XF por sus sugerencias.
versión de golf:
versión sin golf:
Pequeña descripción:
Las versiones C anteriores a C99 solo tenían el comentario de varias líneas como este:
con C99 se introdujo el comentario de una sola línea. Me gusta esto:
así que si compilas una línea como esta:
el código relacionado con la compilación del compilador c99 sería:
mientras que el código relevante para un compilador c89 sería:
(ya que el primero
/
no es parte de un comentario y por lo tanto se trata como operador)fuente
//**/
. En C89, ese es el operador de división seguido de un comentario vacío. En C99,//
comienza un comentario de una sola línea, por lo que el resto de la línea está en blanco. Por lo tanto, en el C89, se convierte(90-(-4.5/-4.5))
, que es 89, mientras que en el C99, se convierte(90-(-4.5-4.5))
, que es de 99.188-c
lugar dec==99?89:99
.JavaScript / Ruby, 170 bytes
Podría ser solo 2.0, no parece funcionar en al menos 2.1.5 ... Editar: Actualizaciones según el consejo de @Jordan, ¡ espero que funcione en algunas versiones más ahora!
Abusa del
~
operador porque Ruby tratará=~
como una coincidencia de expresiones regulares que devuelve la posición de la primera coincidencia en la cadena (0
), pero JavaScript lo tratará como lo=
~/1/
que es-1
(ya que/1/
se convierteNaN
para operaciones numéricas, que tiene0
valor).fuente
NoMethodError: undefined method `log' for :log:Symbol
eval
está regresando:log
. Creo que podrías arreglarlo poniendo;c
despuésend
. ¡ Pero el=~
/= ~
truco es genial!$><<s
lugar deputs s
y usando comillas dobles para que pueda colocar la barra invertidawasn\'t
.\'
comillas dobles, y$><<
significa que puedo aplicar la corrección que mencionó y mantener el mismo recuento de bytes.Python 2 / Python 3, 92
Utiliza la verificación de versión de Python "estándar" (división de enteros vs.
fuente
Pesca / > <>
233217 bytesLa pesca es un lenguaje basado en un pescador que anda pescando . Para hacer un programa en este idioma, primero tiene que definir un muelle en el que camina. El dock solo proporciona flujo de control a un programa. El muelle en este programa es:
Cada vez que
C
se encuentra el comando, el pescador lanza su línea para atrapar una instrucción. Las instrucciones+
y-
disminuyen y aumentan la longitud de su línea respectivamente.v
cambia su dirección de lanzamiento hacia abajo. Los peces que atrapa en este programa son:> <> es un lenguaje basado en un pez que se mueve a través del agua. El
v
comando comienza a mover el pez hacia abajo, donde luego se refleja a la derecha con el\
comando. Todo entre comillas se empuja a la pila. Después de que la cuerda se empuja hacia la pila, el pez se enrolla hacia el otro lado donde se refleja hacia abajo\
. Luego imprime el contenido de la pila con:fuente
23 / Malbolge, 5688 bytes
Tenga en cuenta que el programa requiere un salto de línea final. Ninguna línea contiene espacios en blanco al final, por lo que copiar / pegar debería funcionar bien.
Verificación
Para probar el código de Malbolge en este intérprete en línea , péguelo en el área de código de Malbolge y haga clic en Load/Reset, luego Execute.
Para probar el código 23 en este intérprete en línea , péguelo en el área Fuente , presione Enterpara insertar el salto de línea final, escriba
23
en el área Consola (para cambiar de la notación 23.dezsy predeterminada a la detección automática) y haga clic Run Interpreter!.fuente
Lua / C -
182164 bytesAprovecha la función donde Lua trata una marca de hash en la primera línea como un comentario para permitir shebangs de Unix. De lo contrario, envuelve los comentarios del otro idioma en sus propios comentarios.
Para reducir bytes, confío en el comportamiento implícito que solo emite advertencias en GCC y Clang: declaración implícita de int para la definición principal e implícita de printf.
fuente
//
comentario en la parte C? Guarda 2 bytes.JavaScript / Haskell,
158 bytes147 bytesIdea general: introducir la sintaxis de comentarios de cada uno en el otro.
En una linea:
Cómo se ve esto para Haskell:
Cómo se ve esto en JavaScript:
fuente
alert
Es más golfista.Brainfuck / Foo, 769 bytes
Una respuesta extremadamente compleja y compleja ... o no.
fuente
,
al texto en el final. Creo que eso va en contra de las reglas de asignación.,
simplemente establece la celda en 0, para EOFC / Python, 238 caracteres
Esto no imprime 100% exactamente lo que se solicita, pero está bastante cerca.
Un reinicio de mi tarjeta de San Valentín .
fuente
def
y:
despuésdef main()
, y en realidad no abre un cuerpo de función para main. ¿Realmente intentaste compilar tu respuesta en C?#define def main(){0?
Falta la línea#define return
me hace llorar un poco ...C / C ++, 136
Nuevas líneas agregadas para formatear. Pruébalo en C o C ++ .
fuente
struct{}s;z=2*sizeof s
Befunge / > <> ,
141138134133130 bytes3 bytes guardados gracias a @Cole .
Para ser exactos, estoy usando Befunge-98.
Usando los hechos que:
\
es un espejo en> <> e intercambia en Befunge'string'
es una cadena en> <> y'c
es un carácter en Befungefuente
?!;>ol
PHP / MySQL, 147 bytes
fuente
SELECT"This program wasn't written in MySQL, it was built for PHP!";
Python 3 / > <> ,
177173172167 Bytes¡Gracias a @mathmandan por eliminar 5 bytes!
Bueno, esta fue una experiencia, y también una prueba. Cualquier sugerencia de golf es bienvenida, ya que esto es bastante largo. Hice todo lo posible para reutilizar el texto, pero fue bastante difícil.
Técnicamente, sería Python 3 el que debería generar este programa (y podría cambiarlo si no cumpliera con las especificaciones, pero en el ejemplo
Python
se enumeró la salida de Python / C ).Pruébelo en un intérprete en línea> <> y en un intérprete de Python 3 (el intérprete > <> requiere que ingrese el código manualmente)
Devoluciones
en> <> y
en Python
Explicación (Python)
Para el lado de Python, es bastante simple. Aquí está el código que nos interesa (básicamente el código sin comentarios, que se denota con un
#
en Python). Tenga en cuenta que en Python\
es un carácter de escape cuando se usa en cadenas, por lo que se\"
evalúa"
en la cadena.Lo que más nos importa aquí son las operaciones realizadas en la variable
aa
:La declaración impresa se evalúa así
Explicación (> <>)
Ahora llegamos a la parte más difícil. Una vez más, aquí está el código con los bits innecesarios eliminados.
Línea 1:
La pila en este momento (si está impresa):
\This program wasn't written in
Línea 2:
Tenga en cuenta que la línea 2 comienza en la
/
posición del puntero desde la línea 1 y se mueve de derecha a izquierda.La pila en este momento:
><> ni nettirw t'nsaw margorp sihT
Línea 3:
Al igual que la línea anterior, esta comienza en
\
, que es donde la línea 2 envía el puntero. Tenga en cuenta que debido a que el puntero se ajusta alrededor de la línea cuando llega al primeroa
, escribiré mi explicación en orden de dónde va el puntero (y, por lo tanto, qué se ejecuta)La pila en este momento (
x
es el personaje formado por la adición de "r" y un espacio. No es el personaje real, solo un marcador de posición de mi parte):xof tliub saw ti ,><> ni nettirw t'nsaw margorp sihT
Línea 4:
El puntero simplemente continúa hacia abajo, por lo que esta línea no garantiza más explicaciones.
Línea 5:
Comenzando en
/
y yendo hacia la izquierda.La pila en este momento (la salida se invirtió):
!nohtyP rof tliub saw ti ,><> ni nettirw t'nsaw margorp sihT
Y eso debería ser todo por la explicación. Avíseme si hay alguna inconsistencia entre la explicación / código o si hice algo mal; Aprendí un poco más mi código mientras estaba escribiendo la explicación para poder mezclar fragmentos de código antiguo y nuevo.
fuente
aa[:-2][::-1]
conaa[-3::-1]
. En este caso, por supuesto, eso puede interferir con el formato> <>, pero quizás valga la pena considerarlo si aún no lo ha hecho. En particular, estoy bastante seguro de que necesita un espacio debajov
de la línea anterior, pero pareceprint(aa[-3::-1]+"Pytho"
que encajaría en los 24 caracteres a continuacióna=", it was built for "+
, y luego podría poner un espacio seguido por+"n"+a)
. No estoy seguro de si esto rompería algo más, pero si funciona, ahorrará algunos bytes.print aa[-3::-1]+"Pytho" +"n"+a
. Sin embargo, otra pregunta: en la versión> <>, ¿qué sucede con el1
que originalmente se introdujo en la pila?Batch .BAT File / Batch .CMD File,
194185BytesEditar: se guardaron 9 bytes y se corrigió la falta
!
gracias a DLoscSí, hay diferencias entre los archivos BAT y CMD. Referencia. Esencialmente, CMD establece el comando
ERRORLEVEL
en unSET
comando, mientras que BAT no lo hace, lo que significa que aquí elERRORLEVEL
conjunto delmd
comando con formato incorrecto se borraSET v=1
en una versión pero no en la otra. Este script se basa en el ejemplo proporcionado por "Ritchie" en ese hilo del grupo de noticias.Tenga en cuenta que la secuencia de comandos abreviada de arriba se supone
ENABLEEXTENSIONS
que se estableceON
(de forma predeterminada en todas las plataformas). El script expandido a continuación lo establece explícitamente para garantizar la funcionalidad correcta. Sin eso, elSET
comando para CMD no permite todas las extensiones, y (en algunos sistemas, tal vez) podría no establecerloERRORLEVEL
adecuadamente.Ampliado y remarcado
fuente
Javascript / C,
148146143 caracteresC:
http://codepad.org/u8UimGLchttp://codepad.org/Y80M5jpchttp://codepad.org/m4DB2NddJavascript: simplemente copie el código a la consola del navegador
fuente
CJam / GolfScript,
8178 bytesVersión original de 81 bytes:
fuente
PHP / Perl,
9896 bytesNo sé si esto es trampa o no, ya que, por lo que puedo decir, la única forma de ejecutar PHP sin una
<?
etiqueta de apertura es algo asíphp -r $(cat codefile.php)
. Pero suponiendo que sea legal ...//
es un comentario de PHP, pero en Perl es una expresión regular (que, en una declaración en sí misma, no hace nada). El resto debería explicarse por sí mismo.Editar: ahora usando una palabra desnuda en la parte de solo Perl. En primer lugar, quería usarlos para ambos idiomas, pero PHP muestra una advertencia cuando lo hace, contrario a "No debería haber salida para stderr".
fuente
<?'>#';
es una sintaxis válida en ambos idiomas.Ruby / Python, 105 caracteres
fuente
JavaScript 1.8 / JavaScript 1.7, 89 bytes
Porque Array.prototype.reduce es nuevo en 1.8
EDITAR: Golfed 7 bytes inicializando directamente en
a
lugar de usarreverse()
EDITAR:
JavaScript
se puede escribir comoJS
, ahorrando 8 bytesEDIT: Gracias por Hedi señalando que puedo ahorrar 3 bytes más si yo no uso la variable
b
másEDITAR: Golfed 6 bytes calculando
7+a
y8-a
, dondea=1
si se define la reducción (JS 1.8) ya=0
si no está definido (JS 1.7)EDITAR: Hedi jugó 6 bytes más, lo que sugiere el uso de una cadena de plantilla
EDITAR: ETHproductions arrojó 2 bytes sugiriendo en
a=!![].reduce;
lugar dea=[].reduce?1:0;
EDITAR: no1xsyzy jugó un byte más sugiriendo revertir el cheque booleano
fuente
a=[].reduce?1:0;
aa=!![].reduce;
.a
para mantener el valor1
o0
notrue
, ofalse
SWI-Prolog 6 / SWI-Prolog 7, 156 bytes
Utiliza el hecho de que las comillas dobles
""
son códigos de cadena (es decir, una lista de códigos de caracteres) en las versiones SWI-Prolog anteriores a 7, y son un tipo de cadena adecuado en la versión 7.is_list("")
, por lo tanto, será falso en la versión 7 y verdadero en las versiones anteriores.fuente
BF / SPL, 5342 bytes
Estoy bastante seguro de que este es el primer políglota del lenguaje de programación de Shakespeare en este sitio.
Probablemente no gane ningún premio. Funciona infiltrando el código BF en los títulos de acto / escena / programa. El código SPL usa puntos de exclamación en lugar de puntos, excepto en algunos casos. Se supone que los programas no deben ingresar datos, por lo que las comas en las declaraciones de caracteres se "comentan" al poner a cero las celdas y poner corchetes alrededor de las comas. El mismo procedimiento se aplica al ocultar los corchetes alrededor de las instrucciones enter / exeunt.
Pruebe BF en https://repl.it/E8Hh/23 .
El código SPL se probó en el compilador que se encuentra aquí: https://github.com/drsam94/Spl/ .
fuente
Ruby 1.8 / Ruby 1.9, 87
En Ruby 1.8,
?9
es el valor ASCII de "9", que es 8 módulo 49. En Ruby 1.9, es la cadena "9", y%49
es una operación de formateo que no hace nada ya que "9" no tiene cadenas de formato en eso.fuente
Python 2.7.9 / Python 2.7.10, 127 bytes
Hemos tenido un par de publicaciones que utilizan versiones menores, pero ninguna que haya pasado al siguiente nivel ...
Pruébelo en Ideone (Python 2.7.10) y repl.it (técnicamente Python 2.7.2, pero debería dar el mismo resultado que 2.7.9).
Python 2.7.10, de acuerdo con el registro de cambios :
Esto pasó
len(dir(types))
de 42 a 43, dando una diferencia numérica que podemos explotar para generar la salida deseada.fuente
Python / QBasic,
160142 bytesProbado con Python 3 y QBasic 1.1 . No funcionará en Python 2 sin agregar
from __future__ import print_function
a la línea 4.1#
es la expresión1
(no-op) seguida de un comentario. En QBasic, es un número de línea (con el sufijo de tipo que lo marca como aDOUBLE
). LaDEFSTR
declaración le dice a QBasic que todas las variables cuyos nombres comienzan conA
oB
(sin distinción entre mayúsculas y minúsculas) son variables de cadena. De esa manera, podemos llamar a nuestras variablesa
y enb
lugar dea$
yb$
(que no funcionaría en Python).'
comienza un comentario. En Python,''
es la cadena vacía (no-op). Luego intercambiamos los nombres de los idiomas y definimos un alias paraprint
función (dado que las palabras clave QBasic se formatean automáticamente en mayúsculas).Si se me permite apagar el autoformatter (que es una opción en QB64 , aunque no en el QBasic original), puedo bajarlo a 114 bytes usando Python 2 :
fuente
Perl / Ruby, 129 bytes
No hay abuso de expresiones regulares en este, solo aprovechando el hecho de que 0 es verdadero en Ruby para
eval
una definición desort
(que realmentereverse
es) eprintf
ing. A Ruby no le gustaba usar la lista para los argumentos, así que tuve que hacer cada uno individualmente.fuente
a
tiene que ser una variable de instancia, en lugar de una local?@
sigilo en una variable en Perl denota que es una lista, en Perl almacenar, por ejemplo$a
, no produce ningún resultado./// y Retina , 95 + 3 = 98 bytes
+3 bytes para el
-s
bandera en Retina.Explicación para ///
La primera instrucción es
elimina todas las nuevas líneas del resto del código, lo que resulta en
Todo hasta el
!
es simplemente un literal e impreso en STDOUT. La siguiente instrucción esPero la cadena de búsqueda
?.
no se puede encontrar, por lo que no sucede nada. Entonces, el código restante//!
es una instrucción incompleta, por lo que el programa termina, después de haber impreso la cadena correcta.Explicación para la retina
Esto le dice a la retina para sustituir
/
a//
. Pero la entrada está vacía, por lo que esto no coincide con nada.Esto reemplaza la entrada con la cadena en la segunda línea.
Esto coincide con la cadena
\/\/\/, it was built for Retina!
y la reemplazaRetina, it was built for ///!
para dar el resultado correcto.fuente
-s
, ¡aunque decir lo que hice arruinaría la diversión! : Dsed / Hexagony 251 Bytes
sed: ¡ Pruébelo en línea!
Hexagonía: ¡ Pruébelo en línea!
En sed, imprime la cadena correcta si coincide con la cadena vacía al final (siempre). La segunda línea es un comentario. Esto requiere una cadena en STDIN, pero puede estar vacío ( permitido según este consenso ).
Ejemplo:
En Hexagony, el primero
/
redirige a la parte inferior izquierda, sigue el lado izquierdo hasta donde comienza la parte sed, luego se envuelve de izquierda a derecha, baja una línea, de derecha a izquierda, baja una línea, y así sucesivamente. El hexágono expandido se ve así:fuente
;
toma el mod 256 de celda actual para determinar un valor de byte (por ejemplo, puede imprimir un espacioP0;
independientemente del valor de celda actual). Este script de CJam genera todos los pares: cjam.tryitonline.net/…Python / Retina,
133120119117115 bytesAhora que sé más sobre Retina y expresiones regulares, lo he jugado un poco más. También en realidad funciona ahora.
Python solo imprime la declaración. Retina reemplaza cualquier cosa con la declaración de impresión de Python, luego elimina las
print
comillas y cualquier. Entonces, me cambiaréPython
yRetina
y quitar la#
.Probar en Python | Prueba en retina
fuente
JavaScript / CoffeeScript,
125124 bytesEn CoffeeScript,
a==b
se compila ena===b
, lo que hace que la condición intermedia sea falsa. Usé un poco de magia para convertir el valor booleano en un entero.¡Guardado 1 byte gracias a @DomHastings!
Versión de 125 bytes:
fuente
+(b=0=='0')
lugar de+0
!b^1
, creo que puedes usar~b
undefinedScript
.~1 == -2
. Pero(b=0=='0')+0
se puede escribir como+(b=0=='0')
. Ob=+(0=='0')
. Eso debería cortar 1 byte.