Su compañía recientemente contrató a un nuevo grupo de administradores de sistemas extremadamente dedicados . Sienten que solo mirar las pantallas de la computadora es bastante limitante (quiero decir, una frecuencia de actualización de 60Hz NO es suficiente), por lo que conectaron el bus de datos de la CPU a un DAC y lo reprodujeron en un altavoz a través de la sala del servidor para que puedan escuchar a 20kHz. Un problema: son administradores de sistemas, no ingenieros eléctricos, y la configuración de sus altavoces se sigue rompiendo. Pensaron que esto es causado por cambios demasiado abruptos en los valores de bytes en el código que los ingenieros de software compilan en el mainframe. Los administradores del sistema ahora están organizando una pequeña competencia para ver quién puede hacer el código más suave para la configuración de sus altavoces.
Reto
Su misión es crear un programa o función en un idioma de elección que tenga la menor diferencia posible entre bytes consecutivos (consulte la sección Cálculo). Este programa tendrá la tarea de calcular su propio puntaje.
Entrada
Una cadena ASCII stdin
o el equivalente más cercano de su idioma, o como una entrada de función si está creando una función. Dado que su programa tendrá que tomarse como entrada para calcular su puntaje, su programa debe admitir Unicode si contiene algún Unicode. De lo contrario, ASCII es suficiente. Se puede suponer que la entrada tiene al menos 2 bytes de longitud.
Cálculo
Cada carácter de la cadena se convertirá a su equivalente numérico, utilizando el estándar ASCII. Luego, la diferencia entre todos los personajes se cuadrará primero y luego se sumará . Por ejemplo, la cadena abd
obtendrá una puntuación de 1²+2²=5
.
Salida
La salida será el título de su entrada. Esto significa que debe estar precedido por a #
o anexado por una nueva línea y un -
(guión). Luego, debe mostrar el nombre de su lenguaje de programación, seguido de una coma, un espacio y luego un número entero que representa el resultado del cálculo. Por ejemplo
#C++, 98
Sería una salida válida. La salida se debe proporcionar en stdout
su idioma o el equivalente más cercano, o como un valor de retorno para su función.
Tanteo
Su puntaje será el valor calculado por su programa, con el programa como entrada.
Editar: debería manejar nuevas líneas ahora, lo siento por antes, amigos
Aquí hay un script Pyth para verificar el cálculo del puntaje.
fuente
Respuestas:
CJam,
1051827643569545407327279235233229El programa anterior genera el código fuente real, que tiene una longitud de 1,179,112 bytes.
Pruebas
Usando el intérprete de Java , el código fuente puede generarse y probarse así:
Versión alternativa
Con un costo de 36 puntos, para un puntaje final de 265 , podemos hacer que el código fuente sea 99.92% más corto:
Puede probar esta versión en línea en el intérprete de CJam .
Idea
Queremos ejecutar el código
manteniendo el puntaje lo más bajo posible. Para lograr esto, vamos a construir esa cadena carácter por carácter (con algunas operaciones no antes y después) y evaluar el resultado.
Afortunadamente,
'
(empujar caracteres literales),(
(decremento) e)
(incremento) son caracteres ASCII consecutivos, por lo que empujar caracteres arbitrarios es relativamente económico.Los caracteres ASCII después
'
se pueden insertar como'()…)(
, donde el número)
depende del punto de código.Por ejemplo,
+
se puede empujar como'())))(
. La distancia entre'
y(
, y(
y)
es 1. El final se)(
cancela entre sí; su única función es allanar el camino para lo siguiente'
(correspondiente al siguiente carácter) con caracteres consecutivos.Los personajes empujados de esta manera aumentarán la puntuación en 4 puntos.
Los caracteres ASCII anteriores
'
se pueden insertar como''(…(
, donde el número(
depende del punto de código.Por ejemplo,
#
se puede empujar como''((((
. La distancia entre'
y(
es 1.Los personajes empujados de esta manera aumentarán la puntuación en 2 puntos.
''(…(
en realidad funciona para todos los caracteres ASCII, ya que el carácter tiene 16 bits de ancho y se ajusta. Por ejemplo,+
se puede empujar como''
, seguido de 65.532(
s.Esta técnica se usa en la versión de 1,2 megabytes del código.
El personaje
'
puede ser empujado como''
, dejando la puntuación no afectada.Código
fuente
Haskell,
1528279574291196839217744771742Uso (nota:
"
tiene que escapar):Antepongo la cadena vacía
""
a la cadena de entrada para ayudar al intérprete de Haskell a descubrir los tipos. Sin la inferencia de tipo falla, el código es demasiado polimórfico. El resto es lo de siempre: asigna cada carácter a ascii, haz una lista de las diferencias de vecinos, el cuadrado, la suma y el nombre del idioma.fuente
> <>, 30227
Gah, el título duplicó mi puntaje; en palabras de mi propio programa, n & oooooo! Me tomaré un tiempo más tarde para mejorar esto. También sé que este puntaje puede estar desactivado ya que realmente no puedo ingresar nuevas líneas en el intérprete en línea y no estoy seguro de que haya una manera de llenar una pila de entrada en el oficial.
De ninguna manera está completamente optimizado, pero aprovecha al
máximola relativa proximidad (al menos en términos de caracteres ASCII) de los comandos en> <>. No podía enviar fácilmente la nueva línea como entrada, así que utilicé el verificador de puntuación Pyth, pero coincide con un montón de casos de prueba aleatorios que utilicé, por lo que debería estar bien con respecto a eso.Aquí hay uno con una puntuación de 30353 (que debería ser correcto ya que es una línea):
fuente
Java,
664656550662434Sorprendentemente corto. Acepta una matriz de caracteres en lugar de una cadena.
Usé un programa para generar los mejores nombres de variables.
fuente
((Function<char[],String>) ABCD->{…}).apply(…)
gracias. Estas lambdas parecen estar bastante incompletas sin el tipo de contexto.K5, 25478
Solución bastante simple. Esta es una función que toma su entrada a través de una cadena.
fuente
Windows PowerShell ISE anfitrión, 62978
638946796077050Editar: ahorró algunos puntos al deshacerse de la
$A
variable y en lugar de contar hacia atrás a través de la cadena, y también al convertir algunas palabras clave a MAYÚSCULASEdit2: ahorró algunos puntos más en
$($HOST.NAME)
lugar dePowerShell
Edit3: guardó algunos puntos más al intercambiar nombres de variables y cambió la forma en que se genera la salida.
Utiliza variables nombradas con números, ya que están "más cerca" de
$
modo que nuestra penalización es menor.Es interesante no utilizar técnicas regulares de golf. Por ejemplo,
|%{$
es 22534, mientras|foreach{$
que solo es 8718.Esto probablemente sea casi óptimo sin cambiar las técnicas.
fuente
MATLAB,
1921439748394443878537593¡Gracias a Luis Mendo por reducir aún más la diferencia!
¡Gracias a NumberOne por reducir el recuento de ruido cambiando el nombre de la variable de entrada!
Como funciona esto
ans
variable predeterminada en MATLABA9876543210
e imprime la suma de las diferencias vecinas al cuadrado de la cadena.diff
encuentra diferencias vecinas por pares en una matriz y produce una matriz delength(A9876543210)-1
. Al usardiff
una matriz de cadenas, esto se convierte en unadouble
matriz donde se generan los códigos ASCII de cada carácter y las diferencias de los pares consecutivos resultan en otra matriz.diff(A9876543210)'
realidad produjo más ruido que conA9876543210.'
(¡gracias Luis Mendo!)fuente
A=
norm(diff(B))^2
es más corto%d
.B
como nombre de variable?A=@(A)...
es válido MATLAB, ya queA
tiene un alcance.QBasic, 38140
YAY PARA LA SINTAXIS SHOUTY
(Probado con QB64 .)
Este es un programa completo que ingresa la cadena y genera la respuesta. La única limitación aquí es que el programa no puede tomar entradas de varias
LINE INPUT
líneas ( puede manejar cualquier cosa siempre que sea una sola línea).Desobuscado:
Convenientemente, pasar una cadena de caracteres múltiples para
ASC
obtener el valor ASCII del primer carácter. También convenientemente, las variables numéricas se inicializan automáticamente a cero.fuente
Python 2, 91026
Define una función anónima que toma una cadena y devuelve la puntuación. Pruébalo en línea .
La mayor parte de esta es una aplicación funcional bastante sencillo: zip
A
conA[1:]
para obtener una lista de pares de letras, luego restar susord
s, cuadrado y suma con una expresión generador.Observe que las dos variables dentro de la expresión generador están solamente siempre seguidos por los siguientes caracteres:
)
,,
, y el espacio. Los tres tienen valores ASCII muy bajos, por lo que nos corresponde terminar cada variable con un carácter con un valor ASCII tan bajo como sea posible. El carácter más bajo que puede terminar una variable en Python es0
. Además, cada oportunidad que tengamos para dividir un solo salto grande en dos saltos más pequeños reducirá la puntuación:A0
cuesta 289, peroA90
es solo 145 yA9876543210
es un miserable 73.(Este enfoque no ayudó a la variable lambda
A
, probablemente porque es seguida de[
una sola vez).fuente
JSFuck, 144420642
Construirlo desde:
Pega esto en JSFuck.com cuadro de entrada pequeña 's compilarlo a JSFuck. El resultado es un script largo de 112701 caracteres, por lo que no puedo ponerlo aquí. Los dos últimos caracteres de este script son paréntesis, coloque la entrada entre ellos.
El programa tarda casi 20 segundos en mi computadora para evaluarse a sí mismo.
Explicación
Tuve más tiempo para trabajar en esto, así que me senté e intenté optimizar los nombres de las variables. Aquí están los nombres de variables que vale la pena usar, en orden de puntuación.
Aquí está el JavaScript que he traducido a JSFuck:
Le eché un vistazo más de cerca al traductor de JSFuck.com y descubrí cómo funciona su función de evaluación. Con "Fuente de evaluación" marcada, el código se convertirá en una función JSFuck de ejecución automática. Sin embargo, para obtener la entrada, necesitamos acceder a los argumentos [0] desde la función. Esto trae nuestro código JS final a ...
(Si se pregunta por qué mi versión anterior tuvo una puntuación más baja que esta, es porque fue un programa JSFuck que devolvió una cadena que necesitaba ser evaluada como JS. Esta es también la razón por la que no la dejé en la publicación)
fuente
abs
es innecesario. Supongo que eso podría hacer la diferencia ... :)JSFuck, 102280181
.CJam,
236631938911547Pruébalo en línea
Está empezando a parecer que esto se puede empujar casi infinitamente al agregar estratégicamente más personajes. Pero creo que estoy comenzando a alcanzar un punto de rendimientos decrecientes aquí, así que me detendré por ahora. Por ejemplo, donde tengo
ULC;;;
, podría usar todo el alfabeto al revés seguido de 26;
, pero las ganancias se hacen cada vez más pequeñas.Con mucho, la brecha más grande que me queda es entre el
m
y el,
en la cadena inicial. No he encontrado nada razonable para deshacerme de él. Estoy seguro de que hay maneras. Pero si lo llevo al límite, podría comenzar a parecerse a la solución de Dennis ...fuente
JAVASCRIPT, 33911
Esta es, con mucho, una de las optimizaciones más tontas que he hecho en un código de golf ...
Apoyos a Neil para la sugerencia de "comentario no deseado" = P
fuente
/**/
en lugares apropiados.JAVASCRIPT, 31520
Esta solución era
significativamente más ridícula,muy diferente de la otra, y sentí que merecía su propia respuesta.Son 7306 caracteres, la mayoría de los cuales es el programa real codificado en esa cadena 0/1, y el resto simplemente para decodificarlo. Funciona al obtener el índice de cada '1' menos el índice del '1' anterior para obtener el valor de carácter necesario. Luego evalúa la cadena resultante en la función real, que es esencialmente un programa de golf estándar para resolver el problema (que solo tiene unos 105 caracteres).
fuente
R,
68911571835381652224Toma una cadena de STDIN y la convierte en un entero a través de raw. Difunde, cuadra y suma el vector resultante. El resultado se devuelve como una cadena. Gracias a @nimi por el consejo de nombre variable.
fuente
Mathematica, 33552
Este código se evalúa como una función sin nombre, que calcula el "ruido" de una cadena de entrada. Hace uso del hecho de que la representación ASCII de datos binarios es esencialmente "silenciosa". Los datos binarios que ves son la cadena
lo que habría sido una respuesta válida por sí sola, con un puntaje de 37848.
Todo lo demas
simplemente decodifica la cadena binaria y la interpreta como código de Mathematica. Tenga en cuenta que el comentario vacío de Mathematica
(**)
es muy "silencioso" y en realidad elimina el ruido del"
s.fuente
Java8:
1171701005089906298890Con la ayuda de la expresión lambada y la asignación en línea de la variable puede acortar un poco este código.
fuente
Java,
129300128400110930106581105101Este desafío realmente me hizo pensar más en los personajes que usaría y en la optimización más que en encontrar la solución más corta. Seguiré trabajando para bajar el número.
Esta es una función lambda,
B
siendo la cadena la que representa la función. No olvide escapar de las comillas ("
) al pasar esto como una cadena.fuente
Pyth, 16391
El único truco de nota utilizado aquí es la codificación de base 256
#Pyth,
, que cuesta mucho menos que la cadena en sí.fuente
M, 47033
52798Para usar esto, tenemos que escapar de las comillas y los caracteres de espacio en blanco "escapar" (¡que son significativos en MUMPS!) Así:
Tenga en cuenta que "M" es un nombre alternativo para "MUMPS": existe un desacuerdo entre los profesionales acerca de cuál es el correcto. Naturalmente, he elegido la opción más corta aquí.
fuente
NEW
rellenar). Entonces, cuando empiezo a hacer aritmética enAAAA
(ahoraAAA9876543210
), se obliga a0
(¿tal vez eso es solo un detalle de implementación de Caché? No tengo una instalación GT.M para probar). Buena decisión sobre las prioridades del operador; Siempre me resulta difícil pensar en términos de operaciones puramente de izquierda a derecha. (También olvidé que M tiene un operador de exponenciación; no es algo que surge a menudo cuando escribes aplicaciones CRUD).Rubí, 118402
Se lee en un archivo a través de la línea de comandos, como
ruby diff.rb /path/to/file
. Hay espacio para mejorar, y eso es algo en lo que estoy trabajando en este momento.fuente
C ++ 166345
fuente
Perl, 93556
Trataré de reducir esto un poco más.
Resulta que las llaves (
{
y}
ASCII 123 y 125) y el guión bajo (_
ASCII 95) son muy caros ya que todos los otros caracteres están en el rango de 30-70, por lo que formateéif
la forma en que lo hice, y por qué estoy usando en$AAAAA
lugar de la amada de Perl$_
.Lamentablemente, todas las variables con símbolos son de solo lectura, por lo que no puedo aprovechar las combinaciones como
$#
y$$
.fuente
F #,
136718130303Donde hay un
\n
después del;
.fuente
POSIX Shell, 172026
lástima que no pueda obtener el mismo resultado que el corrector Pyth (178386) ...
fuente
Lua,
171078117896Golfizado:
Sin golf:
fuente
C ++, 49031
Una macro C ++ que toma una cadena en C y escribe el resultado en la salida estándar
Pruébalo en línea!
fuente
C ++, 5
fuente