ลิลลี่แพดกระโดด


24

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

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

คุณผ่านรายการจำนวนเต็มซึ่งแสดงถึงการข้ามของเขา คุณต้องแสดงผลลัพธ์ของการข้ามของเขา

ตัวอย่างเช่นสมมติว่าคุณผ่าน[2,3,6,8,2]:

กบของเราเริ่มต้นด้วยการกระโดดแผ่นลิลลี่ 2 แผ่นไปข้างหน้า:

_2

จากนั้น 3 แผ่นลิลลี่กลับ:

3__2

จากนั้นไปข้างหน้า 6 แผ่นลิลลี่:

3__2__6

8 หลัง:

8_3__2__6

จากนั้นในที่สุดดอกลิลลี่ 2 แผ่นจะไปข้างหน้า (สังเกตว่า 2 เขียนทับ 3):

8_2__2__6

หากต้องการให้ชัดเจนยิ่งขึ้น: ข้อมูลที่คุณป้อนเข้ามาเป็นจำนวนตัวเลขSคุณต้องแสดงผลลัพธ์S[K]ที่ตำแหน่งS[K] - S[K-1] + S[K-2] - S[K-3]...นั้น

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

กรณีทดสอบ:

5                   ____5
2,2                 2_2
4,3,2,1             3124
5,3,2,1             _3125
2,3,6,8,2           8_2__2__6
10,3,12,4,1,12,16   ___12__3__10____41__1216
100,4,7,2,2         _______________________________________________________________________________________________4___1002_2

นี่คือดังนั้นตอบคำถามให้ตัวละครน้อยที่สุด!


13
ฉันสงสัยว่าใครดู Numberphile บ้าง
Okx

3
ดังนั้นจึงมีจะเป็นความท้าทายสำหรับทุกวิดีโอ Numberphile แล้ว ...
Fatalize


5
@ ทำให้ฉันเห็นว่าไม่มีอะไรผิดปกติ
orlp

คำตอบ:


9

MATL , 35 34 ไบต์

ขอบคุณ@Emignaสำหรับการบันทึก 1 ไบต์!

32Oittn:oEq*Yst1hX<-Q(Vh' 0'95ZtXz

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

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

ตีกอล์ฟรหัสของคุณไม่ใช่คำอธิบายของคุณ!

ข้อมูลต่อไปนี้ใช้อินพุต[2,3,6,8,2]เป็นตัวอย่าง หากต้องการดูผลลัพธ์ระดับกลางในรหัสจริงคุณอาจต้องการแทรก%(สัญลักษณ์ความคิดเห็น) เพื่อหยุดโปรแกรมที่จุดนั้นและดูเนื้อหาสแต็ก ตัวอย่างเช่นนี้แสดงสแต็กหลังคำสั่งYs(ผลรวมสะสม)

32       % Push 32 (ASCII for space)
O        % Push 0
i        % Input array
         % STACK: 32, 0, [2,3,6,8,2]
t        % Duplicate
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2]
tn:      % Push [1 2 ... n] where n is length of input array
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2], [1,2,3,4,5]
o        % Modulo 2
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2], [1,0,1,0,1]
Eq       % Multiply by 2, subtract 1
         % STACK: 32, 0, [2,3,6,8,2], [2,3,6,8,2], [1,-1,1,-1,1]
*        % Multiply elementwise
         % STACK: 32, 0, [2,3,6,8,2], [2,-3,6,-8,2]
Ys       % Cumulative sum
         % STACK: 32, 0, [2,3,6,8,2], [2,-1,5,-3,1]
         % The top-most array is the positions where the entries of the second-top
         % array will be written. But postions cannot be less than 1; if that's
         % the case we need to correct so that the minimum is 1. If this happens,
         % it means that the frog has gone further left than where he started
t        % Duplicate
1hX<     % Append 1 and compute minimum. So if the original minimum is less than 1
         % this gives that minimum, and if it is more than 1 it gives 1
         % STACK: 32, 0, [2,3,6,8,2], [2,-1,5,-3,1], -3
