จัดทำดัชนีภาพนิ่ง Cha-Cha


12

บทนำ:

แม้ว่าในขั้นต้นฉันจะมีเพลงดัตช์อยู่ในหัวของฉันซึ่งเนื้อเพลงคือ: " Doe 'n stapje naar voren, en' n stapje terug " (ซึ่งแปลว่า " ก้าวไปข้างหน้านิดหน่อยและถอยกลับเล็กน้อย ") เมื่อ ฉันค้นหาเนื้อเพลงเต็มฉันรู้ว่าพวกเขากลับไปมาและไม่เคยออกไปด้านข้าง

ดังนั้นตอนนี้ฉันจึงใช้เนื้อเพลงของMr C The Slide Man หรือ DJ Casper - Cha-Cha Slideสำหรับความท้าทายนี้

หากเราเพิกเฉยต่อสิ่งอื่นและดูเฉพาะคำว่า "ซ้าย", "ขวา", "ย้อนกลับ" และ "กระโดด" (ฉันนับว่า "กระโดด" เป็นไปข้างหน้า) รวมถึงจำนวนที่กล่าวถึงเพลงเต็มจะมีรายการดังต่อไปนี้ ( ฉันใช้ตัวย่อ LRBH ที่นี่):

LBHRLLBHRLBHHRRLLLRLBHHHHRRLLLBHHHHHRLRLRLHRLLBHHLRLBHH

นี่คือเนื้อเพลงเต็มเพลงใน code-snippet JavaScript ที่ซ่อนได้ (เพื่อประหยัดพื้นที่) ซึ่งการเคลื่อนไหวและจำนวนถูกล้อมรอบด้วยวงเล็บเหลี่ยมที่ถูกบล็อก:

ท้าทาย:

ตอนนี้สู่ความท้าทาย เราใช้เวลาหนึ่งสองหรือสามปัจจัย† หนึ่งในนั้นคือรายการของดัชนี - จำนวนเต็ม (ดังนั้นไม่เป็นลบสำหรับ 0 ดัชนีหรือบวกสำหรับดัชนี 1) (อินพุตอื่นเป็นทางเลือกและอธิบายไว้ในกฏการท้าทาย)

{x=0, y=0}กรณีทดสอบทุกคนจะเริ่มต้นที่ตำแหน่ง
ตอนนี้ใช้เนื้อร้องรายการของการย้ายและลบการเคลื่อนไหวทั้งหมดที่ดัชนีที่กำหนดของรายการอินพุต จากนั้น 'เดิน' ข้ามการเคลื่อนไหว (สูงสุดดัชนีที่ใหญ่ที่สุดของอินพุทอาเรย์) และส่งออกตำแหน่งที่คุณจะได้รับ

การเคลื่อนไหวจะเปลี่ยนพิกัดดังนี้:
- R: x+1
- L: x-1
- H: y+1
- B:y-1

กฏท้าทาย:

  • รายการย้ายสามารถเข้าถึงได้ในแบบที่คุณต้องการ †:สามารถป้อนข้อมูลเพิ่มเติมได้ สามารถอยู่ในไฟล์แยกบนดิสก์ที่คุณจะอ่านได้ สามารถอยู่ในตัวแปรระดับชั้นที่คุณเข้าถึง มันจะต้องอยู่ในรูปแบบของL, R, BและHแม้ (อาจจะเป็นสตริงหรือตัวละคร / รายการอาร์เรย์) ดังนั้นคุณจึงไม่สามารถบันทึกย้ายรายการเป็น1และ-1หรือจำนวนเต็ม
  • รายการย้ายที่ให้ไว้ด้านบนนั้นมีการกำหนดรหัสแบบยากและจะเหมือนเดิมเสมอ (ซึ่งเป็นเหตุผลว่าทำไมจึงควรใส่เป็นฟิลด์ระดับชั้นแทนที่จะใช้เป็นอินพุตถ้าสิ่งนี้ช่วยนับจำนวนคำตอบของคุณ)
  • รายการที่ป้อนสามารถเป็นได้ทั้งดัชนี 0 หรือดัชนี 1 ดัชนี (ขึ้นอยู่กับคุณ)
  • เราเพียง 'เดิน' การเคลื่อนไหวไปถึงและไม่รวมดัชนีที่ใหญ่ที่สุดของรายการ
    • †:คุณยังได้รับอนุญาตให้ใช้รายการสุดท้ายนี้เป็นอินพุตจำนวนเต็มแยกกันแทนที่จะเป็นรายการสุดท้ายของอินพุต - อาร์เรย์
  • ผลลัพธ์ของพิกัด x และ y ที่เราท้ายสามารถอยู่ในรูปแบบที่เหมาะสม (จำนวนเต็มประกอบด้วยสองรายการ, สตริงที่คั่นด้วย, พิมพ์ไปยัง STDOUT ในสองบรรทัดที่แยกกัน ฯลฯ )
  • คุณสามารถถือว่ารายการอินพุตถูกเรียงลำดับจากต่ำสุดไปสูงสุด (หรือสูงสุดไปต่ำสุดถ้านั่นคือสิ่งที่คุณต้องการในกรณีนี้รายการแรกคือขนาดเริ่มต้นของรายการย้าย - หากไม่ได้แยกเป็นอินพุตแยก) และจะไม่มีดัชนีที่ซ้ำกัน
  • หากดัชนีที่ใหญ่ที่สุดของรายการอินพุตมีขนาดใหญ่กว่ารายการของการเคลื่อนไหวด้านบน (55 การเคลื่อนไหวอยู่ในรายการการย้ายด้านบน) เราจะล้อมรอบไปยังจุดเริ่มต้นของรายการอีกครั้ง (หลายครั้งตามความจำเป็นขึ้นอยู่กับดัชนีที่ใหญ่ที่สุด ของอินพุต)
  • คุณได้รับอนุญาตให้ส่งออกy,xแทนx,yแต่โปรดระบุสิ่งนี้ในคำตอบของคุณหากคุณทำ

