Di mana 0xBEEF?


92

Tantangan ini terinspirasi oleh iklan Wendy ini dari tahun 1984.

Dimana daging sapinya?

Ilustrasi oleh TS Rogers

Tugas Anda adalah menemukan 0xBEEF heksadesimal pada roti biner.

'Daging sapi' terdiri dari pola berikut:

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

Dan 'roti' terdiri dari matriks biner 12x12, seperti:

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

Memasukkan

Program atau fungsi Anda akan menggunakan matriks biner sebagai input. Format matriks sangat fleksibel, tetapi harus dijelaskan dengan jelas dalam jawaban Anda.

Misalnya:

  • string biner tunggal, dengan atau tanpa pemisah di antara baris:

    "111001111110 110100100000..."

    atau:

    "111001111110110100100000..."

  • array string biner:

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

  • array angka (setiap angka yang menggambarkan satu baris setelah dikonversi kembali ke biner dan diisi dengan nol):

    [3710, 3360, ...]

Keluaran

Koordinat (X, Y)'daging sapi', (0, 0)menjadi sudut kiri atas roti.

Atau, Anda dapat menggunakan koordinat berbasis 1 (tetapi bukan campuran dari kedua format, seperti berbasis 0 untuk X dan berbasis 1 untuk Y).

Untuk contoh di atas, jawaban yang diharapkan adalah (3, 4)(berbasis 0) atau (4, 5)(berbasis 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

Sekali lagi, format apa pun yang masuk akal akan berfungsi selama itu ditentukan dalam jawaban Anda. Harap sebutkan juga jika Anda menggunakan koordinat berbasis 0 atau 1.

Aturan

  • Anda dapat dengan aman berasumsi bahwa selalu ada persis satu 'daging sapi' pada roti. Kode Anda tidak diperlukan untuk mendukung kasus dengan lebih dari satu daging sapi atau tanpa daging sapi sama sekali.
  • Pola daging sapi akan selalu muncul seperti yang dijelaskan. Itu tidak akan pernah diputar atau dicerminkan dengan cara apa pun.
  • Ini adalah kode-golf, jadi jawaban tersingkat dalam byte menang. Celah standar dilarang.

Uji kasus

Dalam kasus uji berikut, setiap baris matriks dinyatakan sebagai representasi desimalnya.

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 ]

Apakah menggunakan indeks berbasis 1 diperbolehkan (di mana kiri atas (1,1))?
Gagang Pintu

@ Doorknob Ya, jika itu format yang sama untuk X dan Y (pertanyaan diperbarui sesuai).
Arnauld

35
Poin bonus jika kita juga menampilkan apakah 0xBEEF 0xDEAD? : P
TuxCrafting

10
Tantangan ini benar-benar acak dan agak konyol. Tapi itu sebenarnya masih merupakan tantangan yang cukup besar. +1
DJMcMayhem

Bisakah saya mengeluarkan y, x(yaitu urutan terbalik)?
Luis Mendo

Jawaban:


30

Jelly , 20 17 16 byte

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

Input dalam bentuk matriks Boolean, output adalah pasangan indeks berbasis 1 (Y, X) .

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

ṡ€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
Saya tidak mengerti ... bagaimana Anda bisa membuat kode sesuatu yang tidak dapat dibaca manusia ??
L3n

12
Jelly jauh lebih mudah ditulis daripada membaca. : P
Dennis

45
@ 13 Anda sepertinya menyiratkan bahwa Dennis adalah manusia. Meskipun ada kemungkinan, mengingat jenis trik yang secara rutin menarik, saya tidak akan mengabaikan yang lain ... katakanlah, lebih banyak alternatif cyberpunk ;-)
Francesco

1
Anda dapat menampilkan (x, y) denganṡ4Z€Ḅw€“Ье‘ĖUṀ
Jonathan Allan

2
@ Jonathan Allan Bagus. Ada juga ṡ€4ḄZjw“¿ÇÇБ’d24dengan pengindeksan berbasis 0, tapi sayangnya, satu byte lebih lama.
Dennis

40

vim, 126 80 77 76

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

