จับคู่พิกัดกับค่าของพวกเขา


10

กำหนด 3 รายการอินพุตรายการคู่ประสานงานสตริง 2D และสตริงอักขระเดี่ยวเอาท์พุทไม่ว่าอักขระในแต่ละพิกัดของสตริง 2D จะเท่ากับอักขระเดียว คุณสามารถรับอินพุตในลำดับใดก็ได้และพิกัดอาจมีดัชนี 1 ชุด

คุณอาจใช้สตริง 2D เป็นรายการ 2D รายการของบรรทัดหรือสตริง 2D

ตัวอย่าง: (0,0), "#_\n__", "#" -> True

สตริงนั้นคือ

#_
__

ถ่านที่พิกัด(0,0)(จากซ้ายด้านบน) #เป็น นี่เท่ากับรายการอินพุตที่สาม#ดังนั้นคุณจึงเอาท์พุทTrue(หรือค่าจริงใด ๆ )

ตัวอย่าง: [(0,0), (1,1)], "#_\n_#", "#" -> True

สตริงนั้นคือ

#_
_#

อักขระที่พิกัด(0,0)และ(1,1)มีทั้งคู่#ดังนั้นผลลัพธ์จะเป็นจริง

เอาต์พุตจะเป็นจริงถ้า iff ทุกพิกัดตรงกับแฮช ไม่แฮชทุกคนจะต้องมีพิกัดที่ตรงกัน หากไม่มีการเกิดของถ่านเดี่ยว (#ในบางกรณีทดสอบ) ในสตริง 2D ผลลัพธ์จะยังคงเป็นเท็จ

คุณสามารถสันนิษฐานได้ว่าพิกัดจะอยู่ภายในขอบเขตของสตริง 2D เสมอ

กรณีทดสอบเพิ่มเติม: (ฉันใส่ถ่านตัวที่สองเพื่อความสะดวกในการอ่าน)

[(0,0), (2,1), (3,0)], #

#_##
#_##

True


[(0,0), (1,1), (3,0)], #

#_##
#_##

False (1,1 is not a hash)



[(1,1)], a

#a##
#a##

True


[(4, 0), (3, 0), (2, 0), (1, 0), (0, 0), (0, 1), (0, 2), (0, 3), (1, 3), (2, 3), (2, 2), (3, 2), (4, 2), (4, 3)], ' '


 ####
 #   
   # 

True

หมายเหตุกรณีทดสอบล่าสุดใช้ช่องว่างเป็นสตริงอักขระเดี่ยวและแฮชรอบ ๆ ช่องว่าง

ที่เกี่ยวข้อง (สิ่งที่ตรงกันข้ามกับความท้าทายนี้)


เราสามารถสมมติว่าอินพุตเป็นอาร์เรย์ 2d แทนที่จะใช้ "\ n" ได้หรือไม่?
rahnema1

@ rahnema1 ไม่ใช่อาร์เรย์ 2 มิติ แต่เป็นอาร์เรย์ / รายการของสายใช่
Rɪᴋᴇʀ

@EasterlyIrk ฉันเชื่อว่าสิ่งนี้ตกอยู่ในหมวดหมู่รูปแบบ I / O ที่ยุ่งยาก
JungHwan Min

ในตัวอย่างแรกของคุณพิกัดอยู่ในรูปแบบแต่ในตัวอย่างสุดท้ายพิกัดอยู่ในรูปแบบ(row, column) (column, row)
rahnema1

1
พิกัดสามารถทำดัชนี 1 ชุดได้หรือไม่?
user41805

คำตอบ:


1

Dyalog APL ขนาด 8 ไบต์

แสดงรายการของคู่พิกัด (แถว, คอลัมน์), จากนั้นอาร์เรย์ 2 มิติ, ตามด้วยอักขระ

∧/⎕=⎕[⎕]

[⎕] แจ้งให้พิกัดและใช้พวกเขาเพื่อกระจายเลือกจาก

อินพุตที่ได้รับพร้อมต์ (อาร์เรย์ 2 มิติ)

= เปรียบเทียบองค์ประกอบที่เลือกกับ

อินพุต (ตัวละคร)

∧/ ตรวจสอบว่าทั้งหมดเป็นจริง (และลดลง)

กรณีทดสอบ ( ⎕IO←0เพื่อจับคู่ตัวอย่าง แต่ไม่จำเป็น):

ตัวอย่างแรก

ตัวอย่างที่สอง

ตัวอย่างที่สาม

ตัวอย่างที่สี่

ตัวอย่างที่ห้า


6

Python ขนาด 39 ไบต์

รับอินพุต:

  1. aรายการ(x, y)พิกัดจำนวนเต็ม
  2. b รายการสตริง
  3. c สตริงอักขระเดียว

lambda a,b,c:{b[y][x]for x,y in a}=={c}

2
ในเว็บไซต์นี้คุณไม่จำเป็นต้องตั้งชื่อฟังก์ชั่นของคุณ f=คุณสามารถลบ ยินดีต้อนรับสู่ PPCG!
Rɪᴋᴇʀ

ยินดีต้อนรับสู่ PPCG คำตอบแรกที่ดี!
FlipTack

4

JavaScript (ES6), 37 ไบต์

รับอินพุต:

  1. aอาร์เรย์ของ[x, y]พิกัดจำนวนเต็ม
  2. s อาร์เรย์ของสตริง
  3. c สตริงอักขระเดียว

(a,s,c)=>a.every(([x,y])=>s[y][x]==c)

4

คู่, 45 38 29 ไบต์

@(A,B,C)A(1+B*[rows(A);1])==C

ฟังก์ชั่นที่รับอาร์เรย์ 2D ของตัวอักษรเป็นAและพิกัด (ตาม 0) Bเป็นเมทริกซ์คอลัมน์สองคอลัมน์[col row]และอักขระที่ตรงกันเป็นCตัวละครและการจับคู่เป็นพิกัดสององค์ประกอบ (ใช้การคูณเมทริกซ์) แปลงเป็นดัชนีเชิงเส้น

หมายเหตุ: คำตอบก่อนหน้านี้ที่ทำให้การใช้เมทริกซ์กระจัดกระจายผิด

ผู้มีส่วนร่วมอื่น ๆ :

Stewie Griffinสำหรับการประหยัด 5 ไบต์โดยสังเกตว่า [0 1 0] ถือได้ว่าเป็นค่าเท็จ !!

Luis Mendoสำหรับการบันทึก 2 ไบต์~0 == trueและแจ้งเตือนเกี่ยวกับ sparse matrix

ลองออนไลน์


2
ดี :) คุณสามารถข้ามallและบันทึกสามไบต์ 1 1 1เป็นจริงและ1 0 1เป็นเท็จในอ็อกเทฟดังนั้นจึงควรตกลง :)
Stewie Griffin

