Temukan semua koordinat di jalur

21

Diberikan string 2D sebagai input, baik sebagai string dengan baris baru atau daftar garis, menampilkan koordinat (x, y)semua hash ( #) dalam daftar. Input hanya akan berisi hash dan spasi. (dan baris baru, jika Anda memilih untuk mengambil input sebagai string 2D)

Jika tidak ada hash, Anda dapat menampilkan apa pun.

Output harus jelas untuk nomor mana yang dipasangkan.

Contoh:

##

Haruskah output:

(0,0), (1,0)

Itu mengasumsikan pengindeksan berbasis 0, mulai dari kiri atas. Anda dapat mulai dari sudut mana pun, menggunakan pengindeksan berbasis 0 atau 1, dan / atau output yterlebih dahulu. (misalnya dalam formulir y,x).

Lebih banyak kasus uji (sekali lagi, semua menggunakan (x, y)pengindeksan kiri-atas berbasis 0 ):

    #
#####
#

(4, 0), (0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (0, 2)


# ###
### #

(0, 0), (2, 0), (3, 0), (4, 0), (0, 1), (1, 1), (2, 1), (4, 1)

Perhatikan bahwa semua kasus pengujian ini disusun menurut baris, bukan dengan mengikuti jalur.

Anda dapat mengasumsikan hash akan membentuk jejak berkelanjutan, yaitu # #tidak akan pernah menjadi input. (mungkin tidak masalah, tetapi kalau-kalau ada yang ingin regex ini)

Anda juga dapat menampilkan koordinat dalam urutan apa pun yang Anda inginkan, yaitu kolom vertikal, baris horizontal, atau hanya daftar yang tidak disortir.

Rɪᴋᴇʀ
sumber
Bisakah kita menganggap input hanya berisi hash dan spasi?
DJMcMayhem
@DJMcMayhem ya, mengedit itu menjadi pertanyaan.
Rɪᴋᴇʀ
Apakah ini atau ini format output yang valid?
Zgarb
@ Zgarb pada dasarnya dengan tambahan 1,1 dan hash? Eh tentu.
R
Apakah format alternatif saya valid?
ETHproduk

Jawaban:

10

Tergelincir , 2 + 1 = 3 byte

+1 byte untuk pbendera. Kode:

`#

Penjelasan:

The p-flag kembali posisi masing-masing kejadian berikut ini:

`#      // The character '#'

Coba di sini!

Adnan
sumber
1
Saya pikir kami memiliki seorang pemenang
Adám
Ada penjelasan?
R
@EasterlyIrk Backtick lolos dari satu karakter sebagai string. Bendera meminta hasil posisi.
Adám
@ Adam oh, keren!
R
8

Grime , 5 byte

pa`\#

Cobalah online! Format output agak funky, tetapi OP telah menyatakan bahwa itu valid.

Penjelasan

Grime adalah bahasa pencocokan pola 2D saya. Bagian setelahnya `adalah polanya , dalam hal ini 1 × 1 kotak yang mengandung karakter #-c. Grime akan mencari kotak masukan untuk kecocokan, dan mencetak yang pertama ditemukan secara default. Bagian sebelumnya `berisi opsi, dalam hal ini menandakan bahwa semua kecocokan ( a) harus dicetak, beserta posisi dan ukurannya ( p).

Zgarb
sumber
8

MATL , 7 6 5 byte

Ini menggunakan pengindeksan berbasis 1 dengan (1,1)di sudut kiri atas.

oo&fh

Penjelasan:

o        % convert char to double 
 o       % remainder mod 2 ('#' == 35, ' '==32) makes spaces falsy
  &f     % apply `find` with 2d-output 
    h   % concatenate outputs to display x- and y-coordinates side by side

Terima kasih @DJMcMayhem dan @LuisMendo untuk setiap -1 byte!

Cobalah online!

cacat
sumber
3
Anda bisa melakukannya ooH#fhuntuk menghemat satu byte. (konversikan ke bilangan bulat, mod2) Karena spasi genap (mod 2 == 0, falsy) dan #ganjil (mod 1 == 1, truthy)
DJMcMayhem
Oh, bagus, terima kasih banyak! =)
flawr
7

Python , 67 byte

Ini sebenarnya hanya golf jawaban Stack Overflow saya pada topik yang sama.

lambda a,e=enumerate:[[(i,j)for j,B in e(A)if'!'<B]for i,A in e(a)]

Cobalah online!

Loop melalui daftar 2D, merekam karakter hash, dan mengembalikan hasilnya. Kami menyimpan byte dengan menggunakan char > '!'daripada char == '#', karena input hanya akan terdiri dari hash dan spasi, dan dengan demikian hashes ( 0x23) akan menjadi satu-satunya karakter yang lebih besar daripada tanda seru ( 0x21).

FlipTack
sumber
5

JavaScript (ES6), 70 67 byte

s=>s.replace(/./g,(c,i)=>c>' '?[i%l,i/-l|0]+' ':'',l=~s.indexOf`
`)

Keluarkan daftar koordinat baris-dan-ruang-terpisah, misalnya

4,0
0,1 1,1 2,1 3,1 4,1
0,2

Anda bisa mendapatkan lebih pendek dengan format output aneh:

s=>s.replace(/#/g,(c,i)=>[i%l,i/-l|0]+c,l=~s.indexOf`
`)

Ini output

    4,0#
0,1#1,1#2,1#3,1#4,1#
0,2#

untuk test case kedua. Masih jelas angka mana yang dipasangkan dengan ...

Produksi ETH
sumber
5

J , 12 byte

$#:'#'I.@:=,

Cobalah online!

Penjelasan

$#:'#'I.@:=,  Input is y.
           ,  Flatten y
   '#'    =   and form bit vector of equality with #.
      I.@:    Compute positions of 1s
 #:           and convert each to base
$             shape of y.
Zgarb
sumber
4

Jelly , 8 byte

n⁶T€,€"J

Cobalah online!

Diberikan array karakter 2D (= daftar string):

            Implicit input (example):
               [[' ', ' ', ' ', ' ', '#']
               ,['#', '#', '#', '#', '#']
               ,['#', ' ', ' ', ' ', ' ']]
n⁶          Not-equal to space (⁶).
               [[0, 0, 0, 0, 1]
               ,[1, 1, 1, 1, 1]
               ,[1, 0, 0, 0, 0]]
  T€        Indices of 1s in each row
               [[5], [1,2,3,4,5], [1]]
    ,€"J    Pair each, vectorizing, with y-indices
               [[[5,1]], [[1,2],[2,2],[3,2],[4,2],[5,2]], [[1,3]]]
Lynn
sumber
3

Dyalog APL 16.0, 5 karakter = 9 byte atau 6 karakter = 8 byte

Memberikan daftar (y, x) pasangan dari kiri atas.

⍸⎕='#'

dimana

memasukkan

= sama dengan

'#' karakter ini *

* Hal ini dimungkinkan untuk menyimpan karakter pada biaya satu byte dengan mengganti '#'dengan ⍕#(memformat root namespace)

TryAPL online! Catatan yang telah ditiru dengan i karena TryAPL menjalankan versi 14.0.

Adm
sumber
Cukup yakin dalam pengkodean APL Dyalog 1 char = 1 byte, bukan?
devRicher
@devRicher Biasanya, tetapi tidak termasuk dalam versi byte tunggal. Lihat tautan "byte".
Adám
3

JavaScript (Firefox 30-57), 61 byte

s=>[for(c of(x=0,y=1,s))if(c<' '?(y++,x=0):(x++,c>' '))[y,x]]

Mengembalikan koordinat berbasis 1. Beralih antara [y, x]dan [x, y]memesan dengan mudah. Tidak Terkumpul:

function coords(s) {
    var x = 0;
    var y = 1;
    for (Var c of s) {
        if (c == "\n") {
            y++;
            x=0;
        } else {
            x++;
        }
        if (c == "#") {
            console.log(y, x);
        }
    }
}
Neil
sumber
2

Vim, 37 byte

:%s/#/\=line('.').','.col('.').' '/g<cr>

Karena sebagian besar V kompatibel dari belakang, Anda dapat mencobanya secara online!

Solusi regex langsung, di mana ia menggantikan masing-masing '#' dengan lokasi tempat ditemukannya (pengindeksan satu berbasis). Saya sedikit khawatir ketika menulis ini bahwa lokasi akan berubah setelah mengganti yang pertama pada satu baris, tetapi itu tampaknya tidak menjadi masalah. TBH Saya sangat terkejut dengan betapa sederhananya solusi ini.

Sayangnya, vimscript sangat bertele-tele, sehingga sebagian besar byte berasal dari memisahkan hasil sehingga masih terbaca. Kalau tidak, kita bisa melakukannya

:%s/#/\=line('.').col('.')/g

Tetapi ini menciptakan keluaran yang cukup sulit untuk ditafsirkan. Selain itu, itu hanya akan berfungsi jika kisi selalu 9x9 atau lebih kecil.

Ini adalah solusi yang sangat menyenangkan karena menunjukkan setiap pasangan koordinat di lokasi hash yang diwakilinya. Misalnya input

# ###
### #

output

1,1  1,3 1,4 1,5 
2,1 2,2 2,3  2,5 

Tentu saja, jika kami menggunakan V, kami dapat menghapus baris baru, dan mengompres regex. Maka itu bisa saja

Í#/½line('.').','.col('.').' '/g

(32 byte)

Tapi karena ini adalah pendekatan yang sama persis dan masih menyakitkan, sepertinya tidak layak menggunakan bahasa golf.

DJMcMayhem
sumber
2
Oke, keseluruhan "menunjukkan setiap pasangan koordinat di lokasi hash" sangat keren. +1
Rɪᴋᴇʀ
2

Haskell, 53 byte

concat.zipWith(\y l->[(x,y)|(x,'#')<-zip[0..]l])[0..]

Input diambil sebagai daftar string. Outputnya adalah daftar (x,y)pasangan (0 diindeks), misalnya

*Main> concat.zipWith(\y l->[(x,y)|(x,'#')<-zip[0..]l])[0..] $ ["# ###","### #"]
[(0,0),(2,0),(3,0),(4,0),(0,1),(1,1),(2,1),(4,1)]
nimi
sumber
2

Lua, 141 byte

w=io.read()x=w:sub(1,w:find("\n")-1):len()_,c=w:gsub("\n","")for i=0,x do for j=0,c+1 do if w:sub(c*x+i,c*x+i)=="#"then print(i,j)end end end

Sekarang jam 2:30 pagi, saya di tempat tidur, di telepon saya. Mengapa aku melakukan ini?

lebih kaya
sumber
1

Mathematica, 12 byte

Position@"#"

Bentuk operator Position. Mengasumsikan array karakter 2D. 1-diindeks mulai dari entri kiri atas. Menghasilkan daftar koordinat dalam formulir {row,column}.

ngenisis
sumber
Cara saya membaca deskripsi tugas, saya tidak berpikir mengambil array karakter 2D diperbolehkan untuk bahasa yang mendukung string.
smls
Saya tidak yakin. Untuk satu hal, pertanyaan itu difokuskan char[], yang sebenarnya merupakan cara umum untuk menyimpan string dalam bahasa berbasis C. Juga, uraian tugas ini secara khusus menyebutkan "baik sebagai string dengan baris baru atau daftar baris", dan tidak menyebutkan daftar-daftar-karakter atau matriks karakter 2D.
smls
@smls Persis. Konsensusnya adalah bahwa jika sebuah pertanyaan menentukan string, itu berarti serangkaian karakter, dan jika bahasa Anda memiliki lebih dari satu cara untuk mengekspresikannya, maka Anda bebas memilih yang sesuai dengan kebutuhan golf Anda. Menentukan "baik sebagai string dengan baris baru atau daftar baris" tidak mengubah apa pun karena jika Anda mewakili setiap baris sebagai array karakter, maka Anda mendapatkan array karakter 2D.
ngenisis
1

PHP, 69 byte

for(;$a=$argv[++$i];)for($j=0;""<$c=$a[$j++];)echo$c>" "?"$j $i,":"";

Menggunakan pengindeksan berbasis 1 mulai dari kiri atas.
Gunakan seperti:

php -r 'for(;$a=$argv[++$i];)for($j=0;""<$c=$a[$j++];)if($c>" ")echo"$j $i,";' '    #' '#####' '#    '

Akan menampilkan:

5 1,1 2,2 2,3 2,4 2,5 2,1 3,
pengguna59178
sumber
1

C, 113 byte

i,j,k,l;f(char**p){i=strlen(*p);l=strlen(p);for(j=0;j<l;j++)for(k=0;k<i;k++)if(p[j][k]==35)printf("%d,%d ",k,j);}

Output dari kasus uji:

0,0 2,0 3,0 4,0 0,1 1,1 2,1 4,1 
4,0 0,1 1,1 2,1 3,1 4,1 0,2 

Cobalah online!

betseg
sumber
1

RBX.Lua, 131 byte

Harus menganggap input valid (Z adalah sumbu datar, spasi putih adalah Whiteubin, hashes dapat warna lain, bagian kiri atas terletak di 0, 0, 0) dan semua bagian adalah bagian dari model yang sama M, dan model dinyatakan kosong.

for k,v in pairs(workspace.M:GetChildren())do if v.BrickColor~=BrickColor.new("White")then print(v.Position.X,-v.Position.Y)end end

Input / output sampel:

Contoh

lebih kaya
sumber
Bisakah Anda memberikan contoh i / o yang valid?
Rɪᴋᴇʀ
@EasterlyIrk Di sana, edit jawabannya.
devRicher
1

Perl 6 , 25 byte (22 karakter)

{^∞ZX@_».indices("#")}

Mengambil input sebagai daftar baris.
Output satu daftar per baris, masing-masing berisi (y, x) tupel untuk koordinat.
Cobalah online!

Bagaimana itu bekerja

{                    }  # A lambda.
{    @_»             }  # For each input line:
        .indices("#")   #    get x-coordinates.  (4) (0 1 2 3 4) (0)
 ^∞                     # Range from 0 to Inf.    0   1           2 ...
   Z                    # Zip with:              (0 (4)) (1 (0 1 2 3 4)) (2 (0))
    X                   #    Cartesian product.  ((0 4)) ((1 0) (1 1) (1 2) (1 3) (1 4)) ((2 0))
seseorang
sumber
1

Groovy, 80 68 byte

{y=0;it.each{it.eachWithIndex{x,i->print(x=='#'?"($i,$y)":"")};y++}}

Contoh input:

[#   #,#   #,#####]

Contoh Output:

(0,0)(4,0)(0,1)(4,1)(0,2)(1,2)(2,2)(3,2)(4,2)
Guci Gurita Ajaib
sumber
Mengapa membagi input menjadi baris, ketika deskripsi tugas memungkinkan mengambil daftar baris yang sudah terpecah?
smls
1

Ruby , 24 + 1 = 25 byte

+1 byte untuk -nbendera. Koordinat berbasis 1, satu nomor per baris.

gsub(/#/){p$`.size+1,$.}

Cobalah online!

Jordan
sumber
0

C, 80 byte

x,y;f(char*s){for(x=y=0;*s;printf(*s-35?"":"%d,%d ",x,y),*s++==10?++y,x=0:++x);}

Membutuhkan input sebagai array char yang dibatasi baris baru, mencetak output ke layar.

Tidak digabungkan & penggunaan:

x,y;

f(char*s){
 for(
  x = y = 0;             //init coordinates
  *s;                //iterate until end
  printf(*s-35 ? "" : "%d,%d ", x, y),     //print coordinates or empty string
  *s++==10 ? ++y, x=0 : ++x              //advance to the right or the next line
 );
}


main(){
 f("    #\n#####\n#    ");
 puts("");
 f("# ###\n### #");
}
Karl Napf
sumber
1
78 byte:x,y;f(char*s){for(x=y=0;*s;*s++==10?++y,x=0:++x)*s==35&&printf("%d,%d ",x,y);}
gastropner