ตัวอย่าง:

การป้อนข้อมูล: [0,4,8,10,13,14,27,34,42,43,44,50,53,56,59,60,64]

นี่คือการเคลื่อนไหวและดัชนี (0 ดัชนี) เหนือสิ่งอื่น:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64
L, B, H, R, L, L, B, H, R, L, B, H, H, R, R, L, L, L, R, L, B, H, H, H, H, R, R, L, L, L, B, H, H, H, H, H, R, L, R, L, R, L, H, R, L, L, B, H, H, L, R, L, B, H, H, L, B, H, R, L, L, B, H, R, L

การลบดัชนีของรายการอินพุตเราจะมีรายการย้ายที่เหลือต่อไปนี้:

1, 2, 3, 5, 6, 7, 9,11,12,15,16,17,18,19,20,21,22,23,24,25,26,28,29,30,31,32,33,35,36,37,38,39,40,41,45,46,47,48,49,51,52,54,55,57,58,61,62,63
B, H, R, L, B, H, L, H, H, L, L, L, R, L, B, H, H, H, H, R, R, L, L, B, H, H, H, H, R, L, R, L, R, L, L, B, H, H, L, L, B, H, L, H, R, B, H, R

ตอนนี้ถ้าเราเดินจากตำแหน่ง{0, 0}เหนือท่าที่เหลือเราจะมีพิกัดใหม่ดังต่อไปนี้ทุกครั้ง:

{0,0};B,{0,-1};H,{0,0};R,{1,0};L,{0,0};B,{0,-1};H,{0,0};L,{-1,0};H,{-1,1};H,{-1,2};L,{-2,2};L,{-3,2};L,{-4,2};R,{-3,2};L,{-4,2};B,{-4,1};H,{-4,2};H,{-4,3};H,{-4,3};H,{-4,5};R,{-3,5};R,{-2,5};L,{-3,5};L,{-4,5};B,{-4,4};H,{-4,5};H,{-4,6};H,{-4,7};H,{-4,8};R,{-3,8};L,{-4,8};R,{-3,8};L,{-4,8};R,{-3,8};L,{-4,8};L,{-5,8};B,{-5,7};H,{-5,8};H,{-5,9};L,{-6,9};L,{-7,9};B,{-7,8};H,{-7,9};L,{-8,9};H,{-8,10};R,{-7,10};B,{-7,9};H,{-7,10};R,{-6,10}

ดังนั้นผลลัพธ์สุดท้ายจะเป็น: {-6, 10}

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
    อย่าปล่อยให้ภาษารหัสกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานจะใช้สำหรับคำตอบของคุณดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชัน / เมธอดพร้อมพารามิเตอร์ที่เหมาะสมและชนิดผลตอบแทนโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงค์พร้อมทดสอบรหัสของคุณ
  • นอกจากนี้ขอแนะนำให้เพิ่มคำอธิบายสำหรับคำตอบของคุณ

