Inspirado por esta pregunta sobre SO , su tarea es producir un programa que sea válido en (al menos) dos versiones principales de su idioma elegido que produzca resultados diferentes.
Reglas
- Se puede usar cualquier idioma que tenga más de una versión principal.
- Para los propósitos de este desafío, sugeriría que una "versión principal" es donde cambia el primer número en el número de versión.
- PHP 4 y PHP 5 son diferentes, PHP 5.3 y PHP 5.4 no lo son.
- Sin embargo, dado que no conozco el esquema de versiones para todos los idiomas, si puede argumentar su caso lo suficientemente bien, estoy seguro de que la comunidad determinará si usted ha sido justo al determinar usted mismo la "versión principal".
- Para los propósitos de este desafío, sugeriría que una "versión principal" es donde cambia el primer número en el número de versión.
- El código debe compilarse y ejecutarse con los mismos indicadores e ingresar cada vez
- Excepto para cambiar la versión del idioma si esto es pertinente
- Los errores no cuentan como salida y las respuestas que producen errores se descalifican (en lugar de ignorar la salida de error)
- El programa no debe tomar otra entrada que la requerida para que se ejecute.
- Para cada versión dada, la salida siempre debe ser la misma
- La intención es que el cambio sea consecuencia de un cambio en la especificación del lenguaje en lugar de la especificación VM o metadatos ambientales.
Tanteo
- puntuación de tipo de código de golf para la longitud,
+1
por lo que para cada carácter / byte -1
para cada diferencia de caracteres en la longitud de la salida.- p. ej., salidas de la versión 1
abcde
(5 caracteres), salidas de la versión 2123abc
(6 caracteres) =-1
- p. ej., salidas de la versión 1
Otras reglas
- Se aplican excepciones estándar: no hay programas externos, solicitudes web, etc.
- Su programa debería finalizar (en 2 segundos)
- La puntuación más baja gana.
Puntuación "mejor"
Mantenga sus respuestas originales, en aras de la equidad, marcaré al ganador según las reglas originales.
Dado que mi puntuación original está fundamentalmente rota, ¿por qué no volver a puntuar / volver a intentar con el siguiente sistema de puntuación:
- puntuación de tipo de código de golf para la longitud,
+1
por lo que para cada carácter / byte +1
para cada diferencia de caracteres en longitud de salidaabcde
y123456
->+1
-1
para cada diferencia de caracteres única en la salida (limitada a la longitud de la salida más corta)abcde
y123456
->-5
12345
y123456
->-1
12345
y123455
->0
- Las puntuaciones más cercanas a cero ganan
- En el caso de un segundo desempate, gana el puntaje simple de código de golf .
code-challenge
James Webster
fuente
fuente
zzzz
yaaaa
, ¿eso me da-4
? Eso es lo que me parece.Respuestas:
Respuesta revisada para un "mejor" sistema de puntuación
C89 / C99, Puntuación: 0
Mi programa tiene 52 caracteres y usa el mismo mecanismo que en mi respuesta original para lograr una salida diferente. Esto funciona porque C89 no trata
//
como un comentario:Los resultados:
Vieja respuesta:
C89 / C99, Puntuación: -Infinito?
No estoy completamente seguro de si este programa no rompe las reglas, pero no importa. Este programa explota el hecho de que en C89
//
no es un comentario válido, pero lo/* ... */
es.Usando el truco de comentarios se ejecuta otra función. En C89, la función solo se imprime
"trolololol..."
hasta que la pila se desborda (por lo que puede terminar en 2 segundos).C99
C89
fuente
Scores closest to zero win
esto está realmente muy lejos de cero.Python: 10 puntos menos que la siguiente mejor respuesta
En Python 2, esto imprimirá la lista completa de enteros de 0 a 99.
En Python 3,
range
es un generador, por lo que solo imprimirá "rango (0,100)".Como nunca me he topado con un límite de tamaño en los números en Python, puedo reemplazar ese 100 con un número mucho mayor (2 ** 1000, por ejemplo) y terminar con una diferencia prácticamente infinita en la salida.
Editado para reflejar el hecho de que, si bien puedo obtener una puntuación infinitamente baja para cualquier propósito práctico, no puedo alcanzar el infinito real con un programa que finaliza en menos de 2 segundos
Para el sistema actualizado de puntuación de desempate, enviaría:
Salida:
Python 2:
[0, 1, 2, 3]
Python 3:
range(0, 4)
La primera impresión tiene 5 caracteres únicos (
[123]
), la segunda impresión tiene 8 caracteres únicos (range(4)
), la diferencia en la longitud de salida es 1, el código tiene 15 caracteres, la salida más corta es de 11 caracteres ... estas reglas son bastante confusas pero Creo que esto me lleva a una puntuación final de 15 + 1 minuto (11,5 + 8) = 5.fuente
Python - 0 puntos
No tengo idea de cómo funciona: P Simplemente me topé con él mientras probaba un código aleatorio.
En Python 3, es
<class 'int'>
y en Python 2, es<type 'int'>
(usando la consola interactiva)"Mejor" Puntuación: 3 (longitud) + 1 (diferencia de caracteres) - 4 (caracteres únicos)
Python 1 - 7 puntos más antiguos
¡ Muchas gracias a @grc por esta versión y por ayudarme a restar cuatro puntos!
En Python 2, esta declaración se interpreta como la
print ()
que imprime la tupla vacía()
.En Python 3,
print
es una función y no se imprime nada.Puntuación "Mejor": 7 (longitud) + 2 (diferencia de caracteres) - 2 (caracteres únicos)
Python 2 más antiguo: 13 puntos:
Puntuación "Mejor": 12 (longitud) + 2 (diferencia de caracteres o / p) - 1 (caracteres únicos o / p)
Sé que esto no va a ganar, pero aún así respondí, ya que este es mi primer intento con Python :)
fuente
print()
.dict.itertools()
: PDO#
También cambié los algoritmos de inferencia de tipo de método genérico entre C # 2, 3 y 4. Por ejemplo:
En el método C # 2, la inferencia de tipos dice que T no puede ser ambos
int
yint?
, por lo tanto , produce2
. En el método C # 3, la inferencia de tipos dice "el mejor compromiso entreint
yint?
esint?
", por lo que eligeM<int?>
y produce 1.fuente
Rubí, 4 caracteres + 0 diferencia de longitud de caracteres - 3 diferencia de caracteres únicos = puntuación de 1
En Ruby 1.9, se imprimirá
"d"
. En 1.8, se imprime100
.Explicación:
?d
está"d"
en 1.9 y100
(el código ASCII para d) en 1.8.p x
es equivalente aputs x.inspect
.*
es a la vez repetición de cuerda y multiplicación.Versión "optimizada" para puntuación antigua:
Ruby, 8 caracteres - 999999989 diferencia de caracteres = puntaje de -999999981
Imprime
33000000000.0
para 1.8 y"!!!!!!
...!!!"
para 1.9. (?!
está33
en 1.8 y"!"
en 1.9, y*
es a la vez repetición y multiplicación de cuerdas).Realmente, podrías ir tan lejos como quisieras con la multiplicación, solo depende de qué tan rápido sea tu computadora.
fuente
Bash - -∞ (hasta límites prácticos)
Efectivamente, por mucho que tenga memoria. Por ejemplo, con aproximadamente 10 GB:
Bash 2: no admite rangos en la expansión de llaves, por lo que imprime
{0..999999999}
.Golpe 3:
Cualquier idioma - -∞ (hasta límites prácticos)
Lo tendrás en casi cualquier idioma, incluso si termina siendo un poco más complejo. Tan pronto como pueda hacer dos valores diferentes, puede escribir código que produzca resultados arbitrariamente diferentes. Un mejor método de puntuación ignoraría las diferencias en la salida.
fuente
…
en "cualquier idioma" representa cualquier truco que use para hacer que su programa dependa de un cambio en la especificación del idioma. Es la detección de versión, ya sea que lo hagaif $version >= 3
o noif isinstance(range(0),list)
.DO#
El siguiente código produciría una salida diferente para C # 5.0 y versiones anteriores de C #
Salida: C # 5.0
Salida: C # 4.0
La razón se explica en la publicación del blog de Eric Lippert
Cerrar sobre la variable de bucle considerado dañino
fuente
Python, -14 puntos (diferencia de longitud de 17-17 caracteres = -14)
Python 2 salidas:
0
Python 3 salidas:
0.6666666666666666
Versión de mejor puntuación, 5 puntos (diferencia de longitud de 3 + 2 caracteres = 5)
Python 2 salidas:
1
Python 3 salidas:
1.5
fuente
DO#
Agregué covarianza y contravarianza a C # 4, por lo que los programas de la forma:
Produciría
false
en C # 2 y 3 ytrue
en C # 4.Sin embargo, uno podría argumentar que esto no cuenta porque la biblioteca que contiene la definición de
IEnumerable<T>
también tuvo que cambiar.fuente
C ++ 98/11 - Puntuación "mejor" (115 caracteres - 115 diferencias de caracteres únicos en la salida = puntaje de 0)
Una versión ligeramente editada para cumplir con las nuevas reglas de puntuación.
Golfizado:
Versión sin golf:
La nueva solución no difiere mucho de la anterior. En la nueva solución, el resultado en C ++ 11 y C ++ 98 tiene 116 caracteres igualmente largos, pero el único carácter que tienen en común es el nuevo carácter de línea agregado por la función put.
Para C ++ 98 el
u8
enu8"\x7E"[0]
todavía será reemplazado, pero ahora con"\x0B"
. Entonces el valor resultante después del preprocesamiento será"\x0B""\x7E"[0]
. Las dos cadenas se concatenarán"\x0B\x7E"
y el operador del subíndice accederá al primer elemento, en este caso, el carácter con el valor 11 en la codificación de caracteres. Ademási
, se agregará el valor de , que inicialmente es 114. Por lo tanto, el carácter con el valor 125 se escribirá en la matriz resultante. A medida quei
pasa a cero, todos los valores de 125 a 11 se escribirán en la matriz eputs
imprimirán todos los caracteres con los valores de 11 a 125, más la nueva línea final.En C ++ 11
u8"\x7E"[0]
se interpretará como una cadena UTF-8 que consta del carácter único con el valor hexadecimal 7E. El operador de subíndice ahora accederá a este carácter yi
se le agregará el valor de , dando como resultado el valor decimal 241 durante la primera iteración. Mientrasi
va a cero, todos los valores hasta 126 se escribirán en la matriz eputs
imprimirán los caracteres con los valores de 126 a 241, más la nueva línea final.Dependiendo del conjunto de caracteres utilizado, esto producirá resultados diferentes, ya que la mayoría de los conjuntos de caracteres solo tienen los primeros 128 caracteres en común.
Para ISO-8859-2, la salida sería la siguiente:
C ++ 98:
C ++ 11:
C ++ (106 caracteres - 107 diferencia en salida = puntaje de -1) (ANTIGUAS REGLAS)
Golfizado:
Versión sin golf:
Compilado con
g++ -std=c++98 main.cpp
yg++ -std=c++11 main.cpp
.En realidad, puede reemplazar
108
con cualquier número positivo en el rango entero para lograr puntajes negativos. Mientras sea más grande que 108;)En C ++ 98
#define u8 "f"
hará que el preprocesador se reemplaceu8""[0]
con"f"""[0]
. Esto dará como resultado"f"[0]
, que finalmente se convierte en el carácter único'f'
, que se escribe en una matriz.puts(c)
imprimirá la matriz resultante, que consta de i-1'f'
.En C ++ 11
u8""[0]
hará que la cadena vacía se interprete como una cadena UTF-8, por lo que no se realiza la concatenación de cadenas. Como se trata de una cadena en C, el operador del subíndice accederá al byte nulo de terminación y lo escribirá en una matriz.Al final
puts(c)
se imprimirá la matriz resultante, que consta solo de bytes nulos. Pero comoputs
deja de leer la entrada tan pronto como encuentra un byte nulo, solo imprimirá una nueva línea y nada más.fuente
?
(al menos en mi sistema (Mac))CSS2 vs CSS3 48 puntos
Representado como
ABCDEFGHIJKLMNOPQRSTUVWXYZ
(minúsculas) en los navegadores CSS3Representado como
abcdefghijklmnopqrstuvwxyz
en navegadores que no son CSS374 caracteres - 26 caracteres únicos diferencia = 48
fuente
Perl, 24 caracteres - (9 * (10 ^ 9)) - 1 diferencia de caracteres = puntaje de - ((9 * (10 ^ 9)) - 1) +24
Imprime 9e9 veces
a
para todas las versiones inferiores a 5, imprimea
para todas las versiones superiores a 5. Puede hacer que la puntuación sea infinitamente baja simplemente agregando mása
s a la segunda salida.fuente
Befunge, 36-378 = -342; 164 - 2576 = -2412
En Befunge 93, esto generaría 3 espacios, seguidos por
<v
, seguidos por 76 espacios, seguidos por<v
, luego 76 espacios, luego<v
, 76 espacios, luego<v
seguidos por 77 espacios, luegov
seguidos por 78 espacios. Longitud:3 + 2 + 76 + 2 + 76 + 2 + 76 + 2 + 77 + 1 + 78 = 395
esto es trivialmente extensible al agregar líneas adicionales similares a las primeras 5 líneas.En Befunge 98, esto daría salida
<v <v <v <v v
.La diferencia de longitud:
395 - 17 = 378
. Entonces el puntaje habría sido (según las viejas reglas):-342
Nota: Podría haber obtenido una diferencia aún mayor si lo usara en
.
lugar de,
; la diferencia hubiera sido-684
Cambio de regla:
Esto es un poco más complicado.
Salida Befunge 93:
Salida Befunge 98:
Longitudes:
2576
. Ninguno de los caracteres entre las cadenas es el mismo, por lo que si entendí el desafío correctamente, mi puntaje es164 - 2576 = -2412
(sí, se suponía que debía apuntar0
, pero fue más divertido). Si necesito hacer que cada carácter de cada cadena sea único y diferente, puedo hacerlo, por favor dígame.fuente
Powershell, puntuación "Mejor", -163 (15-178 char diff = -163)
Powershell V2
Powershell V3
fuente
PHP, Puntuación: 0 (mejor caso)
Wow, esto va a ser divertido de explicar.
Según este sitio web , la
srand()
función parece estar rota de PHP 5.1.5 a PHP 5.3.14 . Por lo tanto, vamos a tener en consideración PHP 4.4.9 y una versión aleatoria de PHP 5 que se encuentra en el intervalo de versión especificado anteriormente.Salida de PHP 4.4.9:
1505335290
No creo que esto rompa las reglas; Como esto parece ser un error, la salida debería ser la misma, pero no lo es. Nuestra otra versión de PHP simplemente omitirá la
srand()
función y generará un número aleatorio.fuente
Java (alrededor de -2.000.000.000)
Las versiones de Java a veces se llaman 1.x, pero creo que todavía está dentro de las reglas.
La manera fácil es verificar si existe una clase que se introdujo en una versión específica.
(Depende un poco de su terminal si es posible generar 2 mil millones de caracteres en dos segundos / Para la nueva puntuación, reemplace
Integer.MAX_VALUE
con el recuento de bytes del programa para lograr una puntuación cero perfecta).Este código depende de la versión de VM / JDK que se use (¿eso cuenta?)
Imprime
z
s para Java 6 y JDK anteriores ysa
para versiones recientes.fuente
JavaScript (ES3 vs ES5) - 9 puntos
longitud
10
+ diferencia de longitud0
- diferencia de salida1
Salidas
1
para navegadores modernos que admiten Array.prototype.map. Salidas0
en navegadores antiguos. Probé esto con IE8.Con viejas reglas: 0 puntos
longitud
26
- diferencia de longitud26
Salidas
00000000000000000000000000
en navegadores modernos. Y cadena vacía en viejo.fuente
Python - 0
Python 2 imprime una quine, mientras que Python 3 no imprime nada.
EDITAR: actualizado, arreglado.
fuente
APL (5 - (1988894-1) = -1988888)
En las APL de estilo antiguo (como Dyalog if
⎕ML=0
*),↑
significa mezcla , que en un vector unidimensional no hace nada. En las APL de estilo APL2, como GNU APL, (o Dyalog if⎕ML=3
),↑
significa primero , que toma el primer elemento de un vector.Por lo tanto, la siguiente
5
bytes (el juego de caracteres APL hace en forma en un byte),generará
1988894
bytes (la lista de números separados por espacios del 1 al 3e5) en dialectos APL de estilo antiguo,y
1
byte (solo el primer número en dicha lista, que es1
y, por lo tanto, de longitud1
), en dialectos APL de estilo APL2.Notas:
⎕ML
significa nivel de migración . En Dyalog APL, cuanto más alto establezca⎕ML
, más funciones de estilo APL2 estarán habilitadas. Por defecto es0
. (¡Y es una variable global! ¡Diversión!)3e5
fue el valor más alto de 3 caracteres con el que Dyalog APL aceptaría⍳
.4e5
me dio unLIMIT ERROR
. Esta restricción probablemente depende del intérprete. (GNU APL no tuvo problemas con valores más altos).fuente
Bash 7 (longitud del programa de 14 bytes + 0 diferencia en la longitud de salida - 7 diferencia en caracteres únicos en la salida)
Relacionado con la respuesta de @Gilles, pero con una función de expansión diferente y versiones diferentes. Puntuación según la pregunta editada:
Salida para bash 3.x:
Salida para bash 4.x:
fuente
PHP: −134217684 (43-134217727)
Uso:
En PHP5 +, esto no imprimirá nada, ya que ip2long con argumento inválido se convierte en falso y se convierte en cero. En PHP4
ip2long("")
devuelve -1 y rellenamos la cadena vacía con 128 MB oga
.La máscara está ajustada para que regrese mucho antes de los 2 segundos en mi máquina. ¡Si no puedes hacerlo en 2s, compra un mejor hardware!
Con nuevas reglas: 0 (40 - 40. No puede acercarse más a cero).
Salidas:
fuente
Explotación de comentario C89 / C99, 45 caracteres, 0 puntaje
salida c89
QRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
- 45 char.salida c99
MLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!
- 45 char.fuente
printf
aputchar
; Lo más condenatorio es que para r5 leí mal las reglas y accidentalmente combiné puntajes nuevos y antiguos. La salida para [r5, r6] es un error. r3 en la otra respuesta C contiene exactamente el mismo error. Si observa las marcas de tiempo, verá que era r5 lo que se publicó aquí cuando se actualizó la otra respuesta. No es que importe, ya que este es el código de golf , y esta entrada satisface el desafío en menos caracteres, punto.C ++ 98 / C ++ 11
Para un compilador estándar C ++ 98, esto genera 199711 veces la letra 'x', mientras que para un compilador estándar C ++ 11, genera 201103 veces la letra 'x'. La diferencia de longitud de la salida es, por lo tanto, de 1392 caracteres. Esto significa que en realidad jugar al golf con el código fuente no vale la pena, ya que se puede lograr un efecto mucho mayor simplemente reemplazándolo
"x"
por una cadena más larga o multiplicándolo__cplusplus
con algún número.fuente
SmileBASIC 3 / SmileBASIC 2, Puntuación: -5 (puntuación original)
En versiones modernas de SB, esto se imprime
1000000000
como se esperaba, pero en la versión 2 y anteriores se imprimió10
debido a un error.fuente
TI-Basic 83 Plus vs. 84 Plus, puntaje 5-1 = 4
Salidas
2
en la TI-83 Plus, donde el mismo programa se analiza como algo que parecelength("?►DMS
porque elsetTime(
comando aún no se había introducido. Entonces, la cadena contiene dos tokens de 1 byte, su longitud es 2.Salidas
1
en la TI-84 Plus, porque una cadena que contiene un solo token de 2 bytes tiene longitud 1.fuente
Ir 1.9-> 1.10. Puntuación = 1 - 1 = 0
De 1.10 notas :
1.8:
256
1.9:
1024
1.10:
10340
fuente