Gdzie jest 0xBEEF?


92

Wyzwanie to zostało zainspirowane reklamą Wendy z 1984 roku.

Gdzie jest wołowina?

Ilustracja TS Rogers

Twoim zadaniem jest znalezienie szesnastkowej 0xBEEF na binarnej bułce.

„Wołowina” składa się z następującego wzoru:

1 0 1 1  (0xB)
1 1 1 0  (0xE)
1 1 1 0  (0xE)
1 1 1 1  (0xF)

A „bun” składa się z macierzy binarnej 12x12, takiej jak:

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

Wejście

Twój program lub funkcja pobierze macierz binarną jako dane wejściowe. Format macierzy jest bardzo elastyczny, ale musi być jasno opisany w odpowiedzi.

Na przykład:

  • pojedynczy ciąg binarny, z separatorami między wierszami lub bez:

    "111001111110 110100100000..."

    lub:

    "111001111110110100100000..."

  • tablica ciągów binarnych:

    ["111001111110", "110100100000", ...]

  • tablica liczb (każda liczba opisująca wiersz raz przekonwertowany z powrotem na binarny i dopełniony zerami):

    [3710, 3360, ...]

Wynik

Współrzędne (X, Y)„wołowiny”, (0, 0)która jest lewym górnym rogiem bułki.

Alternatywnie możesz użyć współrzędnych opartych na 1 (ale nie mieszanki obu formatów, takich jak 0 dla X i 1 dla Y).

W powyższym przykładzie oczekiwana odpowiedź to (3, 4)(na podstawie 0) lub (4, 5)(na podstawie 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

Ponownie, każdy rozsądny format działałby, o ile jest określony w odpowiedzi. Proszę również wspomnieć, jeśli używasz współrzędnych 0 lub 1.

Zasady

  • Możesz bezpiecznie założyć, że na bułce zawsze znajduje się dokładnie jedna „wołowina”. Twój kod nie jest wymagany do obsługi przypadków z więcej niż jedną wołowiną lub bez wołowiny.
  • Wzór wołowiny zawsze będzie wyglądał jak opisano. Nigdy nie zostanie w żaden sposób obrócony ani dublowany.
  • To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach. Standardowe luki są zabronione.

Przypadki testowe

W poniższych przypadkach testowych każdy wiersz macierzy jest wyrażony jako reprezentacja dziesiętna.

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 ]

Czy dozwolone jest używanie indeksów opartych na 1 (gdzie jest lewy górny róg (1,1))?
Klamka

@Doorknob Tak, jeśli jest to ten sam format dla X i Y (pytanie odpowiednio zaktualizowane).
Arnauld,

35
Punkty bonusowe, jeśli również wyprowadzamy dane wyjściowe, 0xBEEF to 0xDEAD? : P
TuxCrafting

10
To wyzwanie jest naprawdę losowe i trochę głupie. Ale wciąż jest to całkiem spore wyzwanie. +1
DJMcMayhem

Mogę wyjście y, x(czyli w odwrotnej kolejności)?
Luis Mendo

Odpowiedzi:


30

Galaretka , 20 17 16 bajtów

ṡ€4ḄZw€“¿ÇÇБĖUṀ

Dane wejściowe mają postać macierzy boolowskiej, dane wyjściowe to para indeksów oparta na 1 (Y, X) .

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

ṡ€4ḄZw€“¿ÇÇБĖUṀ  Main link. Argument: M (2D array of Booleans)

