Realmente me gustan los tiempos que siguen ciertos patrones. En particular, me gustan los momentos en que todos los dígitos son iguales, o todos los dígitos aumentan aritméticamente en uno de izquierda a derecha. Además, odio visceralmente cuando la gente pone cartas en mis tiempos, así que todas esas tonterías de AM / PM están muertas para mí. Por lo tanto, mis momentos favoritos son:
0000 0123 1111 1234 2222 2345
Para mi tranquilidad, necesito que me escriba un solo programa que, dada la hora actual como entrada, ambos: (A) si ahora no es uno de mis momentos favoritos, me diga a ambos (i) cuántos minutos son pasado desde mi último tiempo favorito y (ii) cuántos minutos a partir de ahora ocurrirá mi próximo tiempo favorito; y (B) si ahora es uno de mis momentos favoritos, proporciona un solo 'valor de señal'.
Entrada
Su programa debe aceptar (por cualquier método: argumento de función, stdin
línea de comando, etc.) la hora actual, en cualquiera de los siguientes formatos:
Un tiempo de cuatro dígitos como una cadena
Un entero que se puede rellenar con ceros a la izquierda para hacer un tiempo de cuatro dígitos como una cadena
Una secuencia de cuatro (o menos) enteros, ordenados de modo que el primer entero de la secuencia sea el dígito más a la izquierda (significativo) en la entrada de tiempo (por ejemplo,
0951
podría representarse válidamente como[0, 9, 5, 1]
o[9, 5, 1]
)- Representar
0000
como una secuencia de longitud cero es aceptable
- Representar
En el caso de una entrada de cadena, se debe solamente contener dígitos, no hay dos puntos u otra puntuacion. Se puede suponer que las entradas siempre son válidas 24 horas:, HHMM
donde 0 <= HH <= 23
y 0 <= MM <= 59
. Haga caso omiso de la posibilidad de un segundo salto.
Salida
Su programa debe suministrar (los retornos de funciones stdout
, etc. están todos bien) ya sea (A) o (B) , según corresponda, ya sea que el valor de entrada sea o no un tiempo objetivo.
Para):
Proporcione dos valores numéricos en cualquier formato sensible, como:
Salida de cadena única con un delimitador adecuado
Entero secuencial / salidas de cadena, por ejemplo,
bash
imprimir dos líneas parastdout
:49 34
Valores de retorno ordenados de longitud dos, como una lista de Python, una matriz C, etc.
[49, 34]
Los valores pueden venir en cualquier orden. Por ejemplo, los dos siguientes serían salidas válidas para una entrada de 1200
:
49 34
34 49
¡Sin embargo, el orden y el separador deben ser los mismos para todos los valores de entrada!
Para (B):
Produzca cualquier resultado inalcanzable. Lo mismo resultado se debe producir para los seis de los tiempos objetivo, sin embargo. Se excluyen los bucles infinitos.
Entradas / salidas de muestra
YAY!!!
se usa aquí como ejemplo demostrativo y no es prescriptivo.
Input Output
------ --------
0000 YAY!!!
0020 20 63
0105 65 18
0122 82 1
0123 YAY!!!
0124 1 587
0852 449 139
1111 YAY!!!
1113 2 81
1200 49 34
1234 YAY!!!
1357 83 505
1759 325 263
1800 326 262
1801 327 261
2222 YAY!!!
2244 22 61
2345 YAY!!!
2351 6 9
Este es el código de golf , por lo que gana el código más corto en bytes. Las lagunas estándar no están permitidas.
Respuestas:
Gelatina ,
3433323128 bytes3 bytes gracias al Sr. Xcoder
.ị
y sus³
trucos.Pruébalo en línea!
Algunas partes son exactamente como en la respuesta de Jonathan Allan , pero lo estoy publicando ya que creo que es lo suficientemente diferente y está escrito independientemente según mi respuesta de Pyth (y más breve: D). También debe tener margen de mejora.
La entrada es un entero, la salida es una matriz de tiempos anteriores y siguientes o la matriz vacía para tiempos especiales.
Explicación
Usando entrada de ejemplo
1200
.d³
convierte el tiempo en base 100, en horas y minutos:[12,0]
.ḅ60
Convierte desde la base 60 para obtener minutos totales:720
.;15
lo empareja con 15:[720, 15]
.83,588
crea la matriz[83, 588]
.ṁ5
hace que sea longitud 5:[83, 588, 83, 588, 83]
.¤
combina las dos acciones anteriores. Solo un tecnicismo.j
se une a la par con la matriz:[720, 83, 588, 83, 588, 83, 15]
._\
resta cada valor de matriz de la primera y obtiene resultados intermedios:[720, 637, 49, -34, -622, -705, -720]
.ṠÞ
establemente ordena esto por signum:[-34, -622, -705, -720, 720, 637, 49]
.A
toma los valores absolutos:[34, 622, 705, 720, 720, 637, 49]
.µ
comienza una nueva cadena monádica. De nuevo, un tecnicismo..ị
toma el último y el primer artículo:[49, 34]
.×Ạ
repite que una vez si no hay ceros, o cero veces de otro modo:[49, 34]
.fuente
,
a;
ya que se estaba recogiendo como una lista literal).³
lugar de100
está permitido ) ElYAY!!!
valor es[0, 0]
, siempre el mismo.xẠ
como filtro de cero, ya que tipo de prefiero[]
más[0, 0]
porque es más claramente diferente.JavaScript (ES6),
8783 bytesGuardado 4 bytes gracias a @ l4m2
Toma la entrada como una cadena. Devuelve
0
una matriz de 2 elementos o una.Casos de prueba
Mostrar fragmento de código
¿Cómo?
No nos importa el resultado del
.every()
bucle. Siempre que la entrada sea válida, siempre será falsa. Lo que realmente nos interesa es cuando salimos de este ciclo.Salimos tan pronto como encontramos un tiempo favorito
i
(expresado en minutos) que es mayor o igual que el tiempo de referenciak
(el tiempo de entradat
convertido en minutos). Luego regresamos0
sii == k
o los 2 retrasos de lo contrario.fuente
t%100+(t/25>>2)*60
=>t-(t/100|0)*40
Befunge-93,
8885868074 bytesPruébalo en línea!
Emite la cantidad de minutos desde la última hora favorita, seguida de la cantidad de minutos hasta la próxima hora favorita (separados por la secuencia de dos caracteres: espacio, guión). Si ya es un momento favorito, se devuelve un solo cero.
fuente
C, 121 bytes
Emite una nueva línea si la hora es una hora favorita.
Pruébalo en línea!
fuente
Limpio , 126 bytes
Define la función
?
, tomarInt
y regresar(Int, Int)
.Cuando el argumento es un momento favorito, bloquea el programa de llamada con
hd of []
.Pruébalo en línea!
fuente
Pyth,
484542 bytesPruébalo en línea. Banco de pruebas.
El código toma una cadena de tiempo y genera las veces anteriores y siguientes como una matriz, o
0
si el tiempo es especial.Curiosamente, un enfoque imperativo también es de 42 bytes:
Explicación
cz2
divide input (z
) en piezas de dos caracteres.sM
los evalúa como enteros.i
...60
analiza la matriz resultante de dos elementos como base 60.,83 588
representa la matriz[83, 588]
.*3
triplica eso a[83, 588, 83, 588, 83, 588]
.P
elimina el último588
.+
... se15
agrega15
al final..u-NY
comienza desde el número analizado, resta cada número de la matriz y devuelve los valores intermedios. Estas son las diferencias de cada momento especial.J
asigna estas diferencias aJ
.*F
Calcula el producto de las diferencias. Será 0 si el tiempo fue especial.&
detiene la evaluación aquí y devuelve 0 si el tiempo fue especial.._DJ
Estable-ordena las diferencias por signo.K
guarda esa matriz enK
.e
toma el último elemento de la matriz._hK
toma el primer elemento de la matriz y lo niega.,
devuelve los dos como una matriz.fuente
cz2 60
ac2z60
(son equivalentes para listas de 4 elementos)Jalea ,
33 3234 bytes+3+2 bytes para arreglar de modo que todas las salidas de tiempo gustadas sean iguales.Tiene que ser un camino más corto!
Un enlace monádico que toma una lista de los cuatro dígitos y devuelve una lista que contiene dos enteros
; si es el momento deseado, el resultado será ambas ceros.
Pruébalo en línea!o ver el conjunto de pruebas .
¿Cómo?
fuente
Casco , 36 bytes
Pruébalo en línea!
Gracias a Zgarb por explicarme cómo funcionan los ternaries en el chat. Tratando de jugar al golf
↑0
, pero por alguna razón no pude hacerlo funcionar (?). Esta es mi primera respuesta no trivial de Husk, y dejando de lado lo mencionado, estoy bastante satisfecho con eso. El valor utilizado en lugar deYAY!!!
es[]
(pero espero que eso cambie para fines de golf).Explicación
fuente
Kotlin , 293 bytes
Embellecido
Prueba
TIO
TryItOnline
fuente