Visión general
Dada una cadena de 3 líneas, averigua si la estructura cae a la izquierda, se equilibra o cae a la derecha.
Estructura de entrada
Puedes imaginar la estructura como una barra de metal con cosas en la parte superior, todo equilibrado en la parte superior de una barra vertical.
1 7 4 a
===============
|
La primera línea son los artículos. El peso de cada elemento se calcula como el valor ascii del personaje menos 32. (Los caracteres menores de 32 no se consideran y los espacios pesan 0). Tenga en cuenta que la fuerza de un artículo sobre la barra es su peso multiplicado por la distancia al punto de pivote.
La segunda línea es la barra. Cada longitud de barra pesa 1 unidad por sí misma. Esta línea es exclusivamente igual a signos ( =
).
La tercera línea es el punto de pivote. Esto se puede colocar en cualquier lugar, y está representado por una cantidad de espacios seguidos de un solo carácter de barra vertical ( |
).
Ejemplos
Entrada:
===== El |
Salida: Balance
Entrada:
===== El |
Salida: cae a la izquierda
Entrada:
% ===== El |
Salida: Balance (porque %
pesa lo suficiente como para contrarrestar el peso del lado izquierdo de la barra)
Entrada:
Automóvil club británico ======= El |
Salida: cae a la derecha (porque la a
derecha está más lejos del punto de pivote)
Entrada:
1 7 4 A
===============
|
Salida: cae a la izquierda
Entrada:
1 7 4 a
===============
|
Salida: cae a la derecha (las letras minúsculas son pesadas)
Entrada:
$ ~
===============
|
Salida: Balance
Notas
- El espacio en blanco final está permitido, el espacio en blanco inicial no.
- Su programa puede emitir en el formato que desee, siempre que haya 3 salidas distintas para izquierda, balance y derecha.
- Su programa debe aceptar el formato que se muestra como entrada.
Respuestas:
JavaScript (ES6),
116111108106 bytes-5 bytes sumando via en
eval(array.join`+`)
lugar dearray.reduce()
.-3 bytes por defecto en
1
lugar de32 - 31
, permitiendo que se eliminen los paréntesis.-2 bytes ya que el punto de pivote es la longitud de la última línea - 1
Salidas
-1
,0
o1
, para izquierda, balanceada o derecha, respectivamente. Terminó de manera similar a la respuesta de Python de Chas Brown , por lo que el crédito va allí.Puede guardar 4 bytes si la primera línea se rellena para que coincida con la longitud de la barra usando
(31-t.charCodeAt(i))*(b.length+~i)
.Fragmento de prueba
Incluye salida adicional (
Left
/Balanced
/Right
) junto con el número.Otro método de 106 bytes
En lugar de crear una
join
matriz en+
s, creamos una cadena de números, cada uno con el prefijo+
. El líder+
se ignora.fuente
(b.length+~i)
podría ayudar a salvar un byte. (Además, no entiendo por qué tienes el||1
.)b.length+~i
devuelve el negativo dei-b.length+1
; eso podría ayudar si pudiera negar la otra parte. En cuanto a||1
eso, fue porque estaba asumiendo que la primera línea no estaba acolchada para que coincidiera con la longitud de la barra, port.charCodeAt(i)
lo que volveríaNaN
más allá del final de la primera línea.Python 2 ,
112110 bytesPruébalo en línea!
EDITAR: Finalmente logró eliminar el
enumerate
yrjust
por unos miserables 2 bytes ... ¡meh!Toma una cuerda; salidas -1,0, o 1 para caídas a la izquierda, saldos, caídas a la derecha, respectivamente.
El primer paso a 112 bytes fue:
fuente
(ord(c)-31)
Me tomó un tiempo darme cuenta de que esto realmente está incorporando el peso de la barra junto con los artículos. ¡Muy inteligente!return
conprint
de -1 bytes (aunque en realidad no jugar bien con el código TIO actual).Haskell,
212171 bytes (188 si toma la entrada como una cadena)Variante de 171 bytes
Variante 188 bytes
Explicación
fuente
fromEnum
lugar deord
y soltar elimport
.c
puede simplificarse ac p=max(ord p-32)0
(o confromEnum
) y, como lo está utilizando solo una vez, inlineelo.c
incluso se puede simplificar (no se consideran los caracteres menores de 32)c p=ord p-32
. Tambiénp
es básicamentelength
(menos 1), porp x=length x-1
lo que también funcionaría (y también puede incluirlo en línea). También eche un vistazo a mi solución, cómo usosignum
: podría hacer lor o l s = signum $ 2 * z ...
que devuelve0,1,-1
B, L, R.[3,4,7]
y toma 3 cadenas en lugar de una. (verlines
)Jalea , 30 bytes
Banco de pruebas
Salidas 0 para balanceado, 1 para derecha y -1 para izquierda.
Cómo funciona
fuente
Jalea , 24 bytes
Pruébalo en línea!
-1
para caer a la izquierda,0
para equilibrar,1
para caer a la derecha (programa completo).[-1]
para caer a la izquierda,[0]
para equilibrar,[1]
para caer a la derecha (función).La primera línea debe tener espacios finales, la última línea no debe.
Explicación (comenzamos con el resultado final):
En primer lugar, estamos trabajando con líneas individuales, por lo que debemos obtenerlas de alguna manera. Ese es un trabajo para
Ỵ
. Luego, debemos tratar la\n
versión -split de la entrada como si fuera la entrada original, así que usamosµ
para hacer una cadena monádica aplicada al valor actual.Ahora comenzamos un trabajo real, y nuestro primer trabajo sería calcular los factores de los pesos. Esencialmente, este es un rango [distancia desde el extremo izquierdo al pivote ... 0..distancia desde el pivote hasta el extremo derecho]. En primer lugar, tenemos que encontrar el índice basado en 1 del pivote, que es esencialmente la longitud de la última línea sin espacios finales. Entonces, sacamos la última línea (línea dinámica) de nuestra lista original
Ṫ
, ya que no la necesitaremos más, y luego tomamos su longitud conL
. Luego necesitamos tomar la longitud de la barra, para lo cual hacemos lo mismo con la última línea (línea de barra)ṪL$
. Finalmente, para obtener el rango, mapeamos | x - y | a [1..longitud del cable], donde x es el índice de pivote e yes cada elemento de la lista que asignamos. Hacemos esto usandoạЀ
, dondeạ
calcula | x - y | yЀ
hace un rango de 1 hasta e incluyendo la longitud de la barra. Ahora tendremos el rango que queremos.Después de eso, tenemos que multiplicar cada número entero, representando una pieza de la barra, con su peso correspondiente. Para calcular los pesos, usamos
Ç
, yendo a la línea superior de nuestro código. Tomamos la línea restante conṪ
sus códigos de char conO
, y luego calculamos x - 31 usando_31
, siendo x cada código de char. Luego asignamos espacio al peso 1 (0 + pieza de barra = 1),!
al peso 2 (1 + 1), etc. Hemos terminado con la línea superior, por lo que ahoraÇ
devolveríamos la lista de pesos, que multiplicamos con el correspondiente enteros que representan las piezas de la barra con×
.Después de eso, nos dividimos
ṣ0
en el punto de pivote, representado por un 0 (ya que cualquier peso no afectará el resultado), lo que da como resultado una lista de la forma [[1er peso, 2do peso ... peso justo antes del pivote] , [peso justo después del pivote, peso después del anterior ... último peso]]. Esas listas representan los lados de la barra, izquierda y derecha. Ahora sumamos cada una de las listas usandoS€
para obtener los pesos totales en cada lado, y usamosI
para tomar el delta, que será negativo si el lado izquierdo es más pesado, cero si tienen el mismo peso y positivo si el lado derecho es más pesado . Por lo tanto, para devolver el resultado final utilizando esto adecuadamente para nuestro beneficio, tomamos la señal conṠ
.fuente
APL (Dyalog) , 43 bytes *
Pruébalo en línea!
⊆⊢
dividir el argumento en series de caracteres que son⎕TC[2]∘≠
diferente de la 2 nd T ERMINAL C ontrol carácter (avance de línea) **{
...}
aplique la siguiente función anónima en la lista de cadenas:⊃⌽⍵
en la primera cadena de la lista invertida (es decir, la última)'|'⍳⍨
encontrar el índice of del punto de pivote(
…)-
Reste eso de la siguiente lista:⊃⍵
la primera cuerda≢
su longitud⍳
todos los ɩ nices de eso(
...)+.×
Suma ponderada con esos pesos y los siguientes valores:⊃⍵
la primera cuerda⎕UCS
puntos de código en la U NIVERSAL C r incón dele S et¯31+
agregue treinta y uno negativo (32 para el desplazamiento requerido menos uno para la barra)×
signo de eso* Para 1 byte por char, use
{×(¯31+⎕UCS↑⍵)+.×(⍳≢↑⍵)-'|'⍳⍨↑⌽⍵}⎕TC[3]∘≠⊂⊢
con⎕ML←3
. Pruébalo en línea!**
⎕TC
está en desuso y se usa aquí solo para fines de golf. En el código de producción, uno debe usar⎕UCS 10
.fuente
Haskell (Lambdabot), 142 bytes
Pruébalo en línea!
Versión sin golf:
fuente
Python 2 , 90 bytes
Espera que las líneas de entrada se rellenen (con espacios) a la longitud correcta. Salidas
-1
para caídas a la izquierda ,0
para equilibradas y1
para caídas a la derecha .Pruébalo en línea!
94 bytes
Para +4 bytes podemos tener una versión que, usando un
while
bucle, requiere líneas despojadas en lugar de líneas rellenas :Pruébalo en línea!
fuente
Rubí, 543 bytes
fuente
C (gcc) , 106
107121123124129 129131bytesRegrese 0 para caer a la izquierda, 1 para mantener el equilibrio y 2 para caer a la derecha.
Exija que las tres líneas tengan la misma longitud y termine
\n
para determinar la longitud de la cuerda.Pruébalo en línea!
fuente
Mathematica, 91
92bytesLa primera línea debe tener la misma longitud con la varilla. La tercera línea no debe contener espacios finales.
Regrese -1, 0, 1 por caer a la izquierda, equilibrar y caer a la derecha.
fuente
C # (.NET Core) ,
1279590 + 18 = 108 bytesPara esta función, la primera línea debe estar rellenada a la derecha con espacios que tengan la misma longitud que la barra y la tercera línea no debe tener espacios de prueba. Estas condiciones están permitidas (ver comentarios de la pregunta).
Pruébalo en línea!
Salidas:
-1 para punta izquierda
0 para balance
1 para punta derecha
fuente
Python 3, 217 bytes
También funciona en Python 2.7
Devuelve 1 para el lado izquierdo, -1 para el lado derecho o cero si está equilibrado.
Versión legible:
fuente
sum([...])
, simplemente puede tenersum(...)
i[c:].find(e)
puede seri.find(e,c)
, usari,m,n=s.split('\n')
y evitar la necesidads
, usarreturn 2*(r>l) or l>r
para reducir drásticamente el costo de la prueba al final (el valor de retorno es numéricamente equivalente, pero es enTrue
lugar de1
y enFalse
lugar de0
), o realmente, usar un conjunto diferente de retorno valores y hacerreturn (l>r)-(r>l)
para devolver el 1, 0 o -1 como locmp
hizo la función anterior.i[c:]
porque la forma más corta causó un problema extraño de uno por uno para alguna entrada de mayúsculas y minúsculas (intente colocar|
exactamente en el medio, encima de la barra).PHP, 105 bytes
impresiones
-1
/0
/1
a la izquierda / equilibrio / derecha. Ejecutar como tubería-nR
o probarlo en línea .Descompostura
fuente
Carbón , 31 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Salidas 0 para balance o -1 o 1 para caer hacia la izquierda o hacia la derecha. Editar: Los cambios en el carbón ahora significan que
≔ΣEθ×⁻κ⌕ζ|⁻℅ι³¹ξI⁻›ξ⁰‹ξ⁰
funciona para 24 bytes: ¡ Pruébelo en línea! El enlace es a la versión detallada del código. Nota: Ambas respuestas requieren una entrada rellenada, pero se pueden adaptar para aceptar entradas sin relleno a un costo de 3 bytes: ¡≔⁰ξFLη≔⁺ξ×⁻ι⌕ζ|⁻℅§◨θLηι³¹ξI⁻›ξ⁰‹ξ⁰
Pruébelo en línea!≔ΣE◨θLη×⁻κ⌕ζ|⁻℅ι³¹ξI⁻›ξ⁰‹ξ⁰
Pruébalo en línea!Los enlaces son a la versión detallada del código.fuente