Tenemos algunos nuevos moderadores del sheriff en la ciudad, Mego y DJMcMayhem . Necesitamos un desafío para honrarlos adecuadamente por sus nuevos puestos, así que ahí vamos.
Aquí hay algo que me ha llamado la atención al pasar el mouse sobre sus perfiles: sus ID de usuario son y . Si realiza una resta de dígitos, notará algo bastante emocionante (por supuesto, tomando las diferencias absolutas):45941
3|1|7|1|6
4|5|9|4|1
-+-+-+-+- (-)
1|4|2|3|5
El número generado por el algoritmo anterior es . Hay algo especial en este número entero: consta solo de dígitos consecutivos , ordenados en orden ascendente, pero exactamente uno de los dígitos no está colocado correctamente - .
Llamaremos a un par de enteros positivos un par DJMcMego si las diferencias absolutas en dígitos son enteros consecutivos, ordenados en orden ascendente, pero exactamente uno de ellos no está donde pertenece. Es decir, es posible mover exactamente un dígito del resultado de la resta por dígitos a otra posición, de modo que el entero obtenido solo tenga dígitos consecutivos, ordenados en orden ascendente.
En nuestro ejemplo anterior, el par es un par DJMcMego , porque si se mueve entre y , el resultado es , que cumple con los criterios. Tenga en cuenta que los dígitos del número resultante no necesitan comenzar en , solo deben ser consecutivos. Cuando uno no está seguro de qué decisión deben tomar, siempre puede confiar en la ayuda del otro para resolver las cosas.
Su tarea es generar un valor verdadero / falso dependiendo de si un par de enteros positivos dados como entrada es un par DJMcMego.
Usted está garantizado que y tendrán el mismo número de dígitos, siempre por lo menos 4.
Puede tomar los enteros en cualquier formato razonable (es decir, enteros nativos, cadenas, listas de dígitos, etc.)
Puede competir en cualquier lenguaje de programación y puede tomar entradas y proporcionar salidas a través de cualquier método estándar , mientras toma nota de que estas lagunas están prohibidas por defecto. Este es el código de golf , por lo que gana el envío más corto (en bytes) para cada idioma .
Casos de prueba
a, b -> Output
31716, 45941 -> Truthy
12354, 11111 -> Truthy
56798, 22222 -> Truthy
23564, 11111 -> Truthy
1759, 2435 -> Truthy
12345, 11111 -> Falsy
3333, 2101 -> Falsy
22354, 22222 -> Falsy
31717, 45941 -> Falsy
14325, 11111 -> Falsy
89789, 78865 -> Falsy
14954, 61713 -> Falsy
25631, 11114 -> Falsy
O, en otro formato .
fuente
25631, 11114
como ejemplo. Las diferencias son las14523
que confunden varios de los programas actualesRespuestas:
05AB1E , 18 bytes
Pruébalo en línea!
fuente
1
sea el único número verdadero en 05AB1E; Si el Sr. Xcoder no me hubiera informado sobre este hecho, habría cuestionado la validez de esta solución. ¿Podría agregar una explicación, también, cuando tenga tiempo?C (gcc) ,
259258254253250248233222 bytesfor(...;l++)b*=B[l]==-~B[l-1];
al golffor(...;b*=B[l]==-~B[~-l++]);
(lo más probable es que dependa de un comportamiento indefinido, ya que requiere primero una evaluaciónB[l]
seguida de-~B[~-l++]
)trescinco bytes.quinceveintiséis bytes gracias a ceilingcat .Pruébalo en línea!
Explicación (versión de 248 bytes)
Pruébalo en línea!
fuente
j=0
como en el 41.o charj
tener el valor0
que no es necesariamente el caso después de varias llamadas. Sin embargo, una función debe ser arbitrariamente frecuente y aún resolver el desafío ( meta post relevante ).j
que sea cero antes del ciclo y así guardar un byte.f(char*A,char*B){
->f(A,B)char*A,*B;{
.JavaScript (ES6), 130 bytes
Toma datos como dos matrices de dígitos en la sintaxis de curry
(a)(b)
. Devuelve un booleano.Pruébalo en línea!
fuente
SWI-Prolog, 157 bytes
No muy breve, pero el problema parecía particularmente adecuado para predicados declarativos, enlace variable y recursividad, es decir, Prolog :)
Llamar con, por ejemplo,
n([3,1,7,1,6],[4,5,9,4,1]).
Explicación: mueva un elemento en ambas listas a una nueva posición (usando el SWI-Prolog
nth0
incorporado) y verifique si la diferencia de las nuevas listas es consecutiva.fuente
J , 27 bytes
−8 bytes gracias a FrownyFrog
Pruébalo en línea!
Solución inicial:
J , 35 bytes
Pruébalo en línea!
Explicación
Toma listas de dígitos como entrada
|@-
encuentra la diferencia absoluta entre los dígitos de las listas1=1#.0<2-/\]
Comprueba si solo un dígito está fuera de su lugar. Primero encuentro las diferencias entre todos los pares de dígitos adyacentes y verifico si solo uno de ellos es positivo.*
Multiplique el resultado de la prueba anterior (1 o 0) con la siguiente prueba:1=[:*/2-/\\:~
¿Son todos los dígitos consecutivos? Ordeno la lista, tomo las diferencias para todos los pares de dígitos adyacentes, los multiplico y verifico si es igual a 1fuente
25634 11111
(al igual que muchas otras presentaciones)Jalea , 14 bytes
Pruébalo en línea!
Cómo funciona
fuente
Japt , 18 bytes
Toma la entrada como matrices de 2 dígitos, salidas
0
paratrue
o cualquier otro número parafalse
.Pruébelo o verifique todos los casos de prueba
Explicación
Y, para recorrer ese proceso en algunos casos de prueba más:
fuente
25634 11111
(como muchas otras presentaciones)Perl,
121118 bytesPrueba en bash:
fuente
25634 11111
(al igual que muchas otras presentaciones)Java 8 ,
245227223194188 BytesGracias a Kevin por guardar ~ 29 bytes
Gracias a Kevin nuevamente por otros 6 bytes
Siguió el mismo patrón que Galen ideó para su respuesta J.
Pruébalo en línea!
fuente
z->{int l=z.length/2,c[]=new int[l],i=0,j=0,d[];for(;i<l;)c[i]=Math.abs(z[i]-z[i+++l]);java.util.Arrays.sort(d=c.clone());for(i=0;i<l-1;j+=d[i+1]-d[i++]!=1?1:0)j+=c[i]-c[i+1]>0?1:0;return j==1;}
combiné elint
yint[]
al principio; se usal=z.length/2
una vez y se reutiliza enl
lugar de 4 veces; cambió elif(...)j++
aj+=...?1:0
para que se puedan colocar dentro de los bucles y se puedan quitar los corchetes y el segundo punto y coma; eliminado eli++
y hacer++
directamente en el últimoi
en el bucle; etc.z->{int l=z.length/2,c[]=new int[l],i=0,j=0;for(;i<l;)c[i]=Math.abs(z[i]-z[i+++l]);java.util.Arrays.sort(z=c.clone());for(i=0;i<l-1;j+=z[i]-z[i-1]!=1?1:0)j+=c[i]-c[++i]>0?1:0;return j==1;}
. Eliminód[]
y reutilizó la entradaz
que ya no necesita; Cambiadoj+=c[i]-c[i+1]?1:0;
yj+=d[i+1]-d[i++]!=1?1:0
aj+=c[i]-c[++i]?1:0;
yj+=z[i]-z[i-1]?1:0
. +1 de mi parte, sin embargo. ¡Buena respuesta! :)25634 11111
(al igual que muchas otras presentaciones)Retina , 102 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Devuelve el número de formas en que los dígitos se pueden mover para lograr una secuencia ascendente, que es 2 para un intercambio directo, ya que cualquier dígito se puede mover más allá del otro en ese caso. Explicación:
Empareja los dígitos.
Convierte a unario.
Tome la diferencia, pero luego agregue 1 porque trabajar con cero en Retina es difícil ™.
Enumere todas las secuencias de dígitos obtenidas moviendo exactamente un dígito.
Verifique los dígitos consecutivos.
fuente
Perl 5 , -F
878483 bytesConteo de estilo antiguo: 86 bytes (
+3
para-F
)Déle los números como 2 líneas en STDIN, la última línea sin una nueva línea al final.
Imprime la cadena de diferencia hasta 2 veces para verdadero, nada para falso
La larga
A0123456789
cadena es realmente molesta.Pruébalo en línea!
Estoy seguro si esto
79
cuenta como válido:Se bloquea por un par válido, por lo que obtienes un código de salida distinto de cero. No hace nada si no es un par y sale con el código de salida 0. Sé que devolver el resultado a través del código de salida está permitido, pero ¿son correctamente verdaderos y falsos o de hecho están invertidos (porque el shell
0
es verdadero)?fuente
Ruby ,
124113 9995 bytesPruébalo en línea!
fuente
25634 11111
(al igual que muchas otras presentaciones)+1
:-)Pyt ,
2018 bytesPruébalo en línea!
Explicación:
fuente
25634 11111
(al igual que muchas otras presentaciones)Agregar ++ , 105 bytes
Pruébalo en línea!
Define una función lambda que toma dos listas de dígitos como entrada. Emite un entero positivo divisible por 24 1 para pares DJMcMego, 0 de lo contrario.
1: Si esto es demasiado restrictivo, también genera un número entero positivo para pares DJMcMego, y 0 en caso contrario
Cómo funciona
Aquí realizamos 4 verificaciones para determinar si la entrada es válida. Las partes del código que hacen esas verificaciones son
Aquí, tomamos la lista de diferencias absolutas de dígitos, luego contamos el número de pares superpuestos que se ordenan en orden descendente. Cada par DJMcMego produce un resultado de 1 , pero no son únicos en este aspecto. También almacenamos las diferencias absolutas de dígitos de las entradas, para guardar bytes más adelante. Esta matriz se denominará A en todo momento.
A continuación, tomamos las diferencias por elementos entre A y A ordenadas, antes de afirmar que al menos una de esas diferencias es negativa.
En tercer lugar, comprobamos si el par [1, 2] está contenido en los incrementos de avance de A . Esto verifica que, al menos en una posición de A , esté ordenada, lo cual es un criterio para los pares DJMcMego.
Como nuestra última comprobación, afirmamos que el segundo elemento de A nunca es 0 . Para que un par, X e Y , sean un par DJMcMego, podemos suponer que su A siempre es única, ya que una matriz con duplicados nunca se puede hacer consecutiva intercambiando un solo valor con otro.
Finalmente, verificamos que las primeras tres de estas pruebas devolvieron 1 , y que la cuarta devolvió un valor x tal que x ≠ 0
Un paso a paso del código es el siguiente
fuente
R ,
11010684 bytesPruébalo en línea!
¡@JayCe con un ridículo ahorro de 22 bytes!
El caballo de batalla aquí es
adist
, que da una "distancia de edición de Levenshtein generalizada" entre dos cadenas. Por defecto, la distancia es el recuento del número mínimo de inserciones, eliminaciones y sustituciones necesarias para transformar una cadena en otra. Pero leadist
permite ponderar las cosas como desee, por lo que he ponderado cada sustitución para agregar 9 a la distancia en lugar de 1. Esto efectivamente obliga al algoritmo a buscar solo inserciones y eliminaciones.Este código acepta vectores de enteros, calcula las diferencias absolutas por elementos y traduce el resultado para comenzar en 1, llamándolo
w
.Luego, la distancia de Levenshtein ponderada personalizada se calcula entre
w
pegada para hacer una cadena y la cadena"1234..."
(en realidad utf-8"\001\002\003\004...
"peroadist
no le importa) con el mismo número de caracteres quew
.La única forma en que la cadena puede tener exactamente un dígito fuera de lugar es si realiza una eliminación y una inserción, dando una distancia de 2.
fuente
paste0
puede ser solopaste
porque solo hay una entrada.p=intToUtf8
?w=z-min(z)+1)adist(p(1:max(w))
conw=z-min(z))adist(p(0:max(w))
, pero no funciona yaintToUtf8(\000)
es NULL.JavaScript,
137136135134132123 bytesToma la entrada como dos matrices de dígitos en la sintaxis de curry, salidas
0
paratrue
y cualquier otro número parafalse
.Casos de prueba
fuente
[...u].sort(y=0)
es JavaScript no válido, el argumento para la ordenación debe ser una función25634 11111
(como muchas otras presentaciones)" - Ton HospelPython 2 ,
116119106 bytesGracias Sr. Xcoder por el
116->84
corte, pero descubrí que no cumplí con los criterios de "número consecutivo", por lo que se agregan 26 bytes para ese propósito :(Después de eso, -1 más Gracias Sr. Xcoder, y -13 Gracias ovs
Pruébalo en línea!
El siguiente soluciona el
25634 - 11111
problema pero con doble longitud (211206145142B) ... Jugar al golf ...Pruébalo en línea!
Y felicidades a los nuevos moderadores :)
Explicación:
Genera la lista de diferencias absolutas de los dígitos.
Calcula el desplazamiento desde la posición correcta.
Si la secuencia no es continua, entonces la suma de compensación "generalmente" no será 0. Pero incluso si es igual a 0, las siguientes las bloquearán.
Solo 0 o 1 elemento tendrá un desplazamiento absoluto mayor que 1 (el que tiene una posición incorrecta, y 0 es en el caso similar
1,2,3,5,4
)Bloquea el caso cuando los números están todos en las posiciones correctas
fuente
m([3,3,3,3],[2,1,0,1])
(regresaTrue
) Tio25634 11111
(al igual que muchas otras presentaciones)Haskell ,
182163162132 bytesToma la entrada como una lista de dígitos. La función auxiliar
p
que ofrece todas las formas posibles de dividir una lista en dos partes se utiliza para extraer un elemento y nuevamente para insertarlo en otro lugar.Pruébalo en línea!
fuente