กรณีทดสอบ:

0-indexed input: [0,4,8,10,13,14,27,34,42,43,44,50,53,56,59,60,64]
1-indexed input: [1,5,9,11,14,15,28,35,43,44,45,51,54,57,60,61,65]
Output: {-6, 10}

0-indexed input: [55]    (Note: There are 55 moves in the unmodified list)
1-indexed input: [56]    (Note: There are 55 moves in the unmodified list)
Output: {-6, 11}

0-indexed input: [0,1,4,5,6,9,10,15,16,17,19,20,27,29,30,37,38,39,41,44,45,46,49,51,52]
1-indexed input: [1,2,5,6,7,10,11,16,17,18,20,21,28,30,31,38,39,40,42,45,46,47,50,52,53]
Output: {10, 16}

0-indexed input: [2,3,7,8,11,12,13,14,18,21,22,23,24,25,26,31,32,33,34,35,36,38,40,42,43,47,48,50,53]
1-indexed input: [3,4,8,9,12,13,14,15,19,22,23,24,25,26,27,32,33,34,35,36,37,39,41,43,44,48,49,51,54]
Output: {-18, -7}

0-indexed input: [0]
1-indexed input: [1]
Output: {0, 0}

0-indexed input: [4,6,7,11,12,13,15,17,20,28,31,36,40,51,59,66,73,74,80,89,92,112,113,114,116,120,122,125,129,134,136,140,145,156,161,162,165,169,171,175,176,178,187,191,200]
1-indexed input: [5,7,8,12,13,14,16,18,21,29,32,37,41,52,60,67,74,75,81,90,93,113,114,115,117,121,123,126,130,135,137,141,146,157,162,163,166,170,172,176,177,179,188,192,201]
Output: {-17, 37}

0-indexed input: [25,50,75,100,125,150,175,200,225,250]
1-indexed input: [26,51,76,101,126,151,176,201,226,251]
Output: {-28, 49}

เราสามารถส่งออกพิกัดในลำดับย้อนกลับได้หรือไม่?
Shaggy

3
@ Shaggy Umm แน่นอนทำไมล่ะ ตราบใดที่คุณระบุไว้อย่างชัดเจนในคำตอบของคุณ
Kevin Cruijssen

@Arnauld ใช่การเคลื่อนไหวเหล่านั้นจะปรากฏขึ้นและจะไม่เปลี่ยนแปลง ฉันอาจจะอธิบายให้ชัดเจนยิ่งขึ้นถ้ามันยังไม่ชัดเจน (ซึ่งเป็นสาเหตุที่คุณสามารถใช้เป็นฟิลด์ระดับคลาส hardcoded หากมันจะเป็นประโยชน์ต่อจำนวนไบต์ของคุณ)
Kevin Cruijssen

เอาต์พุตสามารถเป็นแบบคู่ได้หรือไม่?
Jakob

1
สายไปถึงความท้าทายมาก แต่กรณีทดสอบสองกรณีของคุณดูเหมือนจะมีการป้อนข้อมูลผิดสำหรับกรณีที่มีการจัดทำดัชนี 1: 82 พิเศษในหนึ่งในหกและ 29 แทน 39 ใน 39 testcase ที่สาม (การเรียงลำดับบ่งชี้ว่าคุณอาจตั้งใจ เป็นจริง 28/29 แต่ผลลัพธ์ที่คาดหวังแสดงมาจากการใช้ 38/39 ที่นั่น)
sundar - Reinstate Monica

คำตอบ:


4

05AB1E , 15 12 ไบต์

บันทึก 3 ไบต์ด้วยErik the Outgolfer

ÝsKèIêRS¢2ôÆ

ลองออนไลน์! หรือเป็นชุดทดสอบ

คำอธิบาย

Ý                 # push range [0 ... input_int]
 sK               # remove all elements in input_list from this range
   è              # cyclically index into the moves-list with the remaining elements
    Iê            # push the unique chars of the move-list, sorted
      R           # reverse
       S¢         # count the occurrences of each char in "RLHB"
         2ô       # split into 2 parts
           Æ      # reduce each part by subtraction

1
คำตอบที่ดี! ยังไม่รู้Æด้วยซ้ำ วิธีที่ชาญฉลาดในการนับการเคลื่อนไหวทั้งหมดและใช้Æในการคำนวณความแตกต่างสำหรับRLและBHคู่
Kevin Cruijssen