ṡ€4               Split each row into 9 chunks of length 4.
   Ḅ              Convert these chunks from base 2 to integer.
    Z             Zip/transpose. This places the columns of generated integers
                  into the rows of the matrix to comb through them.
       “¿ÇÇБ     Push the array of code points (in Jelly's code page) of these
                  characters, i.e., 0xB, 0xE, 0xE, and 0xF.
     w€           Window-index each; in each row, find the index of the contiguous
                  subarray [0xB, 0xE, 0xE, 0xF] (0 if not found).
                  Since the matrix contains on one BEEF, this will yield an array
                  of zeroes, with a single non-zero Y at index X.
             Ė    Enumerate; prefix each integer with its index.
              U   Upend; reverse the pairs to brings the zeroes to the beginning.
               Ṁ  Take the maximum. This yields the only element with positive
                  first coordinate, i.e., the pair [Y, X].

14
Nie rozumiem ... jak możesz kodować coś, co nie jest czytelne dla człowieka?
L3n

12
Galaretka jest zdecydowanie łatwiejsza do pisania niż do czytania. : P
Dennis,

45
@ l3n wydajesz się sugerować, że Dennis jest człowiekiem. Chociaż jest to możliwe, biorąc pod uwagę tego rodzaju sztuczki, które rutynowo się pojawiają, nie odrzucam innych ... powiedzmy, więcej alternatyw cyberpunk ;-)
Francesco

1
Możesz wypisać (x, y) za pomocąṡ4Z€Ḅw€“Ье‘ĖUṀ
Jonathan Allan

2
@JonathanAllan Nice. Istnieje również ṡ€4ḄZjw“¿ÇÇБ’d24indeksowanie oparte na 0, ale niestety jest on o jeden bajt dłuższy.
Dennis

40

vim, 126 80 77 76

