ค้นหาพิกัดทั้งหมดบนเส้นทาง


21

กำหนดสตริง 2D เป็นอินพุตไม่ว่าจะเป็นสตริงที่มีการขึ้นบรรทัดใหม่หรือรายการบรรทัดให้ส่งออกพิกัด(x, y)ของแฮชทั้งหมด ( #) ในรายการ อินพุตจะมีเฉพาะแฮชและช่องว่าง (และขึ้นบรรทัดใหม่หากคุณเลือกที่จะรับอินพุตเป็นสตริง 2D)

หากไม่มีแฮชคุณสามารถส่งออกได้ทุกอย่าง

ผลลัพธ์ควรไม่ชัดเจนว่าตัวเลขใดถูกจับคู่กับหมายเลขใด

ตัวอย่าง:

##

ควรส่งออก:

(0,0), (1,0)

ที่ถือว่าการจัดทำดัชนีตาม 0 เริ่มต้นจากด้านบนซ้าย คุณอาจเริ่มจากมุมใดก็ได้ใช้ดัชนี 0 หรือ 1 และ / หรือผลลัพธ์yก่อน (เช่นในรูปแบบy,x)

กรณีทดสอบเพิ่มเติม (อีกครั้งทั้งหมดใช้การ(x, y)จัดทำดัชนีจากซ้ายบน):

    #
#####
#

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

โปรดทราบว่าการทดสอบเหล่านี้จะแสดงรายการทั้งหมดตามแถวไม่ใช่ตามเส้นทาง

คุณอาจถือว่าแฮชจะสร้างเส้นทางต่อเนื่องนั่นคือ# #จะไม่มีทางป้อนข้อมูล (อาจจะไม่สำคัญ แต่ในกรณีที่มีคนต้องการ regex นี้)

คุณยังสามารถส่งออกพิกัดในลำดับใดก็ได้ที่คุณต้องการเช่นคอลัมน์แนวตั้งแถวแนวนอนหรือเพียงแค่รายการที่ไม่เรียงลำดับ


เราสามารถสมมติว่าอินพุตมีเพียงแฮชและช่องว่างได้หรือไม่
DJMcMayhem

@DJMcMayhem ใช่แก้ไขมันลงในคำถาม
Rɪᴋᴇʀ

จะนี้หรือนี้จะเป็นรูปแบบผลลัพธ์ที่ถูกต้อง?
Zgarb

@Zgarb โดยทั่วไปแล้วมี 1,1 พิเศษและแฮช? เอ๊ะแน่นอน
Rɪᴋᴇʀ

คำตอบ:


10

สลิป , 2 + 1 = 3 ไบต์

+1 ไบต์สำหรับpแฟล็ก รหัส:

`#

คำอธิบาย:

p-flag ผลตอบแทนตำแหน่งของการเกิดขึ้นต่อไปนี้แต่ละ:

`#      // The character '#'

ลองที่นี่!


1
ฉันคิดว่าเรามีผู้ชนะ
Adám

คำอธิบายใด ๆ
Rɪᴋᴇʀ

@EasterlyIrk backtick escapes อักขระเดียวเป็นสตริง ธงขอผลลัพธ์ตำแหน่ง
Adám

@ Adam Oh, cool!
Rɪᴋᴇʀ

8

สิ่งสกปรก 5 ไบต์

pa`\#

ลองออนไลน์! รูปแบบผลลัพธ์เป็นบิตขี้ขลาด แต่ OP ได้ระบุว่าถูกต้อง

คำอธิบาย

Grime เป็นภาษาจับคู่รูปแบบ 2D ของฉัน ส่วนหลัง`เป็นรูปแบบในกรณีนี้ตาราง 1 × 1 ที่มี#อักขระ Grime จะค้นหากริดอินพุตสำหรับการจับคู่และพิมพ์รายการแรกที่ค้นหาตามค่าเริ่มต้น ส่วนก่อน`มีตัวเลือกในกรณีนี้หมายถึงว่าการแข่งขันทั้งหมด ( a) ควรจะพิมพ์พร้อมกับตำแหน่งและขนาดของพวกเขา ( p)


8

MATL , 7 6 5 ไบต์

สิ่งนี้ใช้การจัดทำดัชนีแบบอิงกับ 1 (1,1)ที่มุมซ้ายบน

oo&fh

คำอธิบาย:

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

ขอบคุณ @DJMcMayhem และ @LuisMendo สำหรับแต่ละ -1 ไบต์!

ลองออนไลน์!


3
คุณสามารถทำได้ooH#fhเพื่อบันทึกหนึ่งไบต์ (แปลงเป็นเลขจำนวนเต็ม, mod2) เนื่องจากพื้นที่มีค่าเท่ากัน (mod 2 == 0, เท็จ) และ#เป็นเลขคี่ (mod 1 == 1, ความจริง)
DJMcMayhem

โอ้เยี่ยมมากขอบคุณมาก! =)
ข้อผิดพลาด

