Este desafío fue publicado en el subreddit DailyProgrammer, y pensé que sería un gran candidato para un desafío de golf de código. Determinar si una carta se equilibra se basa en su distancia desde el punto de equilibrio y el valor de la letra. El valor de una letra se puede determinar tomando su posición indexada en el alfabeto o restando 64 de su valor ASCII. Además, el valor de una letra se multiplica por su distancia desde el punto de equilibrio. Veamos un ejemplo STEAD
:
STEAD -> 19, 20, 5, 1, 4 ASCII values
This balances at T, and I'll show you why!
S T EAD -> 1*19 = 1*5 + 2*1 + 3*4
Each set of letters on either side sums to the same value, so
T is the anchor.
Sin embargo, debe tenerse en cuenta que no todas las palabras se equilibran. Por ejemplo, la palabra WRONG
no se equilibra en ninguna configuración. Además, las palabras deben equilibrarse en una letra, no entre dos letras. Por ejemplo, SAAS
se equilibraría si hubiera una letra en el medio de las dos A
s, pero como no hay ninguna, no se equilibra.
La tarea
Debe crear un programa o función que tome una palabra en mayúscula como argumentos de entrada o función , y luego produzca una de dos salidas:
Si la palabra se equilibra, la palabra debe imprimirse con el lado izquierdo, un espacio, la letra de anclaje, otro espacio y el lado derecho.
function (STEAD) -> S T EAD
Si la palabra no se equilibra, debe imprimirla, seguida de
DOES NOT BALANCE
function (WRONG) -> WRONG DOES NOT BALANCE
Puede suponer que todas las entradas serán mayúsculas y solo habrá caracteres alfabéticos.
Ejemplo de E / S
function (CONSUBSTANTIATION) -> CONSUBST A NTIATION
function (WRONGHEADED) -> WRO N GHEADED
function (UNINTELLIGIBILITY) -> UNINTELL I GIBILITY
function (SUPERGLUE) -> SUPERGLUE DOES NOT BALANCE
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
function (A)
-> enA
lugar de -> `A`?BALANCE DOES NOT BALANCE
Respuestas:
Pyth, 49 bytes
Demostración.
Explicación:
fuente
Pure bash (sin coreutils u otras utilidades), 125
Cálculo estándar del centro de masa usando momentos sobre el origen:
Prueba de salida:
fuente
Pitón 3, 124
Este código no prueba posibles puntos de apoyo, sino que encuentra el "centro de masa" y comprueba si es un número entero. Lo hace sumando la masa total
a
y la masa ponderada por posiciónb
, para encontrar el centro de masam=b/a
. Luego imprime la cadena dividida en la posiciónm
o la cadena más"DOES NOT BALANCE"
, elegida por el[_::2]
truco de corte de lista.fuente
CJam, 57 bytes
Esto todavía se puede jugar un poco al golf.
Pruébalo en línea aquí
fuente
'@fm
es más corto que64f-:i
.JavaScript (ES6),
211200160 bytesIntento anterior, 200 bytes
Gracias a edc56 y nderscore por ayudarme a jugar golf
Manifestación
Firefox y Edge solo por ahora, ya que es ES6
fuente
j=0
dentro de la llamada acharCodeAt
:)C,
236198192188180173 bytesAmpliado con main ():
Verificación:
fuente
i,l=1,j;g(char*v){for(;v[i]&&l;++i)for(j=l=0;v[j];++j)l+=(i-j)*(v[j]-64);l?printf("%s DOES NOT BALANCE",v):printf("%.*s %c %s",--i,v,v[i],v+i+1);}
Nota: utiliza un comportamiento indefinido :)CJam, 50 bytes
Usando el intérprete de Java, esto sale con un error a STDERR para palabras sin equilibrio.
Si prueba el código en el intérprete de CJam , simplemente ignore todo menos la última línea de salida.
Idea
Mi "idea original" resultó ser el mismo enfoque que @xnor publicó varias horas antes que yo. Sin embargo, aquí va:
Dada una lista de valores (v 0 , ... v n ) , tenemos que v_t es el ancla de la lista si y solo si se cumple alguna de las siguientes condiciones equivalentes:
tv 0 +… + 1v t-1 == 1v t + 1 +… tv n
(0 - t) v 0 +… + (n - t) v n == 0
0v 0 +… + nv n == t (v 0 +… + v n )
t: = (0v 0 +… + nv n ) / (v 0 +… + v n ) es un número entero.
Código
En esta parte, comenzamos a divertirnos un poco con los operadores sobrecargados.
Para el cociente, esto sucede:
Para la cadena, esto sucede:
En este punto, se produce un error de tiempo de ejecución, ya
""
que no tiene un último carácter. La pila se imprime y la ejecución se interrumpe inmediatamente.fuente
Julia, 122 bytes
Esto crea una función sin nombre que acepta una cadena como entrada y devuelve una cadena. Para llamarlo, dale un nombre, por ejemplo
f=s->...
.Tratamos la palabra como un sistema unidimensional para el cual necesitamos encontrar el centro de masa. El centro de masa se calcula como el producto escalar de las masas con sus ubicaciones, dividido por la masa total del sistema. Si el centro calculado es un número entero, corresponde a una de las letras de la palabra. De lo contrario, la palabra no se equilibra.
Ungolfed + explicación:
Ejemplos:
fuente
PHP,
249174 bytesToma un argumento de línea de comandos.
Intento inicial:
fuente
Haskell,
161135 bytesEjemplo de uso:
Cómo funciona:
f
llama a la función auxiliar!
que toma dos parámetros, la parte izquierda y derecha de la palabra en una posición determinada. Se detiene si ambas partes tienen el mismo peso (funciónv
) o se llama recursivamente con la primera letra de la parte derecha movida a la izquierda. Termina con elDOES NOT BALANCE
mensaje si la parte derecha está vacía.fuente
C,
183134 bytesNueva versión explicada:
Al igual que las otras dos entradas, hace uso de la suma constante en un lado y la resta en el otro para llegar a cero, lo cual es la indicación del equilibrio. Mi salida original se reutiliza desde la primera respuesta, aunque ligeramente modificada.
Versión anterior explicada:
El primer bucle (h) es el iterador principal para la longitud de la cadena. El segundo bucle (i) se acumula (b) hasta que h == i. Una vez que eso sucede, (b) se almacena en (a), se restablece a 0 y luego continúa hasta llegar al final de la cadena donde (a) se compara con (b). Si hay una coincidencia, el bucle del iterador principal se rompe y se imprime la salida.
fuente
Ruby 175
Pruébelo en línea: http://ideone.com/G403Fv
Esta es una implementación de Ruby bastante sencilla. Aquí está el programa legible:
fuente
R, 190 bytes
Como una función sin nombre. Creo que puedo conseguir algunos más, pero eso tendrá que esperar.
Ungolfed un poco con una breve explicación
No pone una nueva línea al final.
Prueba de funcionamiento
fuente
C, 142 bytes
Crédito para algún usuario para pegarme a él :)
fuente
Java, 240 bytes
fuente