Mengharapkan input dalam formulir

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

Dan output (dengan indeks berbasis 1) sebagai

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

Terima kasih kepada Jörg Hülsermann karena secara tidak langsung menghemat 46 byte dengan membuat saya sadar bahwa regex saya sangat bodoh, dan untuk DJMcMayhem selama 3 byte lebih.


1
Beberapa tips: 1) Yplebih baik daripada yyp(meskipun saya tahu Anda keberatan Y: P) 2) spasi putih exec 'norm Go'tidak diperlukan. Dan 3) kd{lebih pendek dari kdgg. (Belum diuji itu)
DJMcMayhem

1
@DJMcMayhem Oh, saya selalu lupa Ykarena saya memilikinya rebound di vimrc saya. : P Bahkan, kdggitu setara dengan adil d{, yang, secara mengejutkan, tidak menghapus baris saat ini.
Gagang Pintu

Oh Menarik. Alangkah nyaman!
DJMcMayhem

Saya selalu bingung ketika hal-hal seperti {berubah menjadi gerakan karakter; jadi saya telah melakukan sesuatu seperti {d''menghapus seluruh baris.
Neil

1
Anda dapat menggunakan gema alih-alih mencetak ke buffer, saya tidak berpikir ada yang mencegah hal ini dalam tantangan. Itu akan memangkas sekitar 10 byte.
Christian Rondeau

22

JavaScript (ES6), 63 60 56 byte

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

Mengambil input sebagai string karakter-dibatasi-ruang 155-karakter dari 12 string biner 12-digit, mengembalikan nilai indeks-nol. Sunting: Disimpan 3 byte berkat @ JörgHülsermann. Disimpan 4 byte berkat produk @ETH.


Bisakah Anda menggunakan s.search(r)bukan r.exec(s).index?
ETHproduk

1
@ ETHproductions Tentu saja saya bisa. Saya pasti setengah tertidur kemarin ...
Neil

Bagi saya, menggunakan nodejs untuk mengeksekusi, itu tidak berfungsi kecuali saya berubah s=>[menjadi (s,i)=>[, karena Anda perlu mendefinisikan saya di suatu tempat: /
Mijago

@ Mijago Aneh, itu bekerja di Node 4 ketika saya mencobanya (saya biasanya menggunakan shell JS Spidermonkey). Pikiran Anda salah ketik telah merayap ke dalam kode sehingga beberapa kebaikan keluar dari itu!
Neil

Saya pikir ini gagal untuk 000010110010110011100011100011100011100011110011110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Taemyr

14

C, 146 177 173 163 byte

Terima kasih kepada Numberknot untuk memperbaiki kode (menggeser tiga baris bawah).

Menyimpan 4 byte dengan mengganti >>=1dengan /=2di 4 tempat. Menyimpan 10 byte lebih banyak dengan membiarkan xdan ymenjadi global dan default intberkat 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;}}

Tidak Disatukan:

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;
 }
}

Mengembalikan x, y (berbasis-0) dalam nibble tinggi dan rendah dari byte.

Pemakaian:

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

1
Anda dapat mengubah define ke #define T(i,n)if((A[y+i]&15)==n)dan bagian if T(0,11)T(1,14)T(2,14)T(3,15)returnuntuk menyimpan 6 byte. Ubah juga tanda tangan fungsi int b(int*A)menjadi 4 byte lebih yang disimpan.
Lince Assassino


9

MATL , 22 21 byte

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

Input adalah matriks biner, dengan ;pemisah baris. Output 1-berbasis di urutan terbalik: Y X.

Cobalah online! Atau verifikasi semua kasus uji dengan format input desimal.

Penjelasan

Pola terdeteksi menggunakan konvolusi 2D. Untuk ini,

  • Matriks dan polanya harus dalam bentuk bipolar, yaitu, 1, -1bukan 1, 0. Karena pola memiliki ukuran 4 × 4, kemunculannya terdeteksi oleh entri yang sama dengan 16dalam keluaran konvolusi.
  • Kernel konvolusi perlu didefinisikan sebagai pola yang dicari terbalik di kedua dimensi.

Juga, karena konvolusi memperkenalkan offset pada indeks yang terdeteksi, ini perlu diperbaiki dalam output.

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 byte

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

Mengembalikan semua posisi matriks BEEF, diindeks 1. Input harus berupa matriks digit biner. Namun, x dan y pada output diaktifkan.


Tidak ada kekhawatiran xdan yberalih.
Arnauld

7

Tergelincir , 28 byte

27 byte kode, +1 untuk popsi.

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

Membutuhkan input sebagai persegi panjang multiline dari 1 dan 0 tanpa spasi. Coba di sini (dengan testcase ketiga sebagai input).

Penjelasan

Slip adalah bahasa dari tantangan Pencocokan Pola 2-D . Sp3000 bisa mengatakan lebih banyak tentang hal itu daripada yang saya bisa, tetapi pada dasarnya ini merupakan bentuk regex yang diperluas dengan beberapa perintah arah yang memungkinkan Anda mencocokkan dalam dua dimensi. Kode di atas menggunakan perintah "slip" eponymous \, yang tidak mengubah arah match pointer tetapi bergerak menyamping dengan satu karakter. Itu juga menggunakan "grup stasioner" (?|...), yang cocok dengan sesuatu dan kemudian mengatur ulang pointer ke lokasi sebelumnya.

Kode rusak sebagai berikut:

(?|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

Ini cocok dengan 0xBEEFkotak. The ppilihan output koordinat pertandingan, 0-diindeks.


1
Bagus :) Anehnya, untuk pola blok kadang-kadang golfier hanya berputar-putar:1011>001>1(11>){3}1>1
Sp3000

@ Sp3000 Ha! Spiral adalah metode terpendek di SnakeEx, tapi saya tidak berpikir untuk mencobanya di Slip. Trik yang sangat bagus dengan 1(11>){3}.
DLosc

7

PHP, 87 Bytes

string biner sebagai input tanpa pemisah, mengembalikan nilai yang diindeks nol.

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

array angka sebagai input 128 Bytes

<?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 Bytes disimpan oleh @Titus Terima Kasih


Gunakan ,sebagai ganti .di echodan Anda bisa menghapus tanda kurung. (-4)
Titus

Dalam komentar, Arnauld memungkinkan keluaran tanpa pembatas. (-4)
Titus

Gunakan bendera PREG_OFFSET_CAPTURE: tambahkan ,256ke preg_matchparameter, hapus ^(.*)dari regex, $c[0][1]bukan strlen($c[1])(-6)
Titus

@Titus bagus dan selesai
Jörg Hülsermann

5

Java 7,182 177 byte

Saya mengirim jawaban Karl Napf C ke JAVA Dan Terima kasih kepada Karl Napf karena telah menyelamatkan 5 byte dengan mengingatkan saya pada Bit magic. (Btw saya juga menemukan ide ini tetapi @KarlNapf mengembalikan ide bagian adalah milik Anda bukan milik saya). Maaf jika saya tidak menyenangkan Anda.

(Berbasis-0)

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;}

Tidak disatukan

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
Apa empat ruang di sana antara a[y++]>>=1)dan if((a[y]&15)==. Btw, saya menghitung 182 byte, bukan 183? : S
Kevin Cruijssen

@KevinCruijssen diperbaiki.
Numberknot

1
Semuanya baik-baik saja ;-)
Karl Napf

