Ley de equilibrio
Un sube y baja (supuestamente del francés 'ci-ça', que significa 'esto-eso') forma un tercio de la santísima trinidad del equipo de juegos, junto con el tobogán y el columpio igualmente ubicuos. Un sube y baja está en perfecto equilibrio si, y solo si, la suma de los momentos en cada lado es equivalente. Por lo tanto, un balancín puede equilibrarse agregando una cantidad específica de peso al lado con la suma del momento más bajo; lograr este es su objetivo para este desafío.
Desafío
Su desafío es tomar una representación de un balancín como entrada y salida nuevamente, con peso agregado a un extremo del balancín para equilibrarlo.
Entrada
Su programa debe tomar, en cualquier formato razonable, un subibaja ASCII como el siguiente:
100 100
-------------------
^
La primera línea contiene dos números, cada uno representando pesos en el balancín. Exactamente un peso está presente en cada lado, cada uno actuando en el extremo de su lado de la tabla. Se garantiza que los pesos serán enteros y siempre se alinearán con su extremo correspondiente de la tabla. Estos números nunca se superpondrán con el fulcro ( ^
).
La segunda línea representa el 'tablón' de la sierra. Cada guión ( -
) representa una longitud igual entre sí, con la única excepción del guión directamente sobre el punto de apoyo ( ^
), que no tiene longitud.
La tercera línea representa el punto de apoyo de la sierra. Este punto de apoyo está marcado por el único carácter que no es un espacio en esta línea, un circunflejo ('^'). El punto de apoyo se puede colocar en cualquier lugar a lo largo de la tabla en una entrada válida siempre que quede suficiente espacio para que los números que representan los pesos no se superpongan en la entrada o la salida.
Se garantiza que la entrada tendrá tres líneas y no tendrá espacios en blanco antes o después de los caracteres que constituyen la sierra (excepto, por supuesto, la tercera línea, que lo requiere).
Salida
Para la salida, la misma representación de balancín debe imprimirse en stdout, pero con uno (y solo uno) de los pesos reemplazados por un peso mayor, para equilibrar el balancín. Las entradas están garantizadas para hacer esto posible usando enteros solos. Por lo tanto, los pesos deben mostrarse sin puntos decimales o cualquier otra nota similar. Si su idioma no usa stdout, debe ir por consenso comunitario / meta en la salida. Las nuevas líneas finales están bien, pero cualquier otro cambio en el formato de representación probablemente no sea correcto.
Ejemplificación
Entradas de prueba y salidas correspondientes
Entrada 1
12 22
--------------------
^
Salida 1
12 26
--------------------
^
Entrada 2
42 42
-----------
^
Salida 2
42 42
-----------
^
Entrada 3
3 16
----------------
^
Salida 3
14 16
----------------
^
Entrada 4
1 56
-------------------
^
Salida 4
196 56
-------------------
^
Implementación de referencia - Python 3
# Takes a list of strings as input
def balance_seesaw(lines):
weights = [int(w.strip()) for w in lines[0].split()]
length = len(lines[1])
pivot = lines[2].find("^")
left_length = pivot
right_length = length - 1 - pivot
left_torque = weights[0] * left_length
right_torque = weights[1] * right_length
if left_torque > right_torque:
weights[1] = left_torque // right_length
elif right_torque > left_torque:
weights[0] = right_torque // left_length
weights = [str(w) for w in weights]
string_gap = " " * (length - sum(len(w) for w in weights))
lines[0] = weights[0] + string_gap + weights[1]
print("\n".join(lines))
balance_seesaw(["1 56",
"-------------------",
" ^ "])
Reglas
Este es el código de golf , por lo que el código más corto gana contado en bytes. Verifique meta si contar bytes es incómodo en su idioma.
Se aplican reglas estándar / lagunas.
La entrada debe tomarse en un formato razonable. A continuación se ofrece una lista no exhaustiva de formatos apropiados:
- Una sola cadena con líneas separadas por caracteres de nueva línea
- Una lista de cadenas, cada cadena representa una línea
- Una matriz 2D o matriz de personajes
Desafíos relacionados
- Equilibre un conjunto de pesas en un subibaja - Propuesta de agosto de 2015 por samgak
Respuestas:
05AB1E ,
60 605150494745 bytesAhorré 10 bytes gracias a Emigna y 1 byte gracias a Adnan.
Todas las líneas de entrada deben tener la misma cantidad de caracteres.
Pruébalo en línea!
Debería haber una regla general, como "si su código 05AB1E tiene más de 40 bytes, probablemente lo esté haciendo mal". Parece tan golfable, cualquier idea es bienvenida!
fuente
¬s¤s\‚
puede serõK
.kD²g->(‚
puede ser¡€g
si agrega los espacios faltantes en la fila inferior del caso de prueba31SÍ
con1®‚
:)/ ï
con÷
.?JavaScript (ES6), 136
Probablemente no funcione en Chrome, ya que utiliza asignación desestructurada y parámetros predeterminados.Tenga en cuenta que el método de salida JS estándar
alert
es particularmente inadecuado para la tarea, debido a la fuente proporcional utilizada.Menos golf
Prueba
fuente
Perl, 149 + 2 = 151 caracteres
Requiere opciones de línea de comando
-p0
(esto me da una penalización de 2 bytes además de los 149 bytes en el programa mismo).Explicación:
-p0
interruptor lee toda la entrada hasta el primer byte NUL o EOF. Este problema no permite NUL, por lo que obtendremos toda la entrada en la variable$_
que se usa para expresiones regulares, etc., de forma predeterminada..+?
. Ej. ), Pero no puedo obtenerlo por debajo de 3 caracteres, así que también podría usar lo obvio\d+
. El segundo número está al final de la línea, por lo que se puede analizar como.+
(2 caracteres). La línea central se usa para determinar qué tan anchas son las escalas; se analiza como-+
(muchas otras representaciones funcionarían). Los espacios antes del cursor en la última línea son+
. Una vez que aparece el símbolo de intercalación (o de hecho cualquier no espacio), ignoramos el resto de la entrada.$1
,$2
,$3
,$4
. Dar una expresión regular como argumento paramap
usar adicionalmente una matriz de esos grupos como la matriz para mapear. Por lo tanto, tomamos sus longitudes; Esta es una manera conveniente de almacenar las longitudes$3
y$4
sin tener que escribirlength
dos veces. También sobrescribimos$_
con la longitud de$1
; Realmente no nos importa el valor de esto (el número de dígitos en la entrada izquierda es inútil), pero el hecho de que es corto ($_
la longitud es ahora el número de dígitos en el número de dígitos en el primer peso, que es necesariamente muy pequeño en comparación con el ancho de la balanza).$r
en que se dividen las escalas.$1*$r>$2
comprueba para ver qué lado es más pesado. Almacenamos los nuevos pesos en$x
y$y
; estos tienen cálculos muy simples una vez que se conoce la relación de pesos.$x
,$,
y$y
en$_
para producir la fila superior, luego seguimos agregando espacios ($"
contiene un solo espacio por defecto, y es más corto de lo que' '
sería un espacio literal )$,
hasta que tenga la misma longitud que la fila central (es decir, tiene longitud$c
). (Elegí la variable$,
porque es una variable incorporada que se puede cambiar de forma segura en este contexto y comienza vacía por defecto). Comolength
funciona$_
de forma predeterminada, no es necesario que le demos un argumento explícito. Usé un condicional Yoda porque necesita una sintaxis considerablemente menos ambigua para analizar correctamente.$\
) para contener el resto del conjunto de escalas (que es lo mismo que en la entrada, de modo que simplemente puedo usar$3
y$4
directamente para producir la mayor parte). Tenga en cuenta que esto significa que no hay espacios en blanco al final de la tercera línea; agregarlo haría que el programa sea un poco más largo y no parece tener ningún propósito, así que lo dejé fuera.-p
interruptor se dispara nuevamente; esta vez, sale$_
seguido de una "nueva línea" ($\
). Debido a que redefiní la nueva línea de salida, estas dos impresiones implícitas generan el nuevo conjunto de escalas entre ellas (aunque como efecto secundario, no hay nueva línea en la salida).-p
conmutador ahora intenta leer la entrada nuevamente, pero ya sorbimos todo el archivo, por lo que lee EOF y finaliza el programa.fuente
PHP,
212209205 bytesprobablemente golfable
Toma información del argumento de la línea de comando; escapar de las nuevas líneas. Corre con
-r
.Reemplazar con un marcador de posición no funcionó como se esperaba; así que tuve que agregar más parens a la primera expresión regular.
fuente
Befunge
223217 bytesPruébalo en línea!
fuente
>
creo que solo se dejó por razones estéticas. Dicho esto, parece que tengo una solución de 215 bytes en mis notas, por lo que puede ser posible (también puede tener errores que explicarían por qué nunca lo envié; no tengo tiempo para probarlo ahora).Python 2,
184183 bytesDefinitivamente golfable
Muy claro. Simplemente tome los pesos ajustados para ajustar ambos lados, vea cuál es más grande que el original, cambie ese y salga.
EDITAR Multiplicación y división cambiadas porque la división entera es evile (gracias a @JonathanAllan por notar esto)
EDITAR -1 byte cambiado
i().index('^')
ai().find('^')
(gracias a @JonathanAllan [¡otra vez!])fuente
a=[w[1]*R/I,w[0]*I/R]
(un ejemplo simple que no funcionaría sería un1
y2
conI
yR
ambos3
). Actualmente 194 no 184 por el camino desde los saltos de línea cuentan como un byte cada uno, peroj
yk
están costando más bytes de lo que ahorran.I=i().find('^')
, y la forma abreviada__repr__
, de retroceso para hacer la última líneaprint`w[0]`+' '*(W-len(`w`)+4)+`w[1]`+'\n'+'-'*W+'\n'+' '*I+'^'
y bajar a 182 - repl.it/EW8fC ++ 14, 482 bytes
versión más legible:
fuente
Python 3,
235230 bytes (referencia minimizada)Simplemente minimicé la referencia, ya que soy muy nuevo en el golf de código.
Lo usa exactamente igual que en el ejemplo, pero la función es en
s
lugar debalance_seesaw
.fuente
w[o>p]=[o//k,p//t][o>p]
. Además, la mayoría de las líneas podrían unirse para eliminar algunos espacios en blanco adicionales.