-        % Subtract
         % STACK: 32, 0, [2,3,6,8,2], [5 2 8 0 2]
Q        % Add 1
         % STACK: 32, 0, [2,3,6,8,2], [6 3 9 1 3]
(        % Assign values (top array) to specified positions (second-top) into array
         % which contains a single 0 (third-top). Newer values overwrite earlier
         % values at the same position
         % STACK: 32, [8 0 2 0 0 2 0 0 6]
V        % Convert to string. This produces spaces between the numbers
         % STACK: 32, '8 0 2 0 0 2 0 0 6'
h        % Concatenate with initial 32 (space). This converts to char
         % STACK: ' 8 0 2 0 0 2 0 0 6'
         % Thanks to this initial space, all zeros that need to be replaced by '_'
         % are preceded by spaces. (In this example that initial space would not
         % be needed, but in other cases it will.) Other zeros, which are part of
         % a number like '10', must not be replaced
' 0'     % Push this string: source for string replacement
         % STACK: ' 8 0 2 0 0 2 0 0 6', ' 0 '
95       % Push 95 (ASCII for '_'): target for string replacement
         % STACK: ' 8 0 2 0 0 2 0 0 6', ' 0 ', 95
Zt       % String replacement
         % STACK: ' 8_2__2__6'
Xz       % Remove spaces. Implicit display
         % STACK: '8_2__2__6'

ฉันคิดว่าคุณสามารถบันทึกสองไบต์โดยแทนที่'0'แทน' 0 'เพราะXzลบช่องว่างหลังจาก
B. Mehta

1
@ B.Mehta ขอบคุณ ผมเริ่มไม่ว่า แต่น่าเสียดายที่มันไม่ได้ทำงานแล้วเพราะ'0'ใน'10'ได้รับการแทนที่เกินไป นั่นเป็นเหตุผลที่ฉันเพิ่มเริ่มต้น32ด้วย
Luis Mendo

แน่นอนความผิดพลาดของฉัน
B. Mehta

@ B.Mehta ไม่มันไม่ชัดเจนเลยจากคำอธิบายของฉัน ฉันจะชี้แจงว่าในภายหลัง
หลุยส์เมนโด

1
อาร์เรย์ mod 2 กลับด้านในคำอธิบาย และยังใช้' 0'งานไม่ได้เช่นกัน?
Emigna

4

PHP, 100 101 99 104 ไบต์

for($p=-1;$d=$argv[++$k];+$i<$p?:$i=$p,$x>$p?:$x=$p)$r[$p+=$k&1?$d:-$d]=$d;for(;$i<=$x;)echo$r[$i++]?:_;

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่ง -nrทำงานด้วย

ทำให้พังถล่ม

for($p=-1;          // init position
    $d=$argv[++$k]; // loop $d through command line arguments
    +$i<$p?:$i=$p,          // 3. $i=minimum index
    $x>$p?:$x=$p            // 4. $x=maximum index
)
    $r[
        $p+=$k&1?$d:-$d     // 1. jump: up for odd indexes, down else
    ]=$d;                   // 2. set result at that position to $d
for(;$i<=$x;)           // loop $i to $x inclusive
    echo$r[$i++]?:_;        // print result at that index, underscore if empty

วิธีนี้จัดการกับอินพุตตัวอย่าง2,3,6,8,2ที่8กระโดด "ย้อนหลัง" ผ่าน "เริ่มต้น" ของแผ่นรองลิลลี่อย่างไร
AdmBorkBork

@AdmBorkBork PHP รองรับดัชนีอาเรย์เชิงลบ
ติตัส

อ่าไม่รู้เช่นนั้น ขอบคุณ!
AdmBorkBork

4

JavaScript (ES6), 99 107 ไบต์

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

f=(a,x='',p=M=0)=>a.map(n=>x[(p-=(i=-i)*n)<m?m=p:p>M?M=p:p]=n,i=m=1)&&x?x.join``:f(a,Array(M-m).fill`_`,-m)

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

ฟังก์ชั่นนี้ทำงานในสองรอบ:

  • ในช่วงแรกที่ผ่าน:

    • ของกบตัวชี้ ' จะเริ่มต้นที่จะp0
    • xตัวแปรถูกตั้งค่าเป็นสตริงที่ว่างเปล่าเพื่อที่พยายามทุกวิถีทางที่จะแก้ไขมันก็จะถูกละเลย
    • เราคำนวณmและซึ่งเป็นลำดับค่าต่ำสุดและสูงสุดของMp
    • f()ในตอนท้ายของการส่งผ่านนี้เราทำโทร recursive
  • ในระหว่างรอบที่สอง:

    • p-mจะเริ่มต้นที่จะ
    • xถูกตั้งค่าเป็นอาร์เรย์ขนาดM-mเต็มไปด้วย_อักขระ
    • xเราแทรกหมายเลขในตำแหน่งที่ถูกต้องใน
    • ในตอนท้ายของบัตรผ่านนี้: เราส่งคืนเวอร์ชันที่เข้าร่วมxซึ่งเป็นผลลัพธ์สุดท้าย

กรณีทดสอบ


นี้ล้มเหลวสำหรับกรณีที่กบกระโดดด้านล่างดัชนี -998 หรือสูงกว่า 1002. ตัวอย่าง: [1100]ผลในจำนวนพิมพ์ที่ตำแหน่งแทนตำแหน่ง1002 1100
2560

1
@nderscore นี่ได้รับการแก้ไขแล้วที่ราคา 8 ไบต์
Arnauld

! น่ากลัว วิธีการที่ดียัง :)
nderscore