1
วิธีการที่ยอดเยี่ยม! ฉันชอบวิธีนี้ใช้ประโยชน์จากความจริงที่ว่าดัชนีเชิงตรรกะไม่จำเป็นต้องมีขนาดเท่ากันกับอาร์เรย์ที่จัดทำดัชนี
Luis Mendo

1
นอกเหนือจากข้อเสนอแนะของ Stewie คุณสามารถแทนที่trueด้วย~0เพื่อบันทึก 2 ไบต์
Luis Mendo

@StewieGriffin ขอบคุณจริง ๆ มันก็โอเค :)
rahnema1

@LuisMendo จุดดี
rahnema1

3

Mathematica ขนาด 28 ไบต์

#3~Extract~#~MatchQ~{#2...}&

1 การจัดทำดัชนี เนื่องจากวิธีการจัดโครงสร้างอาร์เรย์ใน Mathematica พิกัดอินพุตต้องถูกย้อนกลับ (เช่น(row, column))

การใช้

#3~Extract~#~MatchQ~{#2...}&[{{1, 1}, {2, 3}, {1, 4}}, "#", {{"#", "_", "#", "#"}, {"#", "_", "#", "#"}}]

True


2

Haskell, 27 ไบต์

s!c=all(\(x,y)->s!!y!!x==c)

ตัวอย่างการใช้งาน: ->( ["#_##","#_##"] ! '#' ) [(0,0), (2,1), (3,0)]True


2

เยลลี่ 10 ไบต์

ịṪ⁸ịḢð€Q⁼⁵

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

ลองออนไลน์!

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