/\v1011\_.{9}(1110\_.{9}){2}1111<cr>:exe'norm Go'.join(getpos('.'))<cr>xxdawhPXXd{

Oczekuje danych wejściowych w formularzu

111001111110
110100100000
010001111101
100100100100
100101100111
111111000010
110111000001
100111100001
100111011111
111110011111
100001010111
110011000011

I wyniki (z indeksami opartymi na 1) jak

4 5
/                      regex search for...
\v                     enable "very magic" mode (less escaping)
1011\_.{9}             find the first line ("B"), followed by 8 chars + 1 \n
(1110\_.{9}){2}        find the second and third lines ("EE")
1111<cr>               find the fourth line ("F")
:exe'norm Go'.         insert at the beginning of the file...
join(getpos('.'))<cr>  the current position of the cursor
xxdawhPXX              do some finagling to put the numbers in the right order
d{                     delete the input

Dzięki Jörgowi Hülsermannowi za pośrednie zaoszczędzenie 46 bajtów, dzięki czemu zdałem sobie sprawę, że mój regex jest super głupi, a DJMcMayhem za 3 kolejne bajty.


1
Kilka wskazówek: 1) Ypjest lepsze niż yyp(choć wiem, że sprzeciwisz się Y: P) 2) białe znaki w exec 'norm Go'są niepotrzebne. I 3) kd{jest krótszy niż kdgg. (Nie testowałem tego jednak)
DJMcMayhem

1
@DJMcMayhem O, zawsze o tym zapominam, Yponieważ mam odbicie w moim vimrc. : P W rzeczywistości kdggbył to odpowiednik just d{, który, co zaskakujące, nie usuwa bieżącej linii.
Klamka

Interesujące. Jak wygodnie!
DJMcMayhem

Zawsze jestem zdezorientowany, gdy rzeczy takie jak {ruch postaci; więc zrobiłem coś takiego, {d''aby usunąć całe linie.
Neil

1
Możesz użyć echa zamiast drukowania do bufora, nie sądzę, żeby coś przeszkadzało w wyzwaniu. Ogoliłoby to około 10 bajtów.
Christian Rondeau,

22

JavaScript (ES6), 63 60 56 bajtów

s=>[(i=s.search(/1011.{9}(1110.{9}){2}1111/))%13,i/13|0]

Pobiera dane wejściowe jako 155-znakowy ciąg rozdzielany spacjami 12 12-cyfrowych ciągów binarnych, zwraca wartości o indeksie zerowym. Edycja: Zapisano 3 bajty dzięki @ JörgHülsermann. Zaoszczędź 4 bajty dzięki @ETHproductions.


Czy możesz użyć s.search(r)zamiast r.exec(s).index?
ETHproductions

1
@ETHproductions Oczywiście, że mogę. Wczoraj musiałem prawie spać ...
Neil,

Dla mnie, używanie nodejs do wykonywania, nie działa, chyba że zmienię s=>[na (s,i)=>[, ponieważ musisz zdefiniować gdzieś: /
Mijago,

@Mijago Odd, zadziałało w Node 4, kiedy go wypróbowałem (zwykle używam powłoki Spidermonkey JS). Pamiętaj, że literówka wkradła się do kodu, więc coś dobrego z tego wynikło!
Neil,

Myślę, że to się nie udaje dla 00001011001011001110001110001110001110001111001111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Taemyr

14

C, 146 177 173 163 bajtów

Dzięki Numberknot za poprawienie kodu (przesunięcie dolnych trzech rzędów).

Zapisywanie 4 bajty zastępując >>=1ze /=2w 4 miejscach. Oszczędność 10 dodatkowych bajtów, pozwalając xi ybyć globalnym i domyślnym intdzięki MD XF

#define T(i,n)(A[y+i]&15)==n
x,y;b(int A[12]){for(x=9;x--;){for(y=0;++y<9;A[y]/=2)if(T(0,11)&&T(1,14)&&T(2,14)&&T(3,15))return(x<<4)+y;A[9]/=2;A[10]/=2;A[11]/=2;}}

Nie golfowany:

int b(int A[12]) {
 for (int x=8; x>=0; --x) {
  for (int y=0; y<9; ++y) {
   if ((A[y]&15)==11 && (A[y+1]&15)==14 && (A[y+2]&15)==14 && (A[y+3]&15)==15) { 
    return (x<<4) + y; 
   }
   A[y]/=2;
  }
  A[9]/=2; A[10]/=2; A[11]/=2;
 }
}

Zwraca x, y (na podstawie 0) w górnej i dolnej części bajtu.

Stosowanie:

int temp=b(array_to_solve);
int x=temp>>4;
int y=temp&15;
printf("%d %d\n",x,y);

1
możesz zmienić definicję #define T(i,n)if((A[y+i]&15)==n)i sekcję if, T(0,11)T(1,14)T(2,14)T(3,15)returnaby zapisać 6 bajtów. Zmień także podpis funkcji int b(int*A)na 4 kolejne zapisane bajty.
Lince Assassino,


9

MATL , 22 21 bajtów

Eq[ODDH]B~EqZ+16=&fhq

Dane wejściowe to macierz binarna z ;separatorem wierszy. Wyjście 1 jest oparte w odwrotnej kolejności: Y X.

Wypróbuj online! Lub zweryfikuj wszystkie przypadki testowe z dziesiętnym formatem wejściowym.

Wyjaśnienie

Wzór jest wykrywany za pomocą splotu 2D. Dla tego,

  • Matryca i wzór muszą być w formie bipolarnej, czyli 1, -1zamiast 1, 0. Ponieważ wzorzec ma rozmiar 4 × 4, jego występowanie jest wykrywane przez wpis równy 16wyjściu splotu.
  • Jądro splotu należy zdefiniować jako poszukiwany wzorzec odwrócony w obu wymiarach.

Ponadto, ponieważ splot wprowadza przesunięcie w wykrytych indeksach, należy to poprawić w danych wyjściowych.

Eq      % Implicitly input binary matrix. Convert to bipolar form (0 becomes -1)
[ODDH]  % Push array [0 8 8 2]
B       % Convert to binary. Each number gives a row
~Eq     % Negate and convert to bipolar. Gives [1 1 1 1; 0 1 1 1; 0 1 1 1; 1 1 0 1]
        % This is the "BEEF" pattern reversed in the two dimensions. Reversal is
        % needed because a convolution will be used to detect that patter
Z+      % 2D convolution, keeping original size
16=&f   % Find row and column indices of 16 in the above matrix
h       % Concatenate horizontally
q       % Subtract 1. Implicitly display

8

Mathematica, 62 bajty

BlockMap[Fold[#+##&,Join@@#]==48879&,#,{4,4},1]~Position~True&

Zwraca wszystkie pozycje macierzy BEEF, 1-indeksowane. Dane wejściowe muszą być macierzą cyfr binarnych. X i y na wyjściu są jednak przełączane.


Bez obaw xi zmiany y.
Arnauld

7

Poślizg , 28 bajtów

27 bajtów kodu, +1 dla popcji.

(?|1011)(\(?|1110)){2}\1111

Wymaga wprowadzenia w postaci wielowierszowego prostokąta 1 i 0 bez spacji. Wypróbuj tutaj (z trzecią próbą jako wejściem).

Wyjaśnienie

Slip to język z wyzwania 2-D Pattern Matching . Sp3000 może powiedzieć o wiele więcej niż ja, ale w zasadzie jest to rozszerzona forma wyrażenia regularnego z kilkoma poleceniami kierunkowymi, które pozwalają dopasować w dwóch wymiarach. Powyższy kod używa tytułowego polecenia „poślizgu” \, które nie zmienia kierunku wskaźnika dopasowania, ale przesuwa go w bok o jeden znak. Używa również „grupy stacjonarnej” (?|...), która coś pasuje, a następnie resetuje wskaźnik do poprzedniej lokalizacji.

Kod dzieli się w następujący sposób:

(?|1011)                     Match 1011; reset pointer to beginning of match
        (         ){2}       Do the following twice:
         \                     Slip (moves pointer down one row)
          (?|1110)             Match 1110; reset pointer to beginning of match
                      \1111  Slip and match 1111

To pasuje do 0xBEEFkwadratu. Ta popcja wyświetla współrzędne dopasowania, indeksowane 0.


1
Fajnie :) Dziwnie, dla wzorów blokowych czasami golfista po prostu chodzi po spirali:1011>001>1(11>){3}1>1
Sp3000 24.10.16

@ Sp3000 Ha! Spirala była najkrótszą metodą w SnakeEx, ale nie pomyślałem o wypróbowaniu jej w Slipie. Naprawdę fajna sztuczka z 1(11>){3}.
DLosc

7

PHP, 87 bajtów

ciąg binarny jako dane wejściowe bez separatorów zwraca wartości indeksowane od zera.

preg_match("#1011(.{8}1110){2}.{8}1111#",$argv[1],$c,256);echo($s=$c[0][1])%12,$s/12^0;

tablica liczb jako wejściowe 128 bajtów

<?foreach($_GET[a]as$a)$b.=sprintf("%012b",$a);preg_match("#1011(.{8}1110){2}.{8}1111#",$b,$c,256);echo($s=$c[0][1])%12,$s/12^0;

14 bajtów zapisanych przez @Titus Dziękujemy


Użyj ,zamiast .w echoi możesz usunąć nawiasy. (-4)
Tytus

W komentarzach Arnauld pozwala na wyjście bez ogranicznika. (-4)
Tytus

Użyj flagi PREG_OFFSET_CAPTURE: dołącz ,256do preg_matchparametrów, usuń ^(.*)z wyrażenia regularnego, $c[0][1]zamiast strlen($c[1])(-6)
Tytus

@Titus nice and done
Jörg Hülsermann

5

Java 7,182 177 bajtów

Przesłałem odpowiedź Karla Napfa C do JAVA I dzięki Karlowi Napfowi za zaoszczędzenie 5 bajtów, przypominając mi trochę Magii. (Btw, ja też wpadłem na ten pomysł, ale pomysł zwrotu części @KarlNapf nie był mój). Przepraszam, jeśli ci się nie podobało.

(0-oparty)

int f(int[]a){int x=9,y,z=0;for(;x-->0;){for(y=0;y<9;a[y++]/=2) if((a[y]&15)==11&(a[y+1]&15)==14&(a[y+2]&15)==14&(a[y+3]&15)==15)z=(x<<4)+y;a[y]/=2;a[10]/=2;a[11]/=2;}return z;}

Nie golfił

class Beef {

    public static void main(String[] args) {
        int x = f(new int[] { 1222, 3107, 1508, 3997, 1906, 379, 2874, 2926, 1480, 1487, 3565, 633 });
        System.out.println(x >> 4);
        System.out.println(x & 15);
    }

    static int f(int[] a) {
        int x = 9,
            y,
            z = 0;

        for (; x-- > 0; ) {
            for (y = 0; y < 9; a[y++] /= 2)
                if ((a[y] & 15) == 11 
                  & (a[y + 1] & 15) == 14
                  & (a[y + 2] & 15) == 14 
                  & (a[y + 3] & 15) == 15)
                    z = (x << 4) + y;

            a[y] /= 2;
            a[10] /= 2;
            a[11] /= 2;
        }
        return z;
    }

}

2
Jakie są te cztery przestrzenie pomiędzy a[y++]>>=1)i if((a[y]&15)==. Przy okazji, liczę 182 bajty zamiast 183? : S
Kevin Cruijssen

@KevinCruijssen naprawiony.
Numberknot

1
Wszystko w porządku ;-)
Karl Napf

1
Nadal możesz usunąć odstęp między ...a[y++]/=2)i if((a[y]&15)==....
Kevin Cruijssen

5

Siatkówka, 47 bajtów

Chciałbym to przeprosić. Myślę, że to prawdopodobnie okropny i zły przykład używania tego języka, ale ponieważ użyłem Regexu do mojej odpowiedzi w Perlu, pomyślałem, że spróbuję Retina. Nie jestem za dobry. :( Fragmenty na githubie bardzo mi pomogły!

Dzięki @ wullzx za jego komentarz do mojej odpowiedzi w Perlu na -3 bajty oraz @ Taemyr za wskazanie problemu z moją metodą!

Oczekuje, że dane wejściowe są rozdzielone spacjami ciągiem binarnym, a dane wyjściowe koordynują rozdzielone spacjami.

(.{13})*(.)*1011(.{9}1110){2}.{9}1111.*
$#2 $#1

Wypróbuj online!

Sprawdź wszystkie testy jednocześnie.


1
(.) Nie dla '000010110010110011100011100011100011100011110011110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' Twoje * musi być {0,8} (.)
Taemyr

Czy temu przeciwdziałają 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.? W razie potrzeby można to rozwiązać za pomocą modyfikatorów bezresekcyjnych (.{12})*?(.)*?.
Dom Hastings

1
Spójrz jeszcze raz, w tym wejściu jest tylko jedna wołowina - i nie jest to punkt, w którym wskazuje twój program. Problem nie zostałby rozwiązany za pomocą chętnych modyfikatorów, ponieważ mogę zamienić sztuczną wołowinę na prawdziwą wołowinę. problem polega na tym, że wyrażenie regularne pasuje do „wołowiny”, która zaczyna się mniej niż 4 bity od końca wiersza macierzy.
Taemyr

Możesz również rozwiązać ten problem, zmieniając {8} na {9} i prosząc o oddzielenie wierszy na wejściu, aby zerować koszt bajtu.
Taemyr

@Taemyr Ahhh! Widzę! Źle zrozumiałem twój punkt ... Naprawdę masz rację. Moje rozwiązanie Perla również potencjalnie nie spełnia tego warunku. Dostanie to zmienione jak najszybciej. Dziękujemy za komentarze i sugestie!
Dom Hastings

4

Scala, 90 bajtów

("1011.{8}(1110.{8}){2}1111".r.findAllMatchIn(_:String).next.start)andThen(i=>(i/12,i%12))

Wyjaśnienie:

(
  "1011.{8}(1110.{8}){2}1111" //The regex we're using to find the beef
  .r                          //as a regex object
  .findAllMatchIn(_:String)   //find all the matches in the argument thats going to be passed here
  .next                       //get the first one
  .start                      //get its start index
)                             //this is a (String -> Int) function
andThen                       //
(i=>                          //with the found index
  (i/12,i%12)                 //convert it to 2d values
)                             

(a -> b) andThen (b -> c)daje w wyniku (a -> c)funkcję, jest jak odwrotność komponowania, ale wymaga mniej adnotacji typu w scala. W takim przypadku pobiera ciąg cyfr binarnych jako dane wejściowe i zwraca krotkę indeksów zerowych.


4

J, 31 29 bajtów

[:($#:I.@,)48879=4 4#.@,;._3]

Dane wejściowe są sformatowane jako tablica 2d wartości binarnych, a dane wyjściowe to współrzędne zerowe jako tablica [y, x].

Spłaszczania i konwersji bazy w celu znalezienia indeksu nauczyłem się z tego komentarza Dennisa.

Stosowanie

   f =: [:($#:I.@,)48879=4 4#.@,;._3]
   ] m =: _12 ]\ 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
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
   f m
4 3
   f (#:~2#~#) 3710 3360 1149 2340 2407 4034 3521 2529 2527 3999 2135 3267
4 3
   f (#:~2#~#) 1222 3107 1508 3997 1906 379 2874 2926 1480 1487 3565 633
7 3
   f (#:~2#~#) 2796 206 148 763 429 1274 2170 2495 42 1646 363 1145
4 6
   f (#:~2#~#) 3486 3502 1882 1886 2003 1442 2383 2808 1416 1923 2613 519
1 1
   f (#:~2#~#) 3661 2382 2208 1583 1865 3969 2864 3074 475 2382 1838 127
8 8
   f (#:~2#~#) 361 1275 3304 2878 3733 3833 3971 3405 2886 448 3101 22
3 0
   f (#:~2#~#) 3674 2852 1571 3582 1402 3331 1741 2678 2076 2685 734 261
7 7

Wyjaśnienie

[:($#:I.@,)48879=4 4#.@,;._3]  Input: 2d array M
                            ]  Identity. Get M
                 4 4    ;._3   For each 4x4 subarray of M
                       ,         Flatten it
                    #.@          Convert it to decimal from binary
           48879=              Test if equal to 48879 (decimal value of beef)
[:(       )                    Operate on the resulting array
         ,                       Flatten it
      I.@                        Find the indices where true
    #:                           Convert from decimal to radix based on
   $                               The shape of that array
                               Returns the result as coordinates [y, x]

4

Python 2, 98 95 92 bajtów

lambda x:'%x'%(`[''.join('%x'%int(s[i:i+4],2)for s in x)for i in range(9)]`.find('beef')+15)

Dane wejściowe to lista ciągów, dane wyjściowe to ciąg XY (indeksy 1).

Przetestuj na Ideone .


Czy to może omyłkowo znaleźć „wołowinę” po drugiej stronie granicy, w której dwie linie są połączone?
xnor

Tak, tak myślę. Cofnę edycję, dopóki nie będę mógł jej poprawnie przetestować.
Dennis

2
Tak dzieje się, gdy używasz toroidalnej bułki.
mbomb007

4

Perl, 54 bajty

53 bajtowy kod + 1 dla -n . Używa -Ebez dodatkowych kosztów.

Wykorzystuje wskaźniki oparte na 0. Oczekuje danych wejściowych w postaci ciągu1 s i 0s, a współrzędne są oddzielone spacjami.

Dzięki @ wullxz i @ GabrielBenamy za pomoc w oszczędzaniu 9 bajtów oraz @ Taemyr komentarzowi do mojej odpowiedzi Retina za wskazanie problemu!

/1011.{9}(1110.{9}){2}1111/;say$-[0]%13,$",$-[0]/13|0

Stosowanie

perl -nE '/1011.{9}(1110.{9}){2}1111/;say$-[0]%13,$",$-[0]/13|0' <<< '111001111110 110100100000 010001111101 100100100100 100101100111 111111000010 110111000001 100111100001 100111011111 111110011111 100001010111 110011000011
010011000110 110000100011 010111100100 111110011101 011101110010 000101111011 101100111010 101101101110 010111001000 010111001111 110111101101 001001111001
101011101100 000011001110 000010010100 001011111011 000110101101 010011111010 100001111010 100110111111 000000101010 011001101110 000101101011 010001111001
110110011110 110110101110 011101011010 011101011110 011111010011 010110100010 100101001111 101011111000 010110001000 011110000011 101000110101 001000000111
111001001101 100101001110 100010100000 011000101111 011101001001 111110000001 101100110000 110000000010 000111011011 100101001110 011100101110 000001111111
000101101001 010011111011 110011101000 101100111110 111010010101 111011111001 111110000011 110101001101 101101000110 000111000000 110000011101 000000010110
111001011010 101100100100 011000100011 110111111110 010101111010 110100000011 011011001101 101001110110 100000011100 101001111101 001011011110 000100000101'
3 4
3 7
6 4
1 1
8 8
0 3
7 7

1
Możesz zapisać 3 znaki, łącząc wyrażenie regularne dla binarnego EE: (.{8}1110){2}zamiast.{8}1110.{8}1110
wullxz 24.10.16

1
Możesz także zapisać kolejne 3 bajty, zmieniając length$`na$-[0]
Gabriel Benamy

@wullxz Oczywiście! Próbowałem, \1ale nie miałem szczęścia, nie pomyślałem, aby spróbować {2}! Dzięki!
Dom Hastings,

@GabrielBenamy Amazing, dziękuję bardzo! Zaktualizowano!
Dom Hastings,

2
@ Użytkownik112638726 „ $-[0]to przesunięcie początku ostatniego pomyślnego dopasowania. $-[n]To przesunięcie początku podciągu dopasowanego przez n-ty subpattern lub undefjeśli subpattern nie pasuje”. from: perldoc.perl.org/perlvar.html (poszukaj @-)
Dom Hastings,

1

Scala, 318 bajtów

To rozwiązanie można jeszcze ulepszyć ... ale zachowałem jego czytelność i pozwoliłem, aby dane wejściowe były matrycą o wielu liniach.

Rzeczywiste rozwiązanie, jeśli tablica ciągu binarnego

def has(s: String, t: String): Int = s.indexOf(t)
val beef = List("1011", "1110", "1110", "1111")
l.zipWithIndex.map{case(e,i)=>l.drop(i).take(4)}.map{_.zip(beef)}.map{_.collect{case e=>has(e._1,e._2)}}.zipWithIndex.filterNot{e => e._1.contains(-1) ||  e._1.distinct.length > 1}.map{e=>s"(${e._1.head},${e._2})"}.head

Przykładowa praca

val bun = 
"""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
""".replaceAll(" ","")
def has(s: String, t: String): Int = s.indexOf(t)
val beef = List("1011", "1110", "1110", "1111")
val l = bun.split("\n").toList
l.zipWithIndex.map{case(e,i)=>l.drop(i).take(4)}
.map{_.zip(beef)}
.map{_.collect{case e=>has(e._1,e._2)}}.zipWithIndex
.filterNot{e => e._1.contains(-1) ||  e._1.distinct.length > 1}
.map{e=>s"(${e._1.head},${e._2})"}.head

1

Python, 137 bajtów (według Linuksa (dzięki ElPedro))

def f(s,q=0):import re
 i=s.index(re.findall('1011.{8}1110.{8}1110.{8}1111',s)[q])+1
 x=i%12
 y=(i-x)/12
 if x>8:x,y=f(s,q+1)
 return x,y

Nie do końca konkurencyjna bajt, ale algorytm jest nieco interesujący. Pobiera dane wejściowe jako ciąg wartości binarnych.


Jeśli pozwiesz pojedyncze spacje zamiast 4 i sprawdzisz w Linuksie, będzie to 137
ElPedro

1
Myślę, że potrzebujesz importu nowego wiersza i spacji przed importem (otrzymuję IndentError w Pythonie 2 bez niego), który kosztuje 2 bajty, ale możesz wtedy wstawić i = ..., x = ... i y = ... ta sama linia i oddzielna; stracić 1 bajt za 136
ElPedro

@elpedro Używam Python 3, i import jest w tej samej linii.
penalosa

W pełni zrozumiany :)
ElPedro

Jezu, po prostu ponownie przeczytaj moje komentarze, a dziś robię tyle literówek. Dobrze, że nie próbuję pisać żadnego kodu ...
ElPedro


1

F # - 260 bajtów

Pełny program, w tym wymagany oznacznik EntryPoint (więc licz mniej, jeśli tak przypuszczam).

Dane wejściowe: każdy wiersz jako osobny ciąg: „111001111110” „110100100000” „010001111101” „100100100100” „100101100111” „111111000010” „110111000001” „100111100001” „100111011111” „111110011111” „100001010111” „110011000011”

Kod:

[<EntryPoint>]
let main a=
 let rec f r:int=
  let b=a.[r].IndexOf"1011"
  if(b>0)then if(a.[r+1].[b..b+3].Equals"1110"&&a.[r+2].[b..b+3].Equals"1110"&&a.[r+3].[b..b+3].Equals"1111")then r else f(r+1)
  else f(r+1)
 printfn"%d%d"(a.[f 0].IndexOf"1011")(f 0);0

Nie jest to najbardziej eleganckie rozwiązanie, ale chciałem zachować ciągi, więc tak to zrobiłem. Prawie udało mi się, żeby była to pojedyncza linia i mniejsza za pomocą rur, ale jest coś z podwójnym blokiem, który sprawił, że nie mogłem rozwiązać. No cóż!

Myślałem też o przeniesieniu odpowiedzi Karla do F #, ponieważ jest to dobra i nadal mogę to robić dla zabawy jako inne podejście, ale chciałem pozostać przy tym, aby było inaczej.


1

Dyalog APL, 29 27 bajtów

Bierze tablicę binarną 12x12 jako dane wejściowe użytkownika i zwraca współrzędne w odwrotnej kolejności, indeksy zaczynają się od 1.

Dzięki @ Adám za uratowanie wielu bajtów. -2 bajty, bo jestem głupi i zostawiłem wszystko w funkcji bez powodu.

0~⍨∊{⍵×⍳⍴⍵}⎕⍷⍨~0 8 0 6⊤⍨4/2

Save 2, zastępując ~2 8 12∊⍨4 4⍴⍳16z 15 7 15 9⊤⍨4/2. Pamiętaj, że 0~⍨∊{⍵×⍳⍴⍵}można go zastąpić wersją 16.0 (kod działa tylko w APL Dyalog).
Adám

Tak, Dyalog ma znaki, które różnią się od GNU. A może to coś innego?
Zacharý

Cóż, jest dodawany z wersji 16, nie mogłem znaleźć listy operacji podstawowych GNUAPL.
Adám

Mam uruchomiony GNU APL, to głównie różnice między kodami.
Zacharý

Z tego co zauważyłem.
Zacharý

0

Element , 130 bajtów

_144'{)"1-+2:';}144'["1-+19:~?1+~?!2+~?3+~?12+~?13+~?14+~?15+~?!24+~?25+~?26+~?27+~?!36+~?37+~?38+~?39+~?16'[&][12%2:`\ `-+12/`]']

Wypróbuj online!

Pobiera dane wejściowe jako jeden długi ciąg 1 i 0 bez żadnych ograniczników. Wyjścia takie jak 3 4(indeksowanie 0).

Działa to poprzez umieszczenie danych wejściowych w „tablicy” (w zasadzie słownika z kluczami liczb całkowitych), a następnie dla każdej możliwej wartości początkowej testuje bity przy określonych przesunięciach (wszystkie 16 w bardzo pracochłonnym procesie).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.