Æมีอยู่ตลอดไปใช่ไหม? ฉันจะถือว่าเป็นเพราะฉันไม่รู้เกี่ยวกับมัน ดูเหมือนว่าคำสั่งที่ฉันคิดว่าเป็น "ใหม่" มีอยู่ตั้งแต่เริ่มก่อตั้ง แต่ฉันไม่เคยรู้วิธีการใช้พวกเขาฮ่า ๆ โอ้ +1
Magic Octopus Urn

@MagicOctopusUrn: มันมีอยู่จริงตลอดไป)
Emigna

7

ทับทิม , 98 ... 58 55 ไบต์

->a{([*0..a[-1]]-a).sum{|c|-1i**(m[c%55].ord%19)}.rect}

ลองออนไลน์!

คำอธิบาย:

เคล็ดลับหลักคือการใช้ตัวเลขที่ซับซ้อนเพื่อเป็นตัวแทนของการเคลื่อนไหว: 'B' คือ -i, 'H' คือ + i, 'L' คือ -1 และ 'R' คือ +1 หากเราแปลงการเคลื่อนไหวทั้งหมดเป็นจำนวนเชิงซ้อนแล้วเราจะได้ผลลัพธ์ที่ถูกต้อง

ฉันลองวิธีที่แตกต่างกัน แต่จากนั้นฉันก็พบความมหัศจรรย์หมายเลข 19: เราไม่ต้องเล่นซอกับการจับคู่ regex เพราะ:

B  is ASCII 66; 66%19=9  and i^9  = i
H  is ASCII 72; 72%19=15 and i^15 =-i
L  is ASCII 76; 72%19=0  and i^0  = 1
R  is ASCII 82; 82%19=6  and i^6  =-1

ดังนั้นใส่ทั้งหมดเข้าด้วยกันผลรวมกลับสัญญาณและเราเสร็จแล้ว

ขอบคุณ Jakob สำหรับ -3 ไบต์


การใช้ตัวเลขที่ซับซ้อนอย่างชาญฉลาด! เนื่องจากสตริงย้ายได้รับการแก้ไขคุณสามารถแทนที่ด้วย(m*c+m)[c] m[c%55]
Jakob

4

JavaScript (ES6), 85 ไบต์

ตามกฎการท้าทายรหัสนี้คาดว่าสตริงโกลบอลขอบเขตmจะเก็บรายการการเคลื่อนไหว (ประหยัด 3 ไบต์ตามที่แนะนำโดย @KevinCruijssen)

รับอินพุตเป็นรายการดัชนีที่ใช้ดัชนีเรียงลำดับจากต่ำสุดไปหาสูงสุด

a=>a.map(g=i=>j++<i&&g(i,p=m.search(m[~-j%55])*3%5,x+=--p%2,y-=--p%2),j=x=y=0)&&[x,y]

ลองออนไลน์!

อย่างไร?

"LBHR..."ตัวละครย้ายแต่ละครั้งจะถูกแปลงเป็นตำแหน่งในสายการย้าย เราคูณผลโดย3และใช้แบบโมดูโล5ซึ่งจะช่วยให้พี จากนั้นเรามี:

  • dx = ((p-1) mod 2)
  • dy = - ((p-2) mod 2)

ที่ไหนสัญลักษณ์ของพอควรขเป็นที่ของ

 character | position | * 3 | mod 5 | dx | dy
-----------+----------+-----+-------+----+----
    'L'    |     0    |  0  |   0   | -1 |  0
    'B'    |     1    |  3  |   3   |  0 | -1
    'H'    |     2    |  6  |   1   |  0 | +1
    'R'    |     3    |  9  |   4   | +1 |  0

3

เยลลี่ 14 ไบต์

Rḟị⁵ċⱮ⁵QṢṚ¤_2/

ลองออนไลน์!

อาร์กิวเมนต์ 1 / อาร์กิวเมนต์ซ้าย: ดัชนีสูงสุด 1 รายการ
อาร์กิวเมนต์ 2 / อาร์กิวเมนต์ขวา: ดัชนี 1 รายการ
อาร์กิวเมนต์ 3: ย้ายรายการเป็นสตริง ฟังก์ชั่นยังคงนำมาใช้ใหม่หากอาร์กิวเมนต์บรรทัดคำสั่งที่สามถูกใช้เพื่อจุดประสงค์นี้


3

Java 10, 129 119 112 107 100 86 ไบต์

a->m->{var r=new int[2];for(;m-->0;)r[s[m%55]/73]-=a.add(m)?s[m%55]*3%5-2:0;return r;}

ใช้ค่าสูงสุดเป็นอินพุตเพิ่มเติม รายการย้ายเป็นอาเรย์ตัวละครในระดับชั้น

แรงบันดาลใจจาก@Emignaคำตอบ 05AB1E 's
-7 ไบต์ขอบคุณที่@Jakob
-14 ไบต์ขอบคุณที่@Geobits

ลองออนไลน์

คำอธิบาย:

a->m->{              // Method with Integer-Set & int parameters and int-array return
  var c=new int[2];  //  [x,y] result-array, starting at {0,0}
  for(;m-->0;)       //  Use the `m` input as index, and loop in the range (`m`, 0]
    r[s[m%55]/73]-=  //   Subtract from either x or y based on the character:
     a.add(m)?       //    If the input-set doesn't contain the current index `m`:
      s[m%55]*3%5-2  //     Modify the x or y coordinate based on the character
     :               //    Else:
      0;             //     Leave the x or y coordinate unchanged
  return r;}         //  Return count(R)-count(L) and count(H)-count(B) as result

s[m%55]/73แผนที่ไปยังพิกัด x หรือ y ขึ้นอยู่กับตัวละคร ( ลองออนไลน์ ):

Letter    Unicode value    /73

B         66               0
H         72               0
L         76               1
R         82               1

s[m%55]*3%5-2แม็พกับอักขระที่ถูกต้อง+1หรือ-1ขึ้นอยู่กับ ( ลองออนไลน์ ):

Letter    Unicode value    *3     %5    -2

B         66               198    3     1
H         72               216    1     -1
L         76               228    3     1
R         82               246    1     -1

1
หากคุณใช้รายการดัชนีเป็นชุดที่ไม่แน่นอนคุณสามารถใช้a.add(m)เป็นifเงื่อนไขได้
Jakob

และสามารถint c[] int[]c
Jakob

1
@Jakob อาint c[]มาจากรุ่นก่อนหน้านี้ที่ผมยังคงใช้ดัชนีแทนการใช้i mและฉลาดในการใช้ชุดaddแทนที่จะ!containsขอบคุณ!
Kevin Cruijssen

1
คุณสามารถหลีกเลี่ยงการลบ byte-hogging ได้ในตอนท้ายโดยใช้c[2]แกน (กับs[m%55]/73) และเดินด้วยบางอย่างเช่น3*s[m%55]%5-2(ฉันหวังว่าฉันจะได้เห็นวิธีที่จะย่อให้สั้นลง แต่ ... ) พร้อมกับประกอบไปด้วยประกอบไปด้วยa->m->{var c=new int[2];for(;m-->0;)c[s[m%55]/73]-=a.add(m)?3*s[m%55]%5-2:0;return c[1]+","+c[0];}98.
Geobits

@Geobits ขอบคุณ! และมากกว่า -12 ไบต์โดยเพียงแค่คืนค่าint[]แทนที่จะเป็นสตริง :)
Kevin Cruijssen

2

Python 3, 85 ไบต์

bคือรายการดัชนี (a set) และlเป็นดัชนีสิ้นสุด รายการย้าย (สตริงหรือรายชื่อตัวละคร) sจะปรากฏขึ้นฟรี นี่คือพอร์ตของคำตอบ RubyของGBและคำอธิบายของวิธีการสามารถพบได้ที่นั่น

def f(b,l):r=sum(-1j**(ord(s[i%55])%19)for i in set(range(l))-b);print(r.real,r.imag)

ลองออนไลน์

Ungolfed

def f(b, l):
    r = sum(
        -1j ** (ord(s[i % 55]) % 19)
        for i in set(range(l)) - b
    );
    print(r.real, r.imag)


1

ทำความสะอาด , 148 ... 130 ไบต์

import StdEnv
$i=foldr(\a(x,y)|any((==)a)i=(x,y)=case m.[a rem 55]of'H'=(x,y+1);'B'=(x,y-1);'L'=(x-1,y);_=(x+1,y))(0,0)[0..last i]

ลองออนไลน์!

กำหนดฟังก์ชั่น$ :: [Int] -> (Int, Int)โดยใช้รายการของดัชนี (เรียงลำดับจากที่เล็กที่สุดไปหามากที่สุด) ที่จะถูกลบออกจากการเคลื่อนไหวก่อนที่จะfoldrทำการดำเนินการที่(0,0)เกี่ยวข้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.