Usando cualquier lenguaje de programación que admita funciones, tenga la función
is_enough(strArr)
esa toma, strArr
que será una matriz que consta de los siguientes elementos:
N
que será el número de estaciones de servicio en una ruta circular- y cada elemento posterior será la cadena
g:c
dondeg
es la cantidad de gas en galones en esa estación de servicio yc
será la cantidad de galones de gasolina necesarios para llegar a la siguiente estación de servicio.
Por ejemplo strArr
puede ser:
["4","3:1","2:2","1:2","0:1"].
Su objetivo es devolver el índice de la estación de servicio de partida que le permitirá recorrer la ruta completa una vez; de lo contrario, devolverá la cadena "imposible" .
Para el ejemplo anterior hay 4 estaciones de servicio, y su programa debería devolver la cadena "1" porque:
Comenzando en la estación 1 , recibe 3 galones de gasolina y gasta 1 para llegar a la siguiente estación.
Luego tiene 2 galones + 2 más en la próxima estación y gasta 2 para tener 2 galones cuando llegue a la tercera estación.
Entonces tienes 3 pero pasas 2 para llegar a la estación final,
En la estación final recibe 0 galones y gasta su galón final para llegar a su punto de partida.
Comenzar en cualquier otra estación de servicio haría imposible moverse por la ruta, por lo que la respuesta es "1" .
Si hay varias estaciones de servicio en las que es posible comenzar, devuelva el índice más pequeño (de la estación de servicio). N
será >= 2
.
Resultados de muestra correctos:
Input: ["4","1:1","2:2","1:2","0:1"]
Output: "impossible"
Input: ["4","0:1","2:2","1:2","3:1"]
Output: "4"
El ganador será el que use el código más corto, aunque será largo.
N+1
elementos precisos enstrArr
? Esto seríaN
redundante en caso de que el lenguaje ya proporcione una forma de obtener la longitud de la matriz, ¿verdad? (aún sería útil para, por ejemplo, C).is_enough
(9 caracteres); tres están usando un nombre de un solo carácter, y uno no nombra la función en absoluto. ¿Podría por favor aclarar lo que está permitido?Respuestas:
APL (70)
Explicación:
1↓⍵
: suelte el primer elemento (longitud), no lo necesitamos{
...}¨
: para cada una de las estaciones de servicio ...⎕ML←3
: establecido⎕ML
en 3 dentro de la función interna (cambia el comportamiento de⊂
)⍵⊂⍨⍵≠':'
: dividir la cadena en:
⍎¨
: evaluar cada parte-/
: resta el segundo número del primero (dando un efecto neto para cada estación de servicio)K←
: almacenarlos en KZ←⍳⍴K
: obtener los índices de la estación de servicio (1
a la longitud deK
), almacenar enZ
⌽∘K¨Z
: rotarK
por cada valor deZ
, dando una matriz de matrices¯1⌽
: gire esta matriz a la izquierda por 1 (para poner la que no ha cambiado primero en lugar de la última)+\¨
: hacer una suma acumulada para cada matriz interna0∧.≤¨
: para cada suma acumulada, vea si hay valores negativosZ/⍨
: seleccione deZ
aquellos elementos para los que la suma acumulada no tenía valores negativos×⍴G←
: almacenar enG
. SiG
tiene algún elemento::⊃G
: devuelve el primer elemento deG
.⋄'impossible'
: de lo contrario, volverimpossible
.fuente
Bash
178170161157Más bien sencillo.
Espaciado:
fuente
Ruby, 111
Aquí hay una solución Ruby usando
eval
:Ejemplo de uso:
EDITAR : Nombre de función corregido y tipo de retorno.
fuente
Rubí 132
Prueba:
fuente
Python, 131
Encuentro esta frase bastante satisfactoria.
fuente
reduce()
aqui Recibo un errorNameError: name 'reduce' is not defined
reduce
todavía está en la lib estándar, pero se movió alfunctools
módulo.from functools import reduce
gracias`i`
aquí son equivalentes a losstr(i)
de Python 3.GolfScript (72 caracteres)
Demostración en línea
Esto realiza el enfoque de fuerza bruta obvio. El bit más interesante de la OMI es la determinación de si las sumas parciales de una matriz de combustible delta alguna vez cae por debajo de 0:
Esto ahorra 1 char sobre el más obvio
Si la salida se indexara en 0 en lugar de en 1, sería preferible un enfoque alternativo para rotar la matriz:
Pero este enfoque no se adopta fácilmente para indexar en 1:
o
fuente