ịṪ⁸ịḢð€Q⁼⁵  Main link.
            Left argument:  P (array of coordinate pairs)
            Right argument: S (array of strings)
            Third argument: C (singleton string)

     ð€     Combine the links to the left into a dyadic chain and call it with each
            p = (x, y) in P as left argument and S as the right one.
ị             Unindex; retrieve the strings of S at indices x and y.
 Ṫ            Tail; yield s, the string of S at index y.
  ⁸ị          Unindex; retrieve the characters of s at indices x and y.
    Ḣ         Head; yield the character of s at index x.
       Q    Unique; deduplicate the resulting string/array of characters.
        ⁼⁵  Compare the result with the third argument.

2

Perl 6 , 41 40 ไบต์

->\c,\h,\n{all map {n eq h[.[0];.[1]]},c}

->$_,\h,\n{all .map:{n eq h[.[0];.[1]]}}

คาดว่าสตริง 2D เป็นรายการ 2D

ขอบคุณ b2gills สำหรับ -1 ไบต์


หากคุณใช้$_แทนคุณ\cสามารถใช้.map:{…}การบันทึกหนึ่งไบต์
Brad Gilbert b2gills

@ BradGilbertb2gills: โอ้ฉันไม่ทราบว่าพื้นที่ว่าง.map: {…}เปล่า มีประโยชน์ที่จะรู้ นอกจากนี้ยังเป็นความอัปยศที่คำนำหน้า||ยังไม่ได้ใช้งานมันสามารถทำให้แลมบ์ดาภายในได้อย่างง่ายดายn eq h[||$_]...
smls

2

C #, 80 77 ไบต์

บันทึกแล้ว 3 ไบต์ขอบคุณ pinkfloydx33

a=>b=>c=>{foreach(var i in a){if(b[i[0]][i[1]]!=c){return 1<0;}}return 1>0;};

a คือคู่ของพิกัด b คือรายการของเส้นและ c คือสตริงอักขระเดี่ยว


คุณสามารถแทนที่falseด้วย1<0และtrueด้วย1>0และบันทึก 3 ไบต์
pinkfloydx33

1

Haskell, 72 63 ไบต์

c [] _ _ =1<2;c ((f,s):t) m n |n/=lines m!!s!!f=1>2|1>0=c t m n

อินพุตของ c [(0,0), (1,0), (3,0)] "#_##\n#_##" '#' เอาต์พุต False

อินพุต c [(4, 0), (3, 0), (2, 0), (1, 0), (0, 0), (0, 1), (0, 2), (0, 3), (1, 3), (2, 3), (2, 2), (3, 2), (4, 2), (4, 3)] " \n ####\n # \n # " ' '

เอาท์พุต True

UnGolfed

checkfunc :: [(Int,Int)] -> String -> Char -> Bool
checkfunc [] _ _ = True
checkfunc (x:xs) string char | char /= ((lines string)!!(snd x))!!(fst x)= False  -- Checks first coordinates and returns False if no match
                             | otherwise = checkfunc xs string char --Otherwise iterate over remaining coordinate pairs

ยังมีช่องว่างที่ไม่จำเป็นเหลืออยู่อีก:c[]_ _=1<2;c((f,s):t)m n|n/=lines m!!s!!f=1>2|1>0=c t m n
Laikoni

นอกจากนี้ในขณะที่คุณกำลังทำตรรกะบูลีนเงื่อนไขโดยนัยจะถูกแทนที่ด้วยif n/=lines m!!s!!f then False else c t m n n/=lines m!!s!!f&&c t m n
Laikoni

ในที่สุดขณะที่ OP บอกว่าYou may take the 2D string as a 2D list, a list of lines, or a 2D string.คุณสามารถปล่อยlinesและรับรายการบรรทัดเป็นอินพุตได้โดยตรง
Laikoni


1

Clojure 39 ไบต์

#(apply = %3(map(fn[[x y]]((%2 y)x))%))

ตัวอย่าง (อินพุตสตริงเป็น vec ของ vec ของอักขระ):

(def f #(apply = %3(map(fn[[x y]]((%2 y)x))%)))
(f [[0 0] [1 1] [3 0]] (mapv vec ["#_##" "#_##"]) \#)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.