1
Anda masih dapat menghapus ruang antara ...a[y++]/=2)dan if((a[y]&15)==....
Kevin Cruijssen

5

Retina, 47 byte

Saya ingin mengawali ini dengan permintaan maaf. Saya pikir ini mungkin mengerikan dan contoh buruk tentang bagaimana menggunakan bahasa, tetapi karena saya menggunakan Regex untuk jawaban Perl saya, saya pikir saya akan mencoba Retina. Saya tidak terlalu baik. :( Cuplikan di github sangat membantu saya!

Terima kasih kepada @ wullzx untuk komentarnya pada jawaban Perl saya untuk -3 byte dan @ Taemyr untuk menunjukkan masalah dengan metode saya!

Mengharapkan input sebagai string biner yang dipisahkan ruang dan output mengoordinasikan ruang yang dipisahkan.

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

Cobalah online!

Verifikasi semua tes sekaligus.


1
(.) Gagal untuk '000010110010110011100011100011100011100011110011110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' Anda * perlu {0,8} (.)
Taemyr

Apakah ini dilawan 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.? Itu dapat diatasi dengan pengubah ungreedy jika perlu sekalipun (.{12})*?(.)*?.
Dom Hastings

1
Lihat lagi, hanya ada satu daging sapi di input itu - dan itu tidak pada titik di mana program Anda menunjukkan. Masalahnya tidak akan diselesaikan dengan menggunakan pengubah yang bersemangat, karena saya bisa mengganti daging sapi palsu dengan daging sapi asli. masalahnya adalah bahwa regex Anda cocok dengan "daging sapi" yang dimulai kurang dari 4 bit dari akhir baris matriks.
Taemyr

Anda juga dapat menyelesaikan ini dengan mengubah {8} menjadi {9} dan meminta baris-baris dalam input dipisahkan dengan ruang, untuk perbaikan biaya nol byte.
Taemyr

@ Taemyr Ahhh! Saya melihat! Saya salah paham maksud Anda ... Anda memang benar. Solusi Perl saya berpotensi gagal juga. Akan mendapatkan ASAP yang diubah. Terima kasih atas komentar dan saran Anda!
Dom Hastings

4

Scala, 90 byte

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

Penjelasan:

(
  "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)menghasilkan suatu (a -> c)fungsi, itu seperti kebalikan dari menulis, tetapi membutuhkan lebih sedikit anotasi jenis dalam scala. Dalam hal ini, dibutuhkan string angka biner sebagai input dan mengembalikan tuple indeks berbasis nol.


4

J, 31 29 byte

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

Input diformat sebagai array 2d dari nilai biner, dan outputnya adalah koordinat berbasis nol sebagai array [y, x].

Konversi rata dan dasar untuk menemukan indeks adalah sesuatu yang saya pelajari dari komentar oleh Dennis.

Pemakaian

   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

Penjelasan

[:($#: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 byte

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

Input adalah daftar string, output adalah string XY (indeks berbasis 1).

Uji di Ideone .


Mungkinkah ini secara keliru menemukan "daging sapi" melintasi batas di mana dua garis digabungkan?
xnor

Ya saya berpikir begitu. Saya akan memutar kembali edit sampai saya bisa mengujinya dengan benar.
Dennis

2
Itulah yang terjadi ketika Anda menggunakan roti toroidal.
mbomb007

4

Perl, 54 byte

53 byte kode +1 untuk -n. Penggunaan -Etanpa biaya tambahan.

Menggunakan indeks berbasis 0. Mengharapkan input sebagai string dari 1s dan 0s dan ruang output koordinat terpisah.

Terima kasih kepada @ wullxz dan @ GabrielBenamy karena membantu saya menghemat 9 byte, dan atas komentar @ Taemyr pada jawaban Retina saya karena menunjukkan masalah!

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

Pemakaian

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
Anda dapat menyimpan 3 karakter dengan menggabungkan regex untuk EE biner: (.{8}1110){2}alih-alih.{8}1110.{8}1110
wullxz

1
Anda juga dapat menyimpan 3 byte lagi dengan mengubahnya length$`menjadi$-[0]
Gabriel Benamy

@wullxz Tentu saja! Saya mencoba \1tetapi tidak berhasil, tidak berpikir untuk mencoba {2}! Terima kasih!
Dom Hastings

@GabrielBenamy Luar Biasa, terima kasih banyak! Diperbarui!
Dom Hastings

2
@ User112638726 " $-[0]adalah offset dari awal pertandingan yang sukses terakhir. $-[n]Adalah offset dari awal substring yang dicocokkan oleh sub-pola ke-n, atau undefjika subpola tidak cocok." from: perldoc.perl.org/perlvar.html (cari @-)
Dom Hastings

1

Scala, 318 Bytes

Solusi ini dapat ditingkatkan lebih lanjut ... tapi saya tetap bisa dibaca dan memungkinkan input menjadi multi-line spaced matrix.

Solusi Aktual jika Array dari String biner

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

Contoh Bekerja

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 byte (menurut Linux (terima kasih 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

Bukan bytecount yang kompetitif, tetapi algoritmenya sedikit menarik. Mengambil input sebagai string nilai biner.


Jika Anda menuntut ruang tunggal alih-alih 4 dan memeriksanya di Linux, 137
ElPedro

1
Saya pikir Anda memerlukan baris baru dan spasi sebelum impor (saya mendapatkan IndentError di Python 2 tanpa itu) yang harganya 2 byte tetapi Anda kemudian dapat menempatkan i = ..., x = ... dan y = ... pada baris yang sama dengan dan terpisah dengan; kehilangan 1 byte untuk 136
ElPedro

@elpedro Saya menggunakan Python 3, dan tidak apa-apa dengan impor berada di baris yang sama.
Pinalosa

Sepenuhnya dipahami :)
ElPedro

Astaga, baca kembali komentar saya dan saya membuat begitu banyak kesalahan ketik malam ini. Untung aku tidak mencoba menulis kode apa pun ...
ElPedro

1

Ruby , 62 byte

def f(a);a=~/1011(.{8}1110){2}.{8}1111/;$`.size.divmod(12);end 

Ini mengharapkan string 0dan 1dan mengembalikan array Y dan X, berbasis nol.

Coba ideone .


1

F # - 260 byte

Program lengkap, termasuk perancang EntryPoint yang diperlukan (jadi hitung lebih sedikit jika Anda mau).

Input: setiap baris sebagai string terpisah: "111001111110" "110100100000" "010001111101" "100100100100100" "100101100111" "111111000010" "11011100001" "100111100001" "100111011111" "111110011111" "100001010111" 1100 "

Kode:

[<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

Bukan solusi yang paling elegan, tetapi saya ingin tetap menggunakan string, jadi inilah yang saya lakukan. Saya hampir mendapatkannya menjadi satu baris dan lebih kecil menggunakan pipa, tetapi ada sesuatu dengan blok double if yang membuat saya tidak bisa menyelesaikannya. Oh, baiklah!

Saya juga berpikir tentang memasukkan jawaban Karl ke F # karena itu jawaban yang bagus, dan mungkin masih melakukan itu untuk bersenang-senang sebagai pendekatan lain, tetapi ingin tetap dengan yang ini agar berbeda.


1

Dyalog APL, 29 27 byte

Mengambil array biner 12x12 sebagai input pengguna dan mengembalikan koordinat dalam urutan terbalik, indeks mulai dari 1.

Terima kasih kepada @ Adám karena telah menghemat banyak byte. -2 Bytes karena saya bodoh dan meninggalkan semuanya dalam suatu fungsi tanpa alasan.

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

Simpan 2 dengan mengganti ~2 8 12∊⍨4 4⍴⍳16dengan 15 7 15 9⊤⍨4/2. Catatan yang 0~⍨∊{⍵×⍳⍴⍵}dapat diganti dengan dari versi 16.0 (kode Anda hanya berfungsi di Dyalog APL).
Adm

Ya, Dyalog memiliki karakter yang berbeda dari GNU. Atau itu sesuatu yang lain?
Zacharý

Nah, sedang ditambahkan dari v16, saya tidak dapat menemukan daftar primitif GNUAPL.
Adm

Saya menjalankan GNU APL, kebanyakan hanya perbedaan codepoint.
Zacharý

Dari apa yang saya perhatikan.
Zacharý

0

Elemen , 130 byte

_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/`]']

Cobalah online!

Mengambil input sebagai satu string panjang 1s dan 0s tanpa pembatas. Output seperti3 4 (pengindeksan berbasis 0).

Ini bekerja dengan menempatkan input data ke dalam "array" (pada dasarnya kamus dengan kunci integer) dan kemudian, untuk setiap nilai awal yang mungkin, menguji bit pada offset tertentu (kesemuanya 16 dari mereka dalam proses yang sangat melelahkan).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.