Este desafio foi inspirado no comercial deste Wendy de 1984.
Ilustração de TS Rogers
Sua tarefa é encontrar um 0xBEEF hexadecimal em um bun binário.
A 'carne' consiste no seguinte padrão:
1 0 1 1 (0xB)
1 1 1 0 (0xE)
1 1 1 0 (0xE)
1 1 1 1 (0xF)
E o 'bun' consiste em uma matriz binária 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
Seu programa ou função terá a matriz binária como entrada. O formato da matriz é muito flexível, mas deve ser claramente descrito em sua resposta.
Por exemplo:
uma única cadeia binária, com ou sem separadores entre as linhas:
"111001111110 110100100000..."
ou:
"111001111110110100100000..."
uma matriz de cadeias binárias:
["111001111110", "110100100000", ...]
uma matriz de números (cada número que descreve uma linha uma vez convertida novamente em binário e preenchida à esquerda com zeros):
[3710, 3360, ...]
Resultado
As coordenadas (X, Y)
da 'carne', (0, 0)
sendo o canto superior esquerdo do pão.
Como alternativa, você pode usar coordenadas com base em 1 (mas não uma mistura dos dois formatos, como com base em 0 para X e em 1 para Y).
Para o exemplo acima, a resposta esperada é (3, 4)
(com base em 0) ou (4, 5)
(com base em 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
Novamente, qualquer formato razoável funcionaria desde que especificado em sua resposta. Mencione também se você estiver usando coordenadas com base em 0 ou em 1.
Regras
- Você pode assumir com segurança que sempre há exatamente uma 'carne' no pão. Seu código não é necessário para suportar casos com mais de uma carne ou sem carne.
- O padrão de carne sempre aparecerá como descrito. Nunca será girado ou espelhado de forma alguma.
- Isso é código-golfe, então a resposta mais curta em bytes vence. As brechas padrão são proibidas.
Casos de teste
Nos seguintes casos de teste, cada linha da matriz é expressa como sua representação 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
(ou seja, ordem inversa)?Respostas:
Geléia ,
201716 bytesA entrada está na forma de uma matriz booleana, a saída é o par de índices com base em 1 (Y, X) .
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
ṡ4Z€Ḅw€“Ье‘ĖUṀ
ṡ€4ḄZjw“¿ÇÇБ’d24
indexação baseada em 0, mas infelizmente é um byte a mais.vim,
126807776Espera entrada no formulário
E saídas (com índices baseados em 1) como
Agradeço a Jörg Hülsermann por salvar indiretamente 46 bytes, fazendo-me perceber que meu regex era super burro, e a DJMcMayhem por mais 3 bytes.
fonte
Yp
é melhor queyyp
(mesmo sabendo que você se opõe aY
: P) 2) o espaço em brancoexec 'norm Go'
é desnecessário. E 3)kd{
é menor quekdgg
. (Ainda não testei isso)Y
porque eu tenho essa repercussão no meu vimrc. : P De fato, okdgg
equivalente era justd{
, o que, surpreendentemente, não exclui a linha atual.{
tornam um movimento de personagem; então eu tenho que fazer algo como, em{d''
vez disso, excluir linhas inteiras.JavaScript (ES6),
636056 bytesRecebe a entrada como uma sequência delimitada por espaço de 155 caracteres, com 12 sequências binárias de 12 dígitos, retorna valores indexados a zero. Editar: salvou 3 bytes graças a @ JörgHülsermann. Economizou 4 bytes graças a @ETHproductions.
fonte
s.search(r)
vez der.exec(s).index
?s=>[
para(s,i)=>[
, porque você precisa definir o i em algum lugar: /C,
146177173163 bytesAgradecimentos ao Numberknot por corrigir o código (deslocando as três linhas inferiores).
Salvando 4 bytes substituindo
>>=1
por/=2
em 4 lugares. Economizando mais 10 bytes ao permitirx
ey
ser global e padrão,int
graças ao MD XFUngolfed:
Retorna x, y (com base em 0) na mordidela alta e baixa de um byte.
Uso:
fonte
#define T(i,n)if((A[y+i]&15)==n)
e a seção seT(0,11)T(1,14)T(2,14)T(3,15)return
para salvar 6 bytes. Altere também a assinatura da funçãoint b(int*A)
para mais 4 bytes salvos.MATL ,
2221 bytesEntrada é uma matriz binária, com
;
como separador de linhas. A saída é uma baseada em ordem inversa:Y X
.Experimente online! Ou verifique todos os casos de teste com o formato de entrada decimal.
Explicação
O padrão é detectado usando convolução 2D. Por esta,
1, -1
vez de1, 0
. Como o padrão possui tamanho 4 × 4, sua ocorrência é detectada por uma entrada igual a16
na saída da convolução.Além disso, como a convolução introduz um deslocamento nos índices detectados, isso precisa ser corrigido na saída.
fonte
Mathematica, 62 bytes
Retorna todas as posições da matriz BEEF, indexadas em 1. A entrada deve ser uma matriz de dígitos binários. Os x e y na saída são alterados, no entanto.
fonte
x
ey
está sendo trocado.Deslizamento , 28 bytes
27 bytes de código, +1 para a
p
opção.Requer entrada como um retângulo multilinha de 1 e 0 sem espaços. Experimente aqui (com o terceiro caso de teste como entrada).
Explicação
Deslizamento é um idioma do desafio de correspondência de padrões 2-D . O Sp3000 poderia dizer muito mais sobre isso do que eu, mas basicamente é uma forma estendida de regex com alguns comandos direcionais que permitem combinar em duas dimensões. O código acima usa o comando "slip" de mesmo nome
\
, que não altera a direção do ponteiro de correspondência, mas o move lateralmente por um caractere. Ele também usa "grupo estacionário"(?|...)
, que corresponde a algo e redefine o ponteiro para o local anterior.O código é dividido da seguinte maneira:
Isso corresponde ao
0xBEEF
quadrado. Ap
opção gera as coordenadas da partida, indexadas em 0.fonte
1011>001>1(11>){3}1>1
1(11>){3}
.PHP, 87 bytes
string binária como entrada sem separadores, retorna valores indexados a zero.
matriz de números como entrada 128 bytes
14 bytes salvos por @Titus Thank You
fonte
,
vez de.
noecho
e você pode remover os parênteses. (-4)PREG_OFFSET_CAPTURE
: acrescentar,256
aospreg_match
parâmetros, retire^(.*)
do regex,$c[0][1]
em vez destrlen($c[1])
(-6)Java 7,
182177 bytesEu enviei Karl Napf C para JAVA e agradeço a Karl Napf por salvar 5 bytes, lembrando-me de Bit Magic. (Eu também tive essa ideia, mas a @KarlNapf retornou parte da idéia que não era minha).
(Com base em 0)
Ungolfed
fonte
a[y++]>>=1)
eif((a[y]&15)==
. Btw, conto 182 bytes em vez de 183? : S...a[y++]/=2)
eif((a[y]&15)==...
.Retina, 47 bytes
Eu gostaria de anteceder isso com um pedido de desculpas. Acho que isso é provavelmente terrível e um péssimo exemplo de como usar a linguagem, mas como usei um Regex para minha resposta em Perl, pensei em experimentar o Retina. Não sou muito bom. :( Os trechos no github me ajudaram bastante!
Obrigado a @ wullzx por seu comentário na minha resposta Perl por -3 bytes e a @ Taemyr por apontar um problema com meu método!
Espera a entrada como uma sequência binária separada por espaço e as saídas coordenam o espaço separado.
Experimente online!
Verifique todos os testes de uma só vez.
fonte
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.
? Pode ser resolvido com modificadores não agradáveis, se necessário(.{12})*?(.)*?
.Scala, 90 bytes
Explicação:
(a -> b) andThen (b -> c)
resulta em uma(a -> c)
função, é como o reverso da composição, mas requer menos anotações de tipo na escala. Nesse caso, ele recebe uma sequência de dígitos binários como entrada e retorna uma tupla de índices baseados em zero.fonte
J,
3129 bytesA entrada é formatada como uma matriz 2D de valores binários e a saída são as coordenadas baseadas em zero como uma matriz
[y, x]
.A conversão de achatamento e base para encontrar o índice é algo que aprendi com este comentário de Dennis.
Uso
Explicação
fonte
Python 2,
989592 bytesEntrada é uma lista de cadeias, saída é a cadeia XY (índices baseados em 1).
Teste em Ideone .
fonte
Perl, 54 bytes
Código de 53 bytes + 1 para
-n
. Usa-E
sem custo extra.Usa índices baseados em 0. Espera de entrada como uma série de
1
s e0
s e saídas separadas por espaço co-ordenadas.Agradeço a @ wullxz e @ GabrielBenamy por me ajudarem a salvar 9 bytes, e ao comentário de @ Taemyr na minha resposta Retina por apontar um problema!
Uso
fonte
(.{8}1110){2}
em vez de.{8}1110.{8}1110
length$`
para #$-[0]
\1
mas não tive sorte, não pensei em tentar{2}
! Obrigado!$-[0]
é o deslocamento do início da última correspondência bem-sucedida.$-[n]
É o deslocamento do início da substring correspondida pelo n-ésimo subpadrão ouundef
se o subpadrão não correspondeu." de: perldoc.perl.org/perlvar.html (procure@-
)Scala, 318 bytes
Essa solução poderia ser melhorada ainda mais ... mas eu a mantive legível e permiti que a entrada fosse a matriz espaçada de várias linhas.
Solução real se matriz de seqüência de caracteres binária
Trabalho da amostra
fonte
Python, 137 bytes (de acordo com o Linux (obrigado ElPedro))
Não é exatamente um número competitivo, mas o algoritmo é um pouco interessante. Recebe entrada como uma sequência de valores binários.
fonte
Ruby , 62 bytes
Ele espera uma sequência de
0
e1
retorna uma matriz de Y e X, com base em zero.Tente ideone .
fonte
F # - 260 bytes
Programa completo, incluindo o designador EntryPoint necessário (portanto, conte menos se desejar).
Entrada: cada linha como seqüência de caracteres separada: "111001111110" "110100100000" "010001111101" "100100100100" "100101100111" "111111000010" "110111000001" "100111100001" "100111011111" "111110011111" "100001010111" "11001111111" "100001010111" "11001111111" "11001111111" "
Código:
Provavelmente não é a solução mais elegante, mas eu queria continuar com as strings, então foi assim que fiz. Eu quase consegui ser uma linha única e menor usando tubos, mas há algo com o bloco duplo se que estava me pegando que eu não conseguia resolver. Então, tudo bem!
Pensei muito em incluir a resposta de Karl no F #, pois ela é boa, e ainda posso fazer isso por diversão como outra abordagem, mas queria continuar com essa para ser diferente.
fonte
Dyalog APL,
2927 bytesPega um array binário de 12x12 como entrada do usuário e retorna as coordenadas na ordem inversa; os índices começam em 1.
Obrigado a @ Adám por salvar muitos bytes. -2 bytes porque sou burro e deixei tudo em uma função sem motivo.
fonte
~2 8 12∊⍨4 4⍴⍳16
por15 7 15 9⊤⍨4/2
. Observe que0~⍨∊{⍵×⍳⍴⍵}
pode ser substituído⍸
pela versão 16.0 (seu código funciona apenas no Dyalog APL).⍸
está sendo adicionado da v16, não consegui encontrar uma lista de primitivas do GNUAPL.Elemento , 130 bytes
Experimente online!
Recebe a entrada como uma sequência longa de 1s e 0s sem nenhum delimitador. Saídas como
3 4
(indexação baseada em 0).Isso funciona colocando os dados de entrada em uma "matriz" (basicamente um dicionário com chaves inteiras) e, em seguida, para cada valor inicial possível, testa os bits com desvios específicos (todos os 16 em um processo muito trabalhoso).
fonte