Este desafío fue inspirado por este comercial de Wendy's de 1984.
Ilustración de TS Rogers.
Su tarea es encontrar un 0xBEEF hexadecimal en un bollo binario.
La 'carne' consiste en el siguiente patrón:
1 0 1 1 (0xB)
1 1 1 0 (0xE)
1 1 1 0 (0xE)
1 1 1 1 (0xF)
Y el 'bollo' consiste en una matriz binaria de 12x12, como:
1 1 1 0 0 1 1 1 1 1 1 0
1 1 0 1 0 0 1 0 0 0 0 0
0 1 0 0 0 1 1 1 1 1 0 1
1 0 0 1 0 0 1 0 0 1 0 0
1 0 0 1 0 1 1 0 0 1 1 1
1 1 1 1 1 1 0 0 0 0 1 0
1 1 0 1 1 1 0 0 0 0 0 1
1 0 0 1 1 1 1 0 0 0 0 1
1 0 0 1 1 1 0 1 1 1 1 1
1 1 1 1 1 0 0 1 1 1 1 1
1 0 0 0 0 1 0 1 0 1 1 1
1 1 0 0 1 1 0 0 0 0 1 1
Entrada
Su programa o función tomará la matriz binaria como entrada. El formato de matriz es muy flexible, pero debe describirse claramente en su respuesta.
Por ejemplo:
Una sola cadena binaria, con o sin separadores entre las filas:
"111001111110 110100100000..."
o:
"111001111110110100100000..."
una matriz de cadenas binarias:
["111001111110", "110100100000", ...]
una matriz de números (cada número que describe una fila una vez convertida de nuevo a binario y rellena con ceros a la izquierda):
[3710, 3360, ...]
Salida
Las coordenadas (X, Y)
de la 'carne', (0, 0)
siendo la esquina superior izquierda del bollo.
Alternativamente, puede usar coordenadas basadas en 1 (pero no una combinación de ambos formatos, como 0 para X y 1 para Y).
Para el ejemplo anterior, la respuesta esperada es (3, 4)
(basada en 0) o (4, 5)
(basada en 1):
00 01 02 03 04 05 06 07 08 09 10 11
00 1 1 1 0 0 1 1 1 1 1 1 0
01 1 1 0 1 0 0 1 0 0 0 0 0
02 0 1 0 0 0 1 1 1 1 1 0 1
03 1 0 0 1 0 0 1 0 0 1 0 0
04 1 0 0 [1 0 1 1] 0 0 1 1 1
05 1 1 1 [1 1 1 0] 0 0 0 1 0
06 1 1 0 [1 1 1 0] 0 0 0 0 1
07 1 0 0 [1 1 1 1] 0 0 0 0 1
08 1 0 0 1 1 1 0 1 1 1 1 1
09 1 1 1 1 1 0 0 1 1 1 1 1
10 1 0 0 0 0 1 0 1 0 1 1 1
11 1 1 0 0 1 1 0 0 0 0 1 1
Una vez más, cualquier formato razonable funcionaría siempre que se especifique en su respuesta. Mencione también si está utilizando coordenadas basadas en 0 o en 1.
Reglas
- Puede asumir con seguridad que siempre hay exactamente una 'carne' en el pan. No se requiere su código para admitir casos con más de una carne o sin carne.
- El patrón de carne siempre aparecerá como se describe. Nunca se rotará ni reflejará de ninguna manera.
- Este es el código de golf, por lo que gana la respuesta más corta en bytes. Las lagunas estándar están prohibidas.
Casos de prueba
En los siguientes casos de prueba, cada fila de la matriz se expresa como su representación decimal.
Input : [ 3710, 3360, 1149, 2340, 2407, 4034, 3521, 2529, 2527, 3999, 2135, 3267 ]
Output: [ 3, 4 ]
Input : [ 1222, 3107, 1508, 3997, 1906, 379, 2874, 2926, 1480, 1487, 3565, 633 ]
Output: [ 3, 7 ]
Input : [ 2796, 206, 148, 763, 429, 1274, 2170, 2495, 42, 1646, 363, 1145 ]
Output: [ 6, 4 ]
Input : [ 3486, 3502, 1882, 1886, 2003, 1442, 2383, 2808, 1416, 1923, 2613, 519 ]
Output: [ 1, 1 ]
Input : [ 3661, 2382, 2208, 1583, 1865, 3969, 2864, 3074, 475, 2382, 1838, 127 ]
Output: [ 8, 8 ]
Input : [ 361, 1275, 3304, 2878, 3733, 3833, 3971, 3405, 2886, 448, 3101, 22 ]
Output: [ 0, 3 ]
Input : [ 3674, 2852, 1571, 3582, 1402, 3331, 1741, 2678, 2076, 2685, 734, 261 ]
Output: [ 7, 7 ]
(1,1)
)?y
,x
(es decir, orden inverso)?Respuestas:
Jalea ,
201716 bytesLa entrada está en forma de una matriz booleana, la salida es el par de índice basado en 1 (Y, X) .
Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
ṡ4Z€Ḅw€“Ье‘ĖUṀ
ṡ€4ḄZjw“¿ÇÇБ’d24
con indexación basada en 0, pero, desafortunadamente, es un byte más.vim,
126807776Espera entrada en el formulario
Y salidas (con índices basados en 1) como
Gracias a Jörg Hülsermann por guardar indirectamente 46 bytes al darme cuenta de que mi expresión regular era súper tonta, y a DJMcMayhem por 3 bytes más.
fuente
Yp
es mejor queyyp
(aunque sé que usted se opone aY
: P) 2) el espacio en blanco noexec 'norm Go'
es necesario. Y 3)kd{
es más corto quekdgg
. (Aunque no lo he probado)Y
porque tengo un rebote en mi vimrc. : P De hecho, elkdgg
era equivalente a solod{
, que, sorprendentemente, no elimina la línea actual.{
ser un movimiento de personajes; así que he hecho algo así como{d''
eliminar líneas enteras.JavaScript (ES6),
636056 bytesToma la entrada como una cadena delimitada por espacios de 155 caracteres de 12 cadenas binarias de 12 dígitos, devuelve valores indexados a cero. Editar: Guardado 3 bytes gracias a @ JörgHülsermann. Guardado 4 bytes gracias a @ETHproductions.
fuente
s.search(r)
lugar der.exec(s).index
?s=>[
a(s,i)=>[
, porque necesitas definirlo en alguna parte: /C,
146177173163 bytesGracias a Numberknot por arreglar el código (desplazando las tres filas inferiores).
Ahorrando 4 bytes reemplazando
>>=1
con/=2
en 4 lugares. Ahorrando 10 bytes más al permitirx
yy
ser global y predeterminadoint
gracias a MD XFSin golf:
Devuelve x, y (basado en 0) en el mordisco alto y bajo de un byte.
Uso:
fuente
#define T(i,n)if((A[y+i]&15)==n)
y la sección ifT(0,11)T(1,14)T(2,14)T(3,15)return
para guardar 6 bytes. También cambie la firma de la funciónint b(int*A)
a 4 bytes más guardados.MATL ,
2221 bytesLa entrada es una matriz binaria, con un
;
separador de filas. La salida es 1-basa en el orden inverso:Y X
.Pruébalo en línea! O verifique todos los casos de prueba con formato de entrada decimal.
Explicación
El patrón se detecta mediante convolución 2D. Para esto,
1, -1
lugar de1, 0
. Como el patrón tiene un tamaño de 4 × 4, su aparición se detecta mediante una entrada igual a16
la salida de convolución.Además, dado que la convolución introduce un desplazamiento en los índices detectados, esto debe corregirse en la salida.
fuente
Mathematica, 62 bytes
Devuelve todas las posiciones de la matriz BEEF, indexadas en 1. La entrada debe ser una matriz de dígitos binarios. Sin embargo, las x e y en la salida se cambian.
fuente
x
yy
le cambia.Slip , 28 bytes
27 bytes de código, +1 para la
p
opción.Requiere entrada como un rectángulo multilínea de 1 y 0 sin espacios. Pruébelo aquí (con el tercer caso de prueba como entrada).
Explicación
Slip es un lenguaje del desafío 2D-Match Matching . Sp3000 podría decir mucho más al respecto que yo, pero básicamente es una forma extendida de expresiones regulares con algunos comandos direccionales que te permiten combinar en dos dimensiones. El código anterior usa el comando homónimo "slip"
\
, que no cambia la dirección del puntero de coincidencia, sino que lo mueve de lado por un carácter. También utiliza "grupo estacionario"(?|...)
, que coincide con algo y luego restablece el puntero a su ubicación anterior.El código se descompone de la siguiente manera:
Esto coincide con el
0xBEEF
cuadrado. Lap
opción genera las coordenadas del partido, indexadas en 0.fuente
1011>001>1(11>){3}1>1
1(11>){3}
.PHP, 87 bytes
cadena binaria como entrada sin separadores, devuelve valores indexados a cero.
matriz de números como entrada 128 Bytes
14 Bytes guardados por @Titus Gracias
fuente
,
lugar de.
enecho
y puede eliminar los paréntesis. (-4)PREG_OFFSET_CAPTURE
: agregue,256
a lospreg_match
parámetros, elimine^(.*)
de la expresión regular, en$c[0][1]
lugar destrlen($c[1])
(-6)Java 7
182177 bytesPorté la respuesta de Karl Napf C a JAVA y gracias a Karl Napf por guardar 5 bytes recordándome Bit magic. (Por cierto, también se me ocurrió esta idea, pero la idea de la parte de devolución de @KarlNapf era tuya, no mía). Lo siento si te disguste.
(Basado en 0)
Sin golf
fuente
a[y++]>>=1)
yif((a[y]&15)==
. Por cierto, cuento 182 bytes en lugar de 183? : S...a[y++]/=2)
yif((a[y]&15)==...
.Retina, 47 bytes
Me gustaría presentar esto con una disculpa. Creo que esto es probablemente terrible y un mal ejemplo de cómo usar el lenguaje, pero como usé un Regex para mi respuesta de Perl, pensé en probar Retina. No soy muy bueno. :( Sin embargo, los fragmentos en github me ayudaron mucho.
¡Gracias a @ wullzx por su comentario sobre mi respuesta de Perl para -3 bytes y a @ Taemyr por señalar un problema con mi método!
Espera la entrada como una cadena binaria separada por espacios y las salidas coordina el espacio separado.
Pruébalo en línea!
Verifique todas las pruebas a la vez.
fuente
You can safely assume that there is always exactly one 'beef' on the bun. Your code is not required to support cases with more than one beef or no beef at all.
? Sin embargo, se puede resolver con modificadores no greedy si es necesario(.{12})*?(.)*?
.Scala, 90 bytes
Explicación:
(a -> b) andThen (b -> c)
da como resultado una(a -> c)
función, es como el reverso de componer, pero requiere menos anotaciones de tipo en scala. En este caso, toma una cadena de dígitos binarios como entrada y devuelve una tupla de índices basados en cero.fuente
J,
3129 bytesLa entrada está formateada como una matriz 2D de valores binarios, y la salida son las coordenadas basadas en cero como una matriz
[y, x]
.El aplanamiento y la conversión de base para encontrar el índice es algo que aprendí de este comentario de Dennis.
Uso
Explicación
fuente
Python 2,
989592 bytesLa entrada es una lista de cadenas, la salida es la cadena XY (índices basados en 1).
Pruébalo en Ideone .
fuente
Perl, 54 bytes
Código de 53 bytes + 1 para
-n
. Usos-E
sin costo adicional.Utiliza índices basados en 0. Espera de entrada como una cadena de
1
s y0
s y salidas separadas por espacios coordenadas.¡Gracias a @ wullxz y @ GabrielBenamy por ayudarme a ahorrar 9 bytes, y al comentario de @ Taemyr sobre mi respuesta de Retina por señalar un problema!
Uso
fuente
(.{8}1110){2}
lugar de.{8}1110.{8}1110
length$`
a$-[0]
\1
pero no tuve suerte, ¡no pensé en intentarlo{2}
! ¡Gracias!$-[0]
es el desplazamiento del inicio de la última coincidencia exitosa.$-[n]
Es el desplazamiento del inicio de la subcadena emparejado por el n-ésimo subpatrón, oundef
si el subpattern no coincidió". de: perldoc.perl.org/perlvar.html (buscar@-
)Scala, 318 bytes
Esta solución podría mejorarse aún más ... pero la mantuve legible y permití que la entrada fuera la matriz espaciada de varias líneas.
Solución real si matriz de cadena binaria
Muestra de Trabajo
fuente
Python, 137 bytes (según Linux (gracias ElPedro))
No es exactamente un bytecount competitivo, pero el algoritmo es un poco interesante. Toma la entrada como una cadena de valores binarios.
fuente
Ruby , 62 bytes
Espera una cadena de
0
y1
y devuelve una matriz de Y y X, basada en cero.Prueba con ideone .
fuente
F # - 260 bytes
Programa completo, incluido el designador EntryPoint requerido (así que cuente menos si lo desea, supongo).
Entrada: cada fila como cadena separada: "111001111110" "110100100000" "010001111101" "100100100100" "100101100111" "111111000010" "110111000001" "100111100001" "100111011111" "111110011111" "100001010111" "110011000011"
Código:
No es la solución más elegante, pero quería seguir con las cadenas, así es como lo hice. Casi conseguí que fuera una línea simple y más pequeña usando tuberías, pero hay algo con el bloque doble if que me estaba causando que no pude resolver. Entonces, bueno!
También pensé en portar la respuesta de Karl a F #, ya que es buena, y aún puedo hacerlo por diversión como otro enfoque, pero quería seguir con esta para ser diferente.
fuente
Dyalog APL,
2927 bytesToma una matriz binaria de 12x12 como entrada del usuario y devuelve las coordenadas en orden inverso, los índices comienzan en 1.
Gracias a @ Adám por guardar muchos bytes. -2 Bytes porque soy tonto y dejé todo en una función sin ninguna razón.
fuente
~2 8 12∊⍨4 4⍴⍳16
con15 7 15 9⊤⍨4/2
. Tenga en cuenta que0~⍨∊{⍵×⍳⍴⍵}
se puede reemplazar con la⍸
versión 16.0 (su código solo funciona en Dyalog APL).⍸
se está agregando desde v16, no he podido encontrar una lista de primitivas GNUAPL.Elemento , 130 bytes
Pruébalo en línea!
Toma la entrada como una cadena larga de 1s y 0s sin delimitadores. Salidas como
3 4
(indexación basada en 0).Esto funciona colocando los datos de entrada en una "matriz" (básicamente un diccionario con teclas enteras) y luego, para cada posible valor inicial, prueba los bits en desplazamientos particulares (los 16 en un proceso muy laborioso).
fuente