4

R , 100 97 96 ไบต์

function(x){p=cumsum(x*c(1,-1))[seq(x^0)]
p=p+max(1-p,0)
v=rep('_',max(p));v[p]=x
cat(v,sep='')}

ลองออนไลน์!

บรรทัดที่ 1 ค้นหาตำแหน่งทั้งหมดที่จะกระโดด ขั้นแรกการกระโดดทั้งหมดxจะถูกคูณด้วย 1 หรือ −1 จากนั้นแปลงเป็นตำแหน่งสุดท้ายโดยใช้การรวมแบบสะสม เวกเตอร์c(-1,1)จะถูกนำกลับมาใช้ใหม่หากจำเป็นอย่างไรก็ตามเมื่อxมีความยาว 1 xจะถูกนำไปรีไซเคิลแทน ดังนั้นจะพิจารณาเฉพาะผลรวมseq(x^0)(เทียบเท่าseq_along(x)) (คำเตือนจะถูกสร้างขึ้นเมื่อความยาวxไม่เท่ากับ 2 แต่ไม่มีผลกับผลลัพธ์)

บรรทัดที่ 2 เพิ่มตำแหน่งการกระโดดเพื่อให้ทุกอย่างน้อย 1

บรรทัดที่ 3 และ 4 สร้างผลลัพธ์และพิมพ์

by1 ไบต์จากGiuseppe


เคล็ดลับเรียบร้อยด้วยseq(x^0)!
Giuseppe

-p+1สามารถ1-pน้อยกว่าหนึ่งไบต์
Giuseppe

@Giuseppe อ่าขอบคุณมาก!
Robert Hacken

3

Javascript (ES6), 109 ไบต์

f=x=>x.map((y,i)=>o[j=(j-=i%2?y:-y)<0?o.unshift(...Array(-j))&0:j]=y,o=[],j=-1)&&[...o].map(y=>y||'_').join``
<!-- snippet demo: -->
<input list=l oninput=console.log(f(this.value.split(/,/)))>
<datalist id=l><option value=5><option value="4,3,2,1"><option value="5,3,2,1"><option value="2,3,6,8,2"><option value="10,3,12,4,1,12,16"><option value="100,4,7,2,2"></datalist>

แสดงความคิดเห็น:

f=x=>x.map((y,i)=>o[j=(j-=i%2?y:-y)<0?o.unshift(...Array(-j))&0:j]=y,o=[],j=-1)&&[...o].map(y=>y||'_').join``
                /* initialize output array [] and index j at -1: */  o=[],j=-1
     x.map((y,i)=> /* iterate over all items in input x (y=item, i=index) */  )
                      (j-=i%2?y:-y) /* update j +/-y based on if index i is odd */
                                   <0? /* if resulting j index is less than zero */
                                      o.unshift(...Array(-j)) /* prepend -j extra slots to the output array */
                                                             &0 /* and give result 0 */
                                                               :j /* else give result j */
                    j= /* assign result to j */
                  o[ /* assign y to output array at index j */   ]=y
   /* short-circuit && then spread output array to fill any missing entries */ &&[...o]
                                                      /* fill falsey slots with '_' */ .map(y=>y||'_')
                                                                         /* join with empty spaces */ .join``

3

Perl 6 , 68 67 ไบต์

{(my @a)[[[\+] |(1,-1)xx*Z*$_].&{$_ X-min 1,|$_}]=$_;[~] @a X//"_"}

ลองออนไลน์!

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

ก่อนอื่นให้กำหนดตำแหน่งของการกระโดดสะสม:

[[\+] |(1,-1)xx*Z*$_]
                  $_  # Input array.          e.g.  2, 3, 6, 8, 2
      |(1,-1)xx*      # Infinite sequence:          1,-1, 1,-1, 1...
                Z*    # Zip-multiplied.       e.g.  2,-3, 6,-8, 2
 [\+]                 # Cumulative addition.  e.g.  2,-1, 5,-3,-1

จากนั้นจะเปลี่ยนเป็นดัชนีอาเรย์แบบ 0 โดยการลบจำนวนขั้นต่ำ (แต่ไม่เกิน 1) จากตัวเลขทั้งหมด:

.&{$_ X-min 1,|$_}    #                       e.g.  5, 2, 8, 0, 2

จากนั้นมันจะสร้างอาร์เรย์ที่มีหมายเลขอินพุตที่กำหนดให้กับดัชนีเหล่านั้น:

(my @a)[   ]=$_;      #                       e.g.  8, Nil, 2, Nil, Nil, 2 Nil, Nil, 6

ในที่สุดมันก็เชื่อมต่ออาร์เรย์กับสตริงโดยมีเครื่องหมายขีดเส้นใต้แทนที่องค์ประกอบที่ไม่ได้กำหนด:

[~] @a X//"_"         #                       e.g.  8_2__2__6

3

เยลลี่ ,  28  24 ไบต์

-2 (และอนุญาตเพิ่มเติมอีก -2) ขอบคุณ FrownyFrog (ใช้ฟังก์ชัน [post-challenge] ของแอปพลิเคชันคำนำหน้าอย่างรวดเร็วƤ)

ṚƤḅ-µCṀ»0+µṬ€×"³Ṛo/o”_;⁷

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

อย่างไร?

ṚƤḅ-µCṀ»0+µṬ€×"³Ṛo/o”_;⁷ - Main link: list a       e.g. [ 5, 3, 2, 1]
 Ƥ                       - prefix application of:
Ṛ                        -  reverse                e.g. [[5],[3,5],[2,3,5],[1,2,3,5]]
   -                     - literal minus one
  ḅ                      - from base (vectorises)  e.g. [ 5, 2, 4, 3]=
    µ                    - start a new monadic chain - call that list c
                         - [code to shift so minimum is 1 or current minimum]
     C                   - complement (vectorises) e.g. [-4,-1,-3,-2]
      Ṁ                  - maximum                 e.g.     -1
       »0                - maximum of that & zero  e.g.      0
         +               - add to c (vectorises)   e.g. [ 5, 2, 4, 3]
          µ              - start a new monadic chain - call that list d
           Ṭ€            - untruth €ach            e.g. [[0,0,0,0,1],[0,1],[0,0,0,1],[0,0,1]]
               ³         - the program input (a)
             ×"          - zip with multiplication e.g. [[0,0,0,0,5],[0,3],[0,0,0,2],[0,0,1]]
                Ṛ        - reverse                      [[0,0,1],[0,0,0,2],[0,3],[0,0,0,0,5]]
                 o/      - reduce with or          e.g. [0,3,1,2,5]
                    ”_   - '_'
                   o     - or (replace 0 with '_') e.g. ['_',3,1,2,5]
                      ;⁷ - concatenate a newline   e.g. ['_',3,1,2,5, '\n']
                         - implicit print

หมายเหตุ:

concatenation สุดท้ายของการขึ้นบรรทัดใหม่, ;⁷สำหรับกรณีที่ไม่_ปรากฏในการส่งออกซึ่งในกรณีที่พิมพ์โดยปริยายจะแสดงเป็นตัวแทนของรายการเช่นมากกว่าสิ่งที่ต้องการตัวอย่างเช่น[3, 1, 2, 4] _3125สำหรับการขึ้นบรรทัดใหม่ที่ไม่มีใครสามารถแทนที่;⁷ด้วย;““เพื่อผนวกรายการของรายการอักขระ[[''],['']](ไม่จำเป็นต้องปิดเนื่องจากเป็นอักขระตัวสุดท้ายของโปรแกรม)

ฟังก์ชั่น untruth, Ṭ, แสดงรายการที่1s ที่ดัชนีในอินพุทของมัน, สำหรับจำนวนธรรมชาติเดียว, nนั่นคือn-1 0 s ตามด้วยการ1อนุญาตให้ใส่ตัวเลขที่อยู่ห่างจากซ้ายโดยการคูณที่ถูกต้อง . การกลับรายการ, เป็นสิ่งจำเป็นที่จะมีในภายหลังกบเข้าชมเขียนทับมากกว่าก่อนหน้านี้คนที่เมื่อลดลงด้วยหรือo/จะดำเนินการ


1,-ṁ×µ+\UƤ_@/€?
FrownyFrog

Ƥไม่ใช่คุณลักษณะ ณ จุดที่ถูกเขียน แต่ใช่ว่าจะใช้ได้ ดีกว่าคือUƤḅ€-(เนื่องจากการแปลงจากฐาน -1 เป็นเหมือนการคูณด้วย...,1,-1,1,-1,1,-1,1แล้วรวม)
Jonathan Allan

... หรือแม้กระทั่งUƤḅ-ตั้งแต่vectorises :) (ฉันยังไปกับย้อนกลับธรรมดาเนื่องจากเราไม่จำเป็นต้องซับซ้อนของคว่ำที่U)
โจนาธานอัลลัน