7

Pythonขนาด 67 ไบต์

นี่เป็นเพียงคำตอบของStack Overflowของฉันในหัวข้อที่คล้ายกัน

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

ลองออนไลน์!

ลูปผ่านรายการ 2D บันทึกอักขระแฮชและส่งคืนผลลัพธ์ เราบันทึกไบต์โดยใช้char > '!'แทนchar == '#'เนื่องจากอินพุตจะประกอบด้วยเฉพาะแฮชและช่องว่างเท่านั้นดังนั้นแฮช ( 0x23) จะเป็นอักขระที่มีขนาดใหญ่กว่าเครื่องหมายอัศเจรีย์ ( 0x21) เท่านั้น


5

JavaScript (ES6), 70 67 ไบต์

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

ส่งออกรายการพิกัดใหม่และคั่นด้วยช่องว่างเช่น

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

คุณสามารถสั้นลงด้วยรูปแบบเอาต์พุตแปลก ๆ :

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

ผลลัพธ์นี้

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

สำหรับกรณีทดสอบที่สอง ยังชัดเจนว่าตัวเลขใดถูกจับคู่กับ ...



4

เยลลี่ขนาด 8 ไบต์

n⁶T€,€"J

ลองออนไลน์!

รับชุดอักขระสองแถว (= รายการของสตริง):

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

3

Dyalog APL 16.0, 5 ตัวอักษร = 9 ไบต์หรือ 6 ตัวอักษร = 8 ไบต์

แสดงรายการคู่ (y, x) จากซ้ายบน

⍸⎕='#'

ที่ไหน

อินพุต

= เท่ากับ

'#' ตัวละครนี้ *

* เป็นไปได้ที่จะบันทึกอักขระที่ราคาหนึ่งไบต์โดยแทนที่'#'ด้วย⍕#(จัดรูปแบบรูทเนมสเปซ)

ลองใช้ออนไลน์! โปรดทราบว่ามีการเลียนแบบi เนื่องจาก TryAPL รันเวอร์ชัน 14.0


ค่อนข้างแน่ใจว่าในการเข้ารหัส Dyalog APL 1 ถ่าน = 1 ไบต์ใช่ไหม?
devRicher

@devRicher ตามปกติ แต่ไม่รวมอยู่ในรุ่นไบต์เดียว ดูลิงก์ "bytes"
Adám

3

JavaScript (Firefox 30-57), 61 ไบต์

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

ส่งคืนพิกัดที่ใช้ 1 สลับได้อย่างง่ายดายระหว่าง[y, x]และ[x, y]สั่งซื้อ Ungolfed:

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

2

เป็นกลุ่ม 37 ไบต์

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

เนื่องจาก V นั้นเข้ากันได้เป็นส่วนใหญ่คุณสามารถลองออนไลน์ได้!

โซลูชัน regex ที่ตรงไปตรงมาซึ่งจะแทนที่แต่ละ '#' ด้วยตำแหน่งที่พบใน (การทำดัชนีแบบอิงฐานเดียว) ฉันกังวลเล็กน้อยในขณะที่เขียนสิ่งนี้ว่าสถานที่จะเปลี่ยนไปหลังจากแทนที่ที่หนึ่งในบรรทัด แต่ดูเหมือนจะไม่เป็นปัญหา TBH ฉันตกตะลึงกับความเรียบง่ายของการแก้ปัญหานี้ในท้ายที่สุด

น่าเสียดายที่ vimscript นั้นมีความละเอียดมากดังนั้นไบต์ส่วนใหญ่จึงมาจากการแยกผลลัพธ์เพื่อให้สามารถอ่านได้อย่างชัดเจน มิฉะนั้นเราสามารถทำ

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

แต่นี่สร้างผลลัพธ์ที่ค่อนข้างยากที่จะตีความ นอกจากนี้มันจะใช้งานได้เฉพาะกับกริดเท่านั้นคือ 9x9 หรือเล็กกว่า

นี่เป็นวิธีแก้ปัญหาที่สนุกมากเพราะมันแสดงพิกัดแต่ละคู่ที่ตำแหน่งของแฮชที่แทน ตัวอย่างเช่นการป้อนข้อมูล

# ###
### #

เอาท์พุท

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

แน่นอนถ้าเราใช้ V เราสามารถลบบรรทัดขึ้นบรรทัดใหม่และบีบอัด regex จากนั้นมันก็อาจจะเป็น

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

(32 ไบต์)

แต่เนื่องจากนี่เป็นวิธีการเดียวกันที่แน่นอนและยังคง verbose อย่างเจ็บปวดจึงไม่คุ้มค่าที่จะใช้ภาษากอล์ฟ


2
โอเคทั้งหมด "แสดงพิกัดแต่ละคู่ที่ตำแหน่งของแฮช" นั้นค่อนข้างเจ๋งมาก +1
Rɪᴋᴇʀ

2

Haskell, 53 ไบต์

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

อินพุตถูกใช้เป็นรายการของสตริง ผลลัพธ์คือรายการของ(x,y)คู่ (0 ดัชนี), เช่น

*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)]

2

Lua, 141 ไบต์

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

มันคือ 2:30 น. ฉันนอนบนโทรศัพท์ ทำไมฉันถึงทำเช่นนี้?


1

Mathematica ขนาด 12 ไบต์

Position@"#"

Positionรูปแบบการดำเนินการของ ถือว่าเป็นอาร์เรย์ของตัวละคร 2D 1 ดัชนีเริ่มต้นที่รายการด้านซ้ายบน {row,column}ขาออกรายการของพิกัดในรูปแบบที่


วิธีที่ฉันอ่านคำอธิบายงานฉันไม่คิดว่าจะอนุญาตให้ใช้ตัวอักษรอาร์เรย์ 2 มิติสำหรับภาษาที่สนับสนุนสตริง
smls


ฉันไม่มั่นใจ สำหรับสิ่งหนึ่งคำถามนั้นมุ่งเน้นไปที่char[]ซึ่งเป็นวิธีการทั่วไปในการจัดเก็บสตริงในภาษาที่ใช้ภาษา C นอกจากนี้คำอธิบายงานนี้โดยเฉพาะกล่าวถึง "ไม่ว่าจะเป็นสตริงที่มีการขึ้นบรรทัดใหม่หรือรายการบรรทัด" และไม่พูดถึง list-of-list-of-characters หรือ 2D matrix
smls

@smls อย่างแน่นอน ความเห็นพ้องต้องกันคือหากคำถามระบุสตริงมันหมายถึงลำดับของอักขระและหากภาษาของคุณมีวิธีการแสดงออกมากกว่าหนึ่งวิธีคุณสามารถเลือกสิ่งที่เหมาะสมกับความต้องการของคุณได้ การระบุ "ไม่ว่าจะเป็นสตริงที่มีการขึ้นบรรทัดใหม่หรือรายการของบรรทัด" จะไม่มีอะไรเปลี่ยนแปลงเนื่องจากถ้าคุณแสดงแต่ละบรรทัดเป็นอาร์เรย์ของอักขระคุณจะได้รับอาร์เรย์ 2 มิติที่แน่นอน
ngenisis

1

PHP, 69 ไบต์

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

ใช้การจัดทำดัชนีแบบ 1 โดยเริ่มจากด้านบนซ้าย
ใช้เช่น:

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

จะส่งออก:

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


1

RBX.Lua, 131 ไบต์

มีการสมมติว่าอินพุตถูกต้อง (Z คือแกนเรียบช่องว่างเป็นWhiteกระเบื้องแฮชสามารถเป็นสีอื่นส่วนซ้ายบนตั้งอยู่ที่0, 0, 0) และทุกส่วนเป็นส่วนหนึ่งของแบบจำลองเดียวกันMและแบบจำลองว่างเปล่า

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

ตัวอย่างอินพุต / เอาต์พุต:

ตัวอย่าง


คุณสามารถให้ตัวอย่าง i / o ที่ถูกต้องได้หรือไม่?
Rɪᴋᴇʀ

@EasterlyIrk ที่นั่นแก้ไขคำตอบ
devRicher

1

Perl 6 , 25 ไบต์ (22 ตัวอักษร)

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

รับอินพุตเป็นรายการของบรรทัด
ส่งออกหนึ่งรายการต่อบรรทัดโดยแต่ละรายการมี tuples (y, x) สำหรับพิกัด
ลองออนไลน์!

มันทำงานอย่างไร

{                    }  # 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))

1

Groovy, 80 68 ไบต์

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

อินพุตตัวอย่าง:

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

ตัวอย่างผลลัพธ์:

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

ทำไมแบ่งอินพุตเป็นบรรทัดเมื่อรายละเอียดงานอนุญาตให้มีรายการแยกบรรทัดแล้ว?
smls


0

C, 80 ไบต์

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

ต้องป้อนข้อมูลเป็นอักขระ char ที่คั่นด้วยบรรทัดใหม่พิมพ์ผลลัพธ์ไปยังหน้าจอ

Ungolfed & การใช้งาน:

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### #");
}

1
78 bytes:x,y;f(char*s){for(x=y=0;*s;*s++==10?++y,x=0:++x)*s==35&&printf("%d,%d ",x,y);}
gastropner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.