สร้างอาร์เรย์ลูป


15

บทนำ

อาร์เรย์ชี้เป็นอาร์เรย์Lของจำนวนเต็มภัณฑ์ที่0 ≤ L[i]+i < len(L)ถือสำหรับดัชนีทั้งหมดi(สมมติว่าการจัดทำดัชนี 0-based) เรากล่าวว่าดัชนีi ชี้L[i]+iดัชนี อาร์เรย์ชี้เป็นห่วงlen(L)ถ้าดัชนีรูปแบบรอบเดียวของความยาว นี่คือตัวอย่างบางส่วน:

  • [1,2,-1,3]ไม่ใช่อาร์เรย์ตัวชี้เนื่องจาก3ไม่ได้ชี้ไปที่ดัชนี
  • [1,2,-1,-3]เป็นตัวชี้อาร์เรย์ -1แต่ไม่ห่วงเพราะไม่มีจุดดัชนีไป
  • [2,2,-2,-2] เป็นอาร์เรย์ของตัวชี้ แต่ไม่ใช่การวนซ้ำเนื่องจากดัชนีจะฟอร์มสองรอบ
  • [2,2,-1,-3] เป็นห่วง

อินพุต

ข้อมูลที่คุณป้อนเป็นรายการที่ไม่ใช่ค่าว่างของจำนวนเต็มไม่ใช่ศูนย์ในรูปแบบที่เหมาะสม มันอาจจะไม่เรียงกันและ / หรือมีรายการที่ซ้ำกัน

เอาท์พุต

เอาต์พุตของคุณจะเป็นลูปที่มีจำนวนเต็มทั้งหมดในรายการอินพุต (และอาจเป็นจำนวนเต็มอื่น ๆ ด้วย) นับหลายหลาก พวกเขาไม่จำเป็นต้องเกิดขึ้นในลำดับเดียวกันกับในอินพุตและเอาท์พุทไม่จำเป็นต้องน้อยที่สุดในทุกแง่มุม

ตัวอย่าง

สำหรับการป้อนข้อมูล[2,-4,2], [2,2,-1,1,-4]การส่งออกได้รับการยอมรับจะเป็น

กฎและการให้คะแนน

คุณสามารถเขียนโปรแกรมเต็มรูปแบบหรือฟังก์ชั่น จำนวนไบต์ต่ำสุดที่ชนะและช่องโหว่มาตรฐานไม่ได้รับอนุญาต การรวมตัวอย่างอินพุตและเอาต์พุตตัวอย่างสองสามคำตอบของคุณนั้นเป็นสิ่งที่น่าชื่นชม

กรณีทดสอบ

input -> some possible output(s)เหล่านี้จะได้รับในรูปแบบ

[1] -> [1,-1] or [1,1,1,-3]
[2] -> [2,-1,-1] or [1,2,-2,-1]
[-2] -> [1,1,-2] or [3,1,2,-2,-4]
[2,-2] -> [2,-1,1,-2] or [2,-1,2,-2,-1]
[2,2,2] -> [2,-1,2,-2,2,-2,-1] or [2,2,2,2,-3,-5]
[2,-4,2] -> [2,2,-1,1,-4] or [2,5,1,1,1,-4,2,-7,-1]
[3,-1,2,-2,-1,-5] -> [2,3,-1,2,-1,-5] or [3,3,-1,-1,2,2,-1,6,1,1,1,1,-12,-5]
[-2,-2,10,-2,-2,-2] -> [10,-1,1,-2,-2,1,-2,-2,1,-2,-2]
[-15,15,-15] -> [15,-1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,-15,-15]
[1,2,3,4,5] -> [1,2,3,-1,4,-1,5,-1,-1,-9,-1,-1]

คำตอบ:


11

เยลลี่ 12 ไบต์

ż~Ṣ€FxA$;L$U

ลองออนไลน์!

พื้นหลัง

พิจารณาคู่ของจำนวนเต็มn ~ nที่n ≥ 0และ~หมายถึงค่าที่เหมาะสมไม่เช่น~ n = - (n + 1)

โดยการวางnสำเนาของnไปทางซ้ายของn + 1สำเนาของ~ nหากเราเริ่มสำรวจอาร์เรย์ของตัวชี้จากด้านขวาสุด~ nเราจะสำรวจองค์ประกอบ2n + 1 ทั้งหมดและพบว่าตัวเองอยู่ทางซ้ายของnซ้ายสุด.

ตัวอย่างเช่นถ้าn = 4 :

X  4  4  4  4  -5 -5 -5 -5 -5
                            ^
            ^
                         ^
         ^
                      ^
      ^
                   ^
   ^
                ^
^

สำหรับกรณีพิเศษn = 0องค์ประกอบnเองจะถูกทำซ้ำ0ครั้งโดยปล่อยสิ่งนี้:

X -1
   ^
^

สำหรับแต่ละจำนวนเต็มkในการป้อนข้อมูลที่เราสามารถสร้างคู่n ~ nที่มีkโดยการตั้งค่าn = kถ้าk> 0และn = ~ kถ้าk <0 งานนี้เพราะ~เป็นร่วมด้วยเช่น~~ k = k

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

ตัวอย่าง

[1] -> [3, 1, -2, -2]
[2] -> [5, 2, 2, -3, -3, -3]
[-2] -> [3, 1, -2, -2]
[2, -2] -> [8, 1, -2, -2, 2, 2, -3, -3, -3]
[2, 2, 2] -> [15, 2, 2, -3, -3, -3, 2, 2, -3, -3, -3, 2, 2, -3, -3, -3]
[2, -4, 2] -> [17, 2, 2, -3, -3, -3, 3, 3, 3, -4, -4, -4, -4, 2, 2, -3, -3, -3]
[3, -1, 2, -2, -1, -5] -> [26, 4, 4, 4, 4, -5, -5, -5, -5, -5, -1, 1, -2, -2, 2, 2, -3, -3, -3, -1, 3, 3, 3, -4, -4, -4, -4]
[-2, -2, 10, -2, -2, -2] -> [36, 1, -2, -2, 1, -2, -2, 1, -2, -2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, 1, -2, -2, 1, -2, -2]
[-15, 15, -15] -> [89, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15]
[1, 2, 3, 4, 5] -> [35, 5, 5, 5, 5, 5, -6, -6, -6, -6, -6, -6, 4, 4, 4, 4, -5, -5, -5, -5, -5, 3, 3, 3, -4, -4, -4, -4, 2, 2, -3, -3, -3, 1, -2, -2]

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

ż~Ṣ€FxA$;L$U  Main link. Argument: A (list of integers)

 ~            Yield the bitwise not of each k in A.
ż             Zipwith; pair each k in A with ~k.
  Ṣ€          Sort each pair, yielding [~n, n] with n ≥ 0.
    F         Flatten the list of pairs.
       $      Combine the previous two links into a monadic chain:
      A         Yield the absolute values of all integers in the list.
                |n| = n and |~n| = |-(n + 1)| = n + 1
     x          Repeat each integer m a total of |m| times.
          $   Combine the previous two links into a monadic chain:
         L      Yield the length of the generated list.
        ;       Append the length to the list.
           U  Upend; reverse the generated list.

คุณไม่จำเป็นต้องจัดการกับกรณีพิเศษn = 0เพราะสเป็คบอกว่า " จำนวนเต็มไม่ใช่ศูนย์ "
Peter Taylor

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