1

APL (Dyalog Unicode) , 45 30 ไบต์SBCS

{∊⍕¨⍵@i⍴∘'_'⌈/1+i←(⊢-1⌊⌊/)-\⍵}

ลองออนไลน์!

-\⍵สแกนอาร์กิวเมนต์ด้วยการสลับ-และ+

(⊢ - 1 ⌊ ⌊/)จากนั้น ( ) ลบ 1 หรือต่ำสุด ( ⌊/) แล้วแต่จำนวนใดจะน้อยกว่า ( )

i← มอบหมายให้ i

⌈/ 1+ เพิ่มขึ้นและใช้เวลาสูงสุด

⍴∘'_' ผลิตที่ขีดเส้นใต้จำนวนมาก

⍵@iใส่ตัวเลขจากอาร์กิวเมนต์ ( ) ที่ตำแหน่งi

∊⍕¨ จัดรูปแบบแต่ละและเรียบ


0

Ruby , 85 ไบต์

->a{i=1;j=c=0;a.map{|x|[c-=x*i=-i,x]}.to_h.sort.map{|x,y|[?_*[x+~j,0*j=x].max,y]}*''}

ลองออนไลน์!

บันทึกตำแหน่งหลังจากการกระโดดแต่ละครั้งแล้วแปลงอาร์เรย์ผลลัพธ์เป็นแฮชเพื่อลบรายการที่ซ้ำกัน (เก็บค่าสุดท้ายที่ตำแหน่งที่ซ้ำกันแต่ละตำแหน่ง) จากนั้นติดกาวค่าด้วยจำนวนขีดล่างที่ต้องการ


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