Dado un camino ascii-art y el tiempo que me llevó cruzarlo, dime si estaba acelerando.
Unidades
La distancia está en la unidad arbitraria de d
. El tiempo está en la unidad arbitraria de t
.
El camino
Aquí hay un camino simple:
10=====
Los 10
medios 10 d
por t
. Ese es el límite de velocidad de la carretera. El camino tiene 5 =
s, entonces d
es 5. Por lo tanto, si cruzo ese camino en 0.5 t
, fui 10 d
por t
, porque 5 / 0.5 = 10. El límite de velocidad de ese camino es 10, así que me mantuve dentro del límite de velocidad.
Pero si cruzo esa carretera en 0.25 t
, fui 20 d
por t
, porque 5 / 0.25 = 20. El límite de velocidad de esa carretera es 10, así que fui 10 por encima del límite de velocidad.
Ejemplos y cálculos.
Tenga en cuenta que la entrada 1 es el tiempo que tardé en recorrer el camino, y la entrada 2 es el camino en sí.
Aquí hay un camino complejo:
Input 1: 1.5
Input 2: 5=====10=====
Lo más rápido que podría (legalmente) haber ido en la primera carretera (los primeros 5 =
s) es 5 d
por t
. Dado que 5 (distancia) dividido por 5 (límite de velocidad) es 1, lo más rápido que pude haber recorrido ese camino es 1 t
.
En la siguiente carretera, el límite de velocidad es 10 y la distancia también es 5, el más rápido que pude cruzar es 0.5 (5/10). Totalizar los tiempos mínimos resulta en 1.5, lo que significa que fui exactamente al límite de velocidad.
Nota: Lo sé, podría haber estado yendo muy rápido en un camino y realmente lento en otro y aún cruzar en 1.5, pero asumo lo mejor aquí.
Un último ejemplo:
Input 1: 3.2
Input 2: 3.0==========20===
La primera carretera tiene 10 largos y tiene un límite de velocidad de 3, por lo que el tiempo mínimo es 3.33333 ... (10 / 3.)
El segundo camino es de 3 largos y tiene un límite de velocidad de 20, por lo que el tiempo mínimo es de 0.15 (3/20).
Totalizando los tiempos resulta en 3.483333333 ... Lo crucé en 3.2, así que tuve que acelerar a alguna parte.
Notas:
- Debe generar un valor distinto si indudablemente estoy acelerando, y otro valor diferente si no lo estoy.
- Su programa o función puede requerir entrada o salida para tener una nueva línea final, pero por favor dígalo en su envío.
- Tu primera entrada será mi velocidad. Será un flotante positivo o entero o cadena.
- Su segunda entrada será el camino. Siempre coincidirá con la expresión regular
^(([1-9]+[0-9]*|[0-9]+\.[0-9]+)=+)+\n?$
. Puede probar entradas potenciales aquí si está interesado. - Puede ingresar datos en 2 parámetros de una función o programa, en 2 archivos separados, desde STDIN dos veces, o desde una cadena separada por espacios pasada a STDIN, una función, un archivo o un parámetro de línea de comandos.
- Si lo desea, puede cambiar el orden de las entradas.
- ¿Alguna pregunta? Pregunte abajo en comentarios y feliz código de golf ing!
^(([1-9]+[0-9]*|(?!0\.0+\b)[0-9]+\.[0-9]+)=+)+\n?$
. (Habría sido más limpio con una mirada hacia atrás, pero luego necesitaría un motor .Net)Respuestas:
05AB1E ,
2422 bytesDevuelve 1 cuando, sin duda, está acelerando y 0 en caso contrario.
Ahorro de 2 bytes gracias a carusocomputing .
Pruébalo en línea!
-§'-å
No debería ser más que una simple comparación, pero por alguna razón›
ni‹
parece funcionar entre el valor calculado y la segunda entrada.Explicación
Usando
3.0==========20===, 3.2
como ejemplofuente
'=¡õK¹S'=QJ0¡õK€g/O-0.S
para 23 bytes.S
funciona, está bien. Sin embargo, eso no devuelve 2 valores únicos, ya que devolverá 0 cuando haya hecho exactamente el límite de velocidad.a > b
operador está convirtiendo a entero antes de la comparación entre un flotante y un int. Es muy extraño, la verdad ... Yo entiendo hasta 22 bytes sin embargo:'=¡€Þ¹S'=Q.¡O0K/O-§'-å
.g>s/
} O-§'-å en 23 con 2 valores de retorno. ¿Tal vez hay alguna mejora por hacer todavía? Aunque no veo qué. Esa última comparación realmente nos fastidia.Python 2 , 71 bytes
Pruébalo en línea!
El sistema de tipo dinámico de Python puede soportar bastante abuso.
Al dividir la cadena de entrada, los signos iguales se
s.split('=')
conviertenk
enk-1
elementos de la lista de cadenas vacías (excepto al final, donde se debe cortar uno). Por ejemplo,El código itera sobre estos elementos, actualizando la velocidad actual
s
cada vez que ve un número. La actualización se realiza comos=float(c or s)
, donde sic
es una cadena no vacía, obtenemosfloat(c)
, y de lo contrario sec or s
evalúas
, dondefloat(s)
simplemente se mantienes
. Tenga en cuenta quec
es una cadena ys
es un número, pero Python no requiere no requiere tipos de entrada consistentes, yfloat
acepta cualquiera.Tenga en cuenta también que la variable que
s
almacena la velocidad es la misma que tomar la cadena de entrada. La cadena se evalúa cuando comienza el ciclo, y cambiarla dentro del ciclo no cambia lo que se repite. Por lo tanto, la misma variable se puede reutilizar para guardar en una inicialización. El primer bucle siempre tienec
un número, por lo ques=float(c or s)
no le importas
el rol inicial de una cadena.Cada iteración resta la velocidad actual de la asignación, que comienza como el límite de velocidad. Al final, el límite de velocidad ha sido violado si esto cae por debajo
0
.fuente
Python 3 , 79 bytes
Pruébalo en línea!
Por ejemplo, la entrada
3.0==========20===
se convierte a la cadenay evaluado, y el resultado se compara con la velocidad de entrada. Cada uno
-~
aumenta por1
. Soy nuevo en expresiones regulares, por lo que tal vez haya una mejor manera, como hacer ambas sustituciones a la vez. Gracias a Jonathan Allan por señalar cómo hacer coincidir a todos menos al=
personaje.fuente
"0.5=20==="
, la salida seráNone
independientemente de la entrada de tiempo.([\d|.]+)
puede arreglarlo.Javascript (ES6), 63 bytes
Uso
Asigne esta función a una variable y llámela usando la sintaxis curry. El primer argumento es el tiempo, el segundo es el camino.
Explicación
Coincide con todas las series consecutivas de caracteres que no son signos iguales seguidos de una serie de signos iguales. Cada coincidencia se reemplaza por el resultado de la función interna, que utiliza dos argumentos: la ejecución de signos iguales (en variable
d
) y el número (variablec
). La función devuelve la longitud del camino dividido por el número, precedido por un +.La cadena resultante se evalúa y se compara con la primera entrada.
Fragmento de pila
fuente
GNU C, 128 bytes
Maneja límites de velocidad no enteros también.
#import<stdlib.h>
es necesario para que el compilador no asuma queatof()
devuelve unint
.t<s-.001
es necesario para que funcione el caso de prueba de límite de velocidad exacto, de lo contrario, los errores de redondeo hacen pensar que estaba acelerando. Por supuesto, ahora si el tiempo es en1.4999
lugar de1.5
, no considera que se acelere. Espero que esté bien.Pruébalo en línea!
fuente
Perl 5 , 43 bytes
42 bytes de código +
-p
bandera.Pruébalo en línea!
Para cada grupo de dígitos seguido de algunos signos de igual (
[^=]+(=+)
), calculamos cuánto tiempo se necesita para cruzarlo (número de iguales dividido por la velocidad(length$1)/$&
:) y sumamos esos tiempos en el interior$t
. Al final, solo tenemos que verificar que$t
sea menor que el tiempo que tardó en cruzarlo ($_=$t < <>
). El resultado será1
(verdadero) o nada (falso).fuente
Mathematica, 98 bytes
Función pura que toma dos argumentos, un número (que puede ser un número entero, fracción, decimal, par
π
o un número en notación científica) y una cadena terminada en nueva línea, y que devuelveTrue
oFalse
. Explicación a modo de ejemplo, utilizando las entradas3.2
y"3==========20===\n"
:#2~StringSplit~"="
produce{"3","","","","","","","","","","20","","","\n"}
. Observe que el número de""
s consecutivos es uno menos que el número de=
s consecutivos en cada ejecución.//.{z___,a_,b:Longest@""..,c__}:>{z,(Length@{b}+1)/ToExpression@a,c}
Es una regla de reemplazo repetitiva. Primero establecez
la secuencia vacía,a
to"3"
,b
to"","","","","","","","",""
(la ejecución más larga de""
s que pudo encontrar), yc
to"20","","","\n"
; el comando se(Length@{b}+1)/ToExpression@a
evalúa y(9+1)/3
, por lo tanto, el resultado del reemplazo es la lista{10/3, "20","","","\n"}
.A continuación, la regla de reemplazo establece
z
a10/3
,a
to"20"
,b
to"",""
yc
to"\n"
. Ahora se(Length@{b}+1)/ToExpression@a
evalúa como(2+1)/20
, y entonces el resultado del reemplazo es{10/3, 3/20, "\n"}
. La regla de reemplazo no puede encontrar otra coincidencia, por lo que se detiene.Finalmente,
Tr[...]-"\n"
(ahorra un byte para usar una nueva línea real entre las comillas en lugar de"\n"
) agrega los elementos de la lista, obteniendo10/3 + 3/20 + "\n"
, y luego resta"\n"
, lo que Mathematica está perfectamente feliz de hacer. Finalmente,<=#
compara el resultado con la primera entrada (3.2
en este caso), que produceFalse
.fuente
"1+2====3.456====π=====\n"
pareja.Jalea , 27 bytes
Pruébalo en línea!
Nota: se asume que la expresión regular dada en la pregunta debe ser tal que un límite de velocidad no puede ser
0.0
,0.00
, etc. - al igual que no se puede0
( confirmado como una propiedad no intencional).¿Cómo?
fuente
0.0
ya que filtro los valores que evalúan como0
en el código para extraer los límites de velocidad.Python 3, 90 bytes
Salidas
True
si estás acelerando,False
si no lo estás. No requiere (pero funcionará con) nueva línea final.A pesar de que no se ve como lo haría, maneja correctamente los flotadores tanto en el tiempo de entrada como en los límites de velocidad, porque la expresión regular solo se usa para separar los segmentos de la carretera.
fuente
MATL ,
3130 bytesLas entradas son: una cadena (límites de velocidad y carreteras), luego un número (velocidad utilizada). La salida es,
1
sin duda, a toda velocidad,0
si no.Pruébalo en línea!
Explicación con ejemplo
Considere las entradas
'3.0==========20==='
y3.2
.fuente
APL, 41 bytes
Esto toma el camino como una cadena como argumento derecho, y el tiempo tomado como argumento izquierdo, y regresa
1
si estaba acelerando y0
si no, así:Explicación:
X←⍵='='
: almacenar enX
un vector de bits de todas las posiciones⍵
que forman parte del camino.X≠¯1⌽X
: marca cada posiciónX
que no es igual a su vecino derecho (envolviendo), dando las posiciones donde comienzan los números y las carreterasY←⍵⊂⍨
: dividir⍵
en estas posiciones (dando una serie de cadenas de números y carreteras alternas), y almacenarlo enY
.Y⊂⍨2|⍳⍴Y
: divididoY
en pares consecutivos.{(≢⍵)÷⍎⍺}/¨
: para cada par, divida la longitud de la parte del camino (≢⍵
) por el resultado de evaluar la parte del número (⍎⍺
). Esto le da el tiempo mínimo para cada segmento.+/
: Suma los tiempos de todos los segmentos para obtener el tiempo mínimo total.⍺<
: Compruebe si el tiempo dado es inferior al mínimo o no.fuente
TI-Basic,
168165 bytesLa entrada es el camino como
Str0
y el tiempo comoT
. Asegúrese de preceder a la carretera con una cita, por ejemploStr0=?"14========3===
.La salida es 0 si está acelerando, 1 si posiblemente no está acelerando.
fuente
Bash, 151 bytes
Ejecutando como (por ejemplo)
$ bash golf.sh .5 10=====
:Explicación
Habilite los operadores de coincidencia de patrones extendidos de bash y asigne el camino a una variable
r
.Bucle hasta que
r
esté vacío. Conjuntof
parar
con todos los signos de igual eliminan del extremo, utilizando la%%
expansión de parámetro y el+()
operador globbing extendida.Asigne a
s
una suma continua de los tiempos mínimos para cada segmento de carretera. Esto puede reescribirse (quizás un poco) de manera más legible como:Básicamente, lo que está sucediendo aquí es que estamos usando una cadena aquí para obtener el
dc
comando para hacer cálculos matemáticos para nosotros, ya que bash no puede hacer aritmética de punto flotante por sí misma.9k
establece la precisión para que nuestra división sea de punto flotante ep
imprime el resultado cuando hayamos terminado. Es una calculadora de pulido inverso, por lo que lo que realmente estamos calculando se${f##*=}
divide por$[${#r}-${#f}]
, más nuestra suma actual (o, cuando corremos por primera vez ys
aún no se ha configurado, nada, lo que nos da un mensaje de advertencia en stderr sobredc
' s pila está vacía, pero todavía imprime el número correcto porque estaríamos sumando a cero de todos modos).En cuanto a los valores reales que estamos dividiendo:
${f##*=}
esf
con la coincidencia de patrón más grande*=
eliminada del frente. Dado quef
es nuestro camino actual con todas las señales iguales eliminadas del final, esto significa que${f##*=}
es el límite de velocidad para este tramo particular del camino. Por ejemplo, si nuestro caminor
fuera '10 ===== 5 === ', entoncesf
sería '10 ===== 5', y entonces${f##*=}
sería '5'.$[${#r}-${#f}]
es el número de signos iguales al final de nuestro tramo de carretera.${#r}
es la longitud der
; dadof
que solo ser
eliminan todos los signos de igual al final, podemos restar su longitud de la der
para obtener la longitud de esta sección del camino.Elimine esta sección del límite de velocidad de la carretera desde el final de
f
, dejando todas las otras secciones de la carretera, y configúrelor
, continuando el bucle para procesar el siguiente tramo de la carretera.Pruebe para ver si el tiempo que tomamos para recorrer el camino (provisto como
$1
) es menor que el mínimo permitido por el límite de velocidad. Este mínimo,s
puede ser un flotador, por lo que recurrimosdc
nuevamente para hacer la comparación.dc
tiene un operador de comparación, pero en realidad su uso terminó siendo 9 bytes más que este, por lo que resto nuestro tiempo de viaje del mínimo y verifico si es negativo comprobando si comienza con un guión. Quizás poco elegante, pero todo es justo en el amor y el codegolf.Dado que esta comprobación es el último comando en el script, el script también devolverá su valor de retorno: 0 si posiblemente está acelerando, 1 si definitivamente está acelerando:
fuente
Python 3.6, 111 bytes
Mi primer código de golf!
Pruébalo en línea!
re.split('(=+)',b)[:-1]
Divide el camino por trozos de=
.Luego itera sobre el resultado, utilizando
try:s=float(c)
para establecer el límite de velocidad actual si el elemento actual es un número oexcept:t+=len(c)/s
para agregar el tiempo para atravesar esta sección de la carretera al total acumulado.Finalmente, devuelve el tiempo necesario al tiempo más rápido posible.
fuente
PHP5
207202bytesPrimer esfuerzo en una respuesta de código de golf, por favor, sé fácil conmigo. Estoy seguro de que uno de ustedes, genios, podrá acortar esto significativamente, cualquier consejo de golf es bienvenido.
Invocar con
Devuelve verdadero si ha estado por debajo del límite de velocidad, falso de lo contrario
fuente
Dyalog APL, 27 bytes
<∘(+/(⍎'='⎕r' ')÷⍨'=+'⎕s 1)
'=+'⎕s 1
es una función que identifica tramos de'='
con una expresión regular y devuelve un vector de sus longitudes (⎕s
el operando derecho 0 significaría desplazamientos; 1 - longitudes; 2 - índices de expresiones regulares que coinciden)'='⎕r' '
reemplaza'='
s con espacios⍎'='⎕r' '
lo ejecuta: devuelve un vector de velocidades÷⍨
en el medio divide los dos vectores (⍨
intercambia los argumentos, por lo que es la distancia dividida por la velocidad)+/
es sumahasta ahora todo es un tren de 4 - una función sin un argumento explícito
<∘
compone "menos que" delante de esa función; entonces, la función actuará solo en el argumento correcto y su resultado se comparará con el argumento izquierdofuente
F # (165 bytes)
Todavía soy nuevo en F #, así que si hice algo extraño o estúpido, avíseme.
fuente
Método C # (
137122 bytes)Requiere
using System.Linq
agregar 19 bytes, incluidos en el 122:Versión ampliada:
La
road
cadena se divide en el=
personaje. Dependiendo de si una cadena es la matriz resultante está vacía, la función de agregado establece lapace
variable para el segmento (que indica el tiempo que tarda en viajar un solo=
) y lo resta del tiempo suministrado. Esto hará demasiadas sustracciones (para el segmento final de la carretera), por lo que en lugar de comparar0
, comparamos con-pace
fuente
R , 100 bytes
Pruébalo en línea!
Retornos
TRUE
para valores de velocidad inequívocamente,FALSE
para valores posiblemente sin velocidad .fuente
PowerShell , 71 bytes
Pruébalo en línea!
Script de prueba:
Salida:
Explicación:
5=====10=====
, intercambia elementos, agrega corchetes y operadores+(=====)/5+(=====)/10
=
con+1
:+(+1+1+1+1+1)/5+(+1+1+1+1+1)/10
fuente