¿Por qué un simulador?
Los niños en estos días no tienen el tiempo ni la ambición de ir a apilar cajas en el balancín o jugar con objetos físicos equilibrados. ¡Esto deja mucho espacio en el mercado de software para un simulador de palanca que, según mis modelos, se venderá como un loco!
Ayuda de programación deseada
He presentado la patente de dicho juego (pendiente), pero necesito un programador experto para que escriba la lógica del juego. Según tengo entendido, es una práctica estándar compensar a los programadores en función del tamaño en bytes del programa final. Como tal, otorgaré este lucrativo contrato al mejor postor.
Especificación
Una palanca es una serie de cajas o espacios vacíos que se equilibra con un punto de apoyo. Cada caja tiene un peso particular de uno a nueve y los espacios no tienen peso. Como sabes, el peso de una caja en la palanca es directamente proporcional a qué tan lejos está esa caja del punto de apoyo. Una caja de peso 4
que se encuentra en el tercer espacio desde el punto de apoyo contribuirá 12
con unidades de fuerza efectivas a ese lado de la palanca.
Necesito un programa que, dada una palanca de entrada, produzca si la palanca se inclinará hacia la izquierda, la derecha o estará perfectamente equilibrada.
Pautas de E / S
- Me escribirás un programa.
- La entrada contendrá una línea de texto.
- La entrada vendrá de
stdin
o como una cadena de línea de comandos. - Las cajas serán representadas por los caracteres '
1
' a '9
'. Estos personajes representan sus respectivos pesos. Un espacio vacío será representado por un espacio ''. El punto de apoyo estará representado por un cursor '
^
'.
Una palanca de entrada de muestra podría verse así: 8 2^ 941
Esta palanca está perfectamente equilibrada: (4*8) + 0 + 0 + (1*2) == 0 + (2*9) + (3*4) + (4*1) == 34
- No habrá espacios iniciales ni finales. No habrá nueva línea final.
- No es necesario manejar entradas mal formadas, las entradas siempre tendrán exactamente un punto de apoyo, y solo números y espacios.
- La salida indicará si la palanca es pesada a la izquierda, pesada a la derecha o equilibrada.
- Su programa debe tener exactamente 3 salidas posibles que podrían resultar de una entrada bien formada. Puedes elegir cuáles son.
- La salida debe imprimirse
stdout
o ser el código de retorno del programa.
Casos de prueba
Aquí, he utilizado L
, R
, B
en el sentido de pesado izquierda, derecha-pesado, equilibrado:
Entrada:
11 ^9
Salida:B
Entrada:
321^ 12
Salida:L
Entrada:
9^ 1
Salida:R
(Si alguien tiene algunos casos de prueba "más complicados", no dude en editarlos).
Bibliografía
No necesariamente inspirado, pero relacionado con Balancear un conjunto de pesas en un balancín
fuente
The output must either be print to stdout or be the return code of the program.
Bueno, ahora me estás pidiendo que haga una distribución de Linux que utiliza la notación de sube y baja para los códigos de salida.^16
,16^
o^
? (Suponga que puede)Respuestas:
Python 2, 69 bytes
El módulo
ord(c)%16
extrae el valor de un carácter de dígito mientras obtiene 0 para el espacio. Para cada carácter, su contribución de torque se calcula como su peso multiplicado por la distancia firmada al pivotei-s.find('^')
, y estos se suman y comparan con 0, produciendo uno de-1,0,1
. Se^
calcula que el personaje tiene un peso 14, pero eso no importa porque está en el pivote.Un puerto Pyth de 18 bytes de Maltysen:
Para el código Python, si se requiere un programa completo, aquí hay 79 bytes. La idea es comenzar a
i
cambiar el índices.find('^')
, y hacer que la cuenta regresiva.fuente
Javascript ES6, 62 Bytes
-1
si se deja es más pesado0
si equilibrado1
si derecho es más pesadoSin golf:
Pruebas ejecutadas (asignando funciones anónimas a
f
):R B L
a-1 0 1
e.split``
a[...e]
(gracias @ Vɪʜᴀɴ)~~'^'
evalúa a0
...)fuente
f=
y decir que genera una función anónima. (-2 bytes FYI)Japt , 22 bytes
Japt es una versión abreviada de Ja vaScri pt . Interprete
Devuelve
-1
paraL
,0
paraB
y1
paraR
.Cómo funciona
fuente
APL,
3930 bytesDespués de releer las reglas, he cambiado esto a salida en
-1
0
1
lugar deL
B
R
guardar nueve bytes.Pruébalo aquí .
fuente
Pyth, 20 bytes
Banco de pruebas
-1
para sesgado a la izquierda,0
para equilibrado,1
para sesgado a la derecha.Cómo funciona:
fuente
Haskell,
116968276 bytesLa salida es
0
para balanceado,-1
para pesado a la izquierda y1
para pesado a la derecha.Ejemplo de uso:
f "321^ 12"
->-1
Cómo funciona: encuentra la parte anterior a
^
. Multiplique la cadena de entrada y la lista de pesos que comienza en- length-of-first-part
. El^
Tiene un peso de 0 y no añade a la suma. Estoy usando el truco mod 16 de @ xnor para convertir dígitos / espacios a valores enteros. Si la suma es negativa (positiva), la palanca es pesada a la izquierda (pesada a la derecha) y equilibrada si la suma es 0.fuente
TeaScript , 23 bytes
25Traté de escribir una respuesta de Pyth pero eso fue horriblemente: \
Que
²
se ve tan fuera de lugar, pero se ahorra 1 byte, así que voy a ser de mantenimiento de la misma.Pruébalo en línea!
Prueba todos los casos
Para el esquema de salida que he elegido:
-1
si Left es más pesado que Right (L
)0
si Left es tan pesado como Right (B
)1
is Left es menos pesado que Right (R
)Ungolfed && Explicación
Esto utiliza mapas y reduce para hacer el trabajo.
fuente
pb ,
349329 bytesEsto fue complicado. PB no fue diseñado para ser bueno en este tipo de cosas.
Ni siquiera tiene multiplicación .Pero bueno, funciona.La parte más difícil fue, después de obtener las sumas de (peso * distancia) para cada lado, determinar realmente qué letra imprimir. pb no tiene
>
u<
operadores, solo==
y!=
. No hay una manera fácil de saber qué valor es mayor. Ni siquiera puedo restar y comparar con 0 ... a menos que haga algo realmente tonto.Luego, simplemente vas a X = (lado izquierdo - lado derecho), ¡y ahí está tu respuesta! Elimine todo en esa línea para limpiar y luego imprima el valor que se encontró en (0, 0).
... Pero hay un camino un poco más corto. En lugar de usar 'L', 'B' y 'R', use esos valores: 'B' y agregue 'B' nuevamente al imprimir. De esa manera, nunca tendrá que colocar 'B' en X = 0, simplemente déjelo como el 0 que ya estaba. El único problema es que una vez que haces esto, el programa se vuelve muy tonto en el modo reloj.
'L'-'B'==76-66==10=='\n'
. Todo parece estar funcionando bien, hasta que de repente se imprime una gran cantidad de nuevas líneas y es imposible hacer un seguimiento de lo que está sucediendo: D Sin embargo, en el modo de ejecución regular de pbi, todo funciona bien porque las nuevas líneas se eliminan antes de que se imprima algo en el consola.fuente
Perl 5, 72 bytes
fuente
MATLAB 91, 57, 55octava, 50 bytesNo esperaba jugar más al golf, ¡pero cambiar a Octave hizo posible ahorrar 5 bytes adicionales! Wow, este tomó tiempo ...
Sale
-Inf, NaN, Inf
paraL, B, R
respectivamente.¡Banco de pruebas!
Explicación:
Este es definitivamente un código difícil de leer, pero intentaré explicarlo lo mejor que pueda. Cambiaré entre la explicación del bloque de código y el texto.
Echemos un vistazo a lo que sucede dentro de los corchetes:
Este es un poco complicado:
Los números a cada lado de la escalera deben multiplicarse por la distancia desde el cursor. Si usamos números negativos en el lado izquierdo y números positivos en el lado derecho, simplemente podemos sumar el vector para ver qué lado es el más pesado.
Supongamos que la cadena de entrada es:
'321^ 12'
. Queremos la siguiente:3*(-3)+2*(-2)+1*(-1)+1*3+2*4
. El vector que hicimos dentro de los corchetes comienza en1-i
, que en este caso es-3
, ya que el cursor está en la cuarta posición. Subennz(x)-i
en incrementos de uno. Podemos usar ennnz(x)
lugar denumel(s)
, porquex
es una cadena que no contiene ceros.Por lo tanto:
Ahora, podríamos hacer una multiplicación por elementos
s.*[...]
y tomar la suma de esto. Pero, dado que tenemos dos vectores, también podemos mutilars
por la transposición de[...]
y calcular la suma usando la multiplicación de matrices:Esto nos da un número negativo, lo que significa que el lado izquierdo es más pesado, un cero, lo que significa que está equilibrado, o un número positivo, lo que significa que el lado derecho es más pesado. En lugar de utilizar el enfoque ingenuo de
sign(...)
, lo multiplicamos porinf
, lo que nos dará-Inf
oInf
para izquierda y derecha respectivamente. ObtenemosNaN
para0*inf
, ya que es indefinido.Esto nos da tres valores distintos para los tres resultados posibles.
fuente
𝔼𝕊𝕄𝕚𝕟, 22 caracteres / 38 bytes
Try it here (Firefox only).
fuente
JavaScript, 146 bytes
Bastante masivo
Demostración .
fuente
function t(s){
podría convertirset=>{
ysplit('^')
podría convertirsesplit`^`
Ruby,
111108bytesExplicación
Resume el valor ponderado de cada número en cada lado. Luego usa el operador de nave espacial ruby para proporcionar un 1,0, -1 de igualdad / desigualdad de los dos lados, que es el índice de una matriz con la salida correcta.
fuente
PowerShell,
8373 bytesGracias a TessellatingHeckler por el golf.
Utiliza esencialmente el mismo algoritmo que el siguiente código anterior, pero aquí iteramos a través de los caracteres en la cadena de entrada uno a la vez en lugar de iterar a través del índice, lo que ahorra un puñado de bytes. Todavía arroja el mismo mensaje de error espectacular cuando llega el algoritmo
^
, no afecta a STDOUT.Anterior
Utiliza el mismo algoritmo impresionante que la excelente respuesta de Dendrobium , y por lo tanto usa la misma salida de
-1 / 0 / 1
si la entrada esleft-heavy / balanced / right-heavy
.Ugh Mucho tiempo debido a una característica
peculiar decasting que tiene PowerShell. Lo más pertinente aquí es cómochar
multiplicado porint
funciones. Tomar un índice de matriz de unstring
resultado en unchar
objeto. PowerShell convierte elchar
a su valor ASCII correspondiente (en lugar del valor literal) antes de la multiplicación. Entonces, algo así como$a='012'[0];[int]$a*2
resultados96
.Eso significa que tenemos que volver a lanzarlo como una cadena. Sin embargo, simplemente hacer
string
tiemposint
nos da unastring
repetición que muchas veces. Por ejemplo,$a='0';$a*2
resultaría en00
.Esto significa que necesitamos lanzar la parte de
char
atrás como astring
antes de volver a emitir comoint
, luego puede ocurrir la multiplicación, antes de agregarla a nuestro acumulador$x
.Combine eso con la forma larga de iterar a través de una cadena, y la llamada .NET para generar el signo, y obtenemos un fragmento de código bastante largo.
Nota: esto arrojará un error espectacular cuando llegue
^
a la cadena, indicando que no puede convertirlo en unint
. No afecta a STDOUT.fuente
param($b)$i=-$b.indexOf('^');[char[]]$b|%{$x+=$i++*+"$_"};[math]::Sign($x)
a 74 bytes. Esto llevó mucho tiempo y varios intentos de acercamiento. math :: sign parece mucho tiempo, pero no veo ninguna manera de mejorar ese bit.$i++*+"$_"
es equivalente a$i++*"$_"
if$i
es un int.CJam, 29 bytes
Pruébalo en línea
El resultado es
-1
para pesado a la izquierda,0
para equilibrado,1
para pesado a la derecha.Esto pareció un poco largo, pero probé un montón de alternativas, y todas terminaron entre 29 y 33 bytes. Un problema es que no pude encontrar una manera de convertir la cadena a valores que automáticamente darían como resultado 0 para los espacios. Así que terminé reemplazando explícitamente los espacios con '0 caracteres, lo que obviamente aumenta la longitud del código.
Alternativas probadas:
ee
operador para agregar el índice a la lista de valores.Explicación:
fuente
Python 3,
196114bytesCódigo regular:
Explicación:
stdin
.¡Muchas gracias a @ThomasKwa por recortar 82 bytes (más del 40%) de descuento!
fuente
print('LBR'[(B>D)-(B<D)])
para el final yB=D=0
al principio.^
. Eso también te salva a tiabs()
.C,
140139138134100 bytesRegreso:
Correr:
Como tenemos ASCII:
Obtenemos:
Luego suma por factor distancia a
^
.fuente
SpecBAS - 140 bytes
t
es un total acumulado, los valores son negativos cuando la posición del personaje es mayor que la posición en quilates. Al final ve si el total es negativo, cero o positivo e imprime el carácter correspondiente de R, B o L.Podría reducir algunos bytes simplemente generando -1, 0 o 1 como algunas de las otras respuestas.
fuente
Java, 83 bytes
fuente