เป็ดเป็ดฟัส


49

รับอาร์เรย์จำนวนเต็ม:

  1. เริ่มจากหมายเลขแรก
  2. กระโดดไปข้างหน้าตำแหน่ง n โดยที่ n คือค่าของตำแหน่งปัจจุบัน
  3. ลบตำแหน่งปัจจุบันทำให้ตำแหน่งถัดไปคือตำแหน่งปัจจุบัน
  4. ไปที่ขั้นตอนที่ 2 จนกระทั่งเหลืออีกหนึ่งหมายเลข
  5. พิมพ์หมายเลขนั้น

กฎระเบียบ

อาร์เรย์ล้อมรอบ (หมายเลขถัดไปหลังจากหมายเลขสุดท้ายในอาร์เรย์คือหมายเลขแรก)

ศูนย์ลบตัวเอง (เห็นได้ชัด)

ไม่อนุญาตให้ใช้จำนวนลบเป็นอินพุต

กรณีทดสอบ

[1] => 1
[1,2] => 1
[1,2,3] => 3
[1,2,2] => 1
[1,2,3,4] => 1
[6,2,3,4] => 4
[1,2,3,4,5] => 5
[0,1] => 1
[0,0,2,0,0] => 0

ตัวอย่างทีละขั้นตอน

[1,4,2,3,5]
 ^          start from the first position
   ^        jump 1 position (value of the position)
[1,  2,3,5] remove number in that position
     ^      take next position of the removed number (the 'new' 'current' position)
         ^  jump 2 positions
[1,  2,3  ] remove number in that position
 ^          take next position (looping on the end of the array)
     ^      jump 1 position
[1,    3  ] remove number in that position
       ^    take next position (looping)
 ^          jump 3 positions (looping on the end of the array)
[      3  ] remove number in that position
print 3

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

[4,3,2,1,6,3]
 ^            start from the first position
         ^    jump 4 positions
[4,3,2,1,  3] remove number in that position    
           ^  take next position
     ^        jump 3 positions
[4,3,  1,  3] remove number in that position    
       ^      take next position
           ^  jump 1 positions
[4,3,  1    ] remove number in that position    
 ^            take next position
   ^          jump 4 positions
[4,    1    ] remove number in that position    
       ^      take next position
 ^            jump 1 position
[      1    ] remove number in that position
print 1

นี่คือคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ!


14
ความท้าทายแรกที่ดี!
Luis Mendo

2
@LuisMendo ใช่ .. ความท้าทาย "กระโดดข้าม ... "
J42161217

2
@ Jenny_mathy ฉันไม่คิดว่าจะมีสิ่งที่คล้ายกัน แต่อย่างที่หลุยส์บอกว่าชุดฉากกั้นล้อมรอบเป็นสิ่งที่ท้าทายสำหรับการเล่นกอล์ฟ ฉันคิดว่า: /
เวิร์กโฟลว์

3
@EriktheOutgolfer ไม่ใช่คนหลงกล องค์ประกอบมีความแตกต่างและขนาดขั้นตอนได้รับการแก้ไข หลุยส์เข้ามาใกล้มาก แต่ฉันก็ยังคิดว่าแตกต่างกันพอสมควร
Martin Ender

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

คำตอบ:



7

Haskell , 54 50 48 ไบต์

f[x]=x
f(x:r)=f$snd<$>zip r(drop(x+1)$cycle$x:r)

ลองออนไลน์!

คำอธิบาย:

  • f[x]=x: ถ้ารายการที่ระบุเป็นรายการเดี่ยวให้ส่งคืนองค์ประกอบ
  • f(x:r)=f$ ...: มิฉะนั้นนำfไปใช้ซ้ำกับรายการต่อไปนี้:
    • องค์ประกอบของรายการปัจจุบันกรณือนันต์ ( cycle$x:r)
    • เมื่อx+1องค์ประกอบแรกถูกลบออก ( drop(x+1)$)
    • rและตัดทอนความยาวของ ( snd<$>zip rเป็นทางเลือกที่สั้นกว่าtake(length r))

รุ่นก่อนหน้า 54 ไบต์:

f=(%)=<<head
_%[x]=x
n%(x:r)|n<1=f r|s<-r++[x]=(n-1)%s

ลองออนไลน์!



6

MATL , 21 ไบต์

1`yy)+ynX\[]w(5Mynq]x

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

คำอธิบาย

1        % Push 1: current position in the array
`        % Do...while
  yy     %   Duplicate top two elements in the stack. Takes input implicitly
         %   in the first iteration.
         %   STACK: array, position, array, position
  )      %   Get specified entry in the array
         %   STACK: array, position, selected entry
  +      %   Add
         %   STACK: array, position (updated)
  y      %   Duplicate from below
         %   STACK: array, position, array
  n      %   Number of elements of array
         %   STACK: array, position, number of elements or array
  X\     %   1-based modulus
         %   STACK: array, position (wrapped around)
  []     %   Push empty array
         %   STACK: array, position, []
  w      %   Swap
         %   STACK: array, [], position
  (      %   Write value into specified entry in array. Writing [] removes
         %   the entry
         %   STACK: array (with one entry removed)
  5M     %   Push latest used position. Because of the removal, this now
         %   points to the entry that was after the removed one
         %   STACK: array, position
  y      %   Duplicate from below
         %   STACK: array, position, array
  n      %   Number of elements of array
         %   STACK: array, position, number of elements of array
  q      %   Subtract 1
         %   STACK: array, position, number of elements of array minus 1
]        % End. If top of the stack is nonzero, proceed with next iteration
         % STACK: array (containing 1 entry), position
x        % Delete. Implicitly display
         % STACK: array (containing 1 entry)

1
หมายเหตุ: การใช้การหมุนรายการแทนการรักษาตัวชี้อาจทำให้สั้นกว่านี้มาก
Erik the Outgolfer

1
@Erik ขอบคุณ แต่ตอนนี้ฉันได้เพิ่มคำอธิบายที่ฉันคิดว่าฉันจะทิ้งไว้เช่นนี้
Luis Mendo

คุณสามารถลบคำอธิบายออกได้ตลอดเวลาซึ่งจะถูกเก็บไว้ในประวัติศาสตร์ :)
Erik the Outgolfer

6

Python 3 , 54 51 ไบต์

f=lambda x:x and f((x+x*x[0])[x[0]:][1:len(x)])or x

เอาท์พุทเป็นรายการเดี่ยว

ลองออนไลน์!


ไม่เกี่ยวข้องกันโดยสิ้นเชิง แต่ฉันชอบหมวกยูนิคอร์นของคุณเดนนิส xD (และเป็นคำตอบที่ดีเช่นเคย!)
Kevin Cruijssen

5

CJam , 15 ไบต์

l~_,({_0=m<1>}*

ลองออนไลน์!

คำอธิบาย

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

l~     e# Read and evaluate input.
_,(    e# Get its length L and decrement to L-1.
{      e# Run this block L-1 times...
  _0=  e#   Get the first element X.
  m<   e#   Rotate the array left by X positions.
  1>   e#   Discard the first element.
}*
       e# The final element remains on the stack and gets printed implicitly.

ทางเลือกสนุก ๆ ที่น่าเสียดายที่ไม่ได้บันทึกไบต์ใด ๆ :

l~_{;m<1>_0=}*;

5

Brain-Flak , 88 ไบต์

([[]]()){({}<(({})){({}<({}<([]){({}{}<>)<>([])}{}>)<>{({}[<>[]])<>}<>>[()])}{}{}>())}{}

ลองออนไลน์!

คำอธิบาย

([[]]())                      Push negative N: the stack height - 1
{({}< … >())}{}               Do N times
     (({}))                     Duplicate M: the top of the stack
     {({}< … >[()])}{}          Do M times 
                                  Rotate the stack by 1:
          ({}< … >)               Pop the top of the stack and put it back down after
          ([]){({}{}<>)<>([])}{}  Pushing the rest of the stack on to the other one, in reverse, with the stack height added to each element (to ensure that all are positive)
          <>{({}[<>[]])<>}<>      Push the rest of the stack back, unreversing, and subtracting the stack height from each element
                      {}        Pop the top of stack

1
กอล์ฟที่แปลกมาก แต่ที่นี่มันมีอยู่ใน88 ไบต์
ข้าวสาลีตัวช่วยสร้าง

1
@WeatWizard ดีมากฉันได้ลองทำอะไรแบบนี้ก่อนหน้านี้แล้ว
H.PWiz

ฉันไม่เคยรู้เลยว่าผู้คนสามารถรหัสเช่นนี้ได้อย่างไร มีนักแปลโค้ดหลอกหรืออะไร?
เวิร์กโฟลว์

1
@ workoverflow ไม่มันง่ายกว่าที่คิด มันเป็นเรื่องที่น่ากลัวมากก่อนที่ฉันจะเริ่มจริง ๆ แต่เมื่อคำสั่งนี้ง่าย ๆ มันง่ายที่จะเรียนรู้
H.PWiz

5

Python 2 , 55 ไบต์

def f(a):
 while a[1:]:l=a[0]%len(a);a[:]=a[-~l:]+a[:l]

ลองออนไลน์!

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

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

  • def f(a)- aกำหนดฟังก์ชั่นที่มีพารามิเตอร์

  • while a[1:]:- ในขณะaที่องค์ประกอบแรกที่ถูกลบออกเป็นความจริงให้เรียกใช้บล็อกของรหัสเพื่อติดตาม รายการที่มีองค์ประกอบหนึ่งรายการขึ้นไปเป็นจริงและรายการว่างเปล่าเป็นเท็จใน Python ดังนั้นสิ่งนี้จะหยุดเมื่อaถึงความยาว 1

  • l=a[0]%len(a)- aใช้องค์ประกอบแรกและได้รับส่วนที่เหลือของตนโดยความยาวของ lกำหนดผลให้

  • a[:]=a[-~l:]+a[:l]- หมุนองค์ประกอบaด้านซ้ายไปทางซ้ายlและลบองค์ประกอบแรกออกในขณะที่กำหนดสิ่งนี้ให้aเข้าที่


Python 2 , 63 ไบต์

f=lambda a,i=0:a[1:]and f(a,a.pop(((a*-~i)[i]+i)%len(a))+1)or a

ลองออนไลน์!

แม้ว่าจะนานกว่านี้ดูหรูหรามากขึ้น นอกจากนี้ต้องขอบคุณ ovs ที่ช่วยในการแชท


1
คุณไม่สามารถทำสิ่งที่ชอบa,*b=input()(python3) และบันทึกสองสามไบต์ได้ไหม อย่างไรก็ตามฉันไม่แน่ใจว่าจะมีผลกระทบอย่างไรlและชิ้นส่วนได้อย่างไร
Rod

1
@ เร็วฉันไม่คิดอย่างนั้นฉันจะต้องประเมินการป้อนข้อมูลด้วยเช่นกันใน Python 3
Mr. Xcoder

4

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

ṙḷ/ḊµḊ¿

ลองออนไลน์!

โปรแกรมเต็มรูปแบบ


3
นั่นḷ/เป็นสิ่งที่ฉลาด
Mr. Xcoder

คุณช่วยเพิ่มคำอธิบายได้ไหม ตอนนี้ฉันได้ดู Quicks และ Atoms บน GIT-pages ที่เชื่อมโยงและ +1 จาก ed แต่ฉันไม่สามารถจินตนาการได้ว่าทุกคนที่มีผู้ป่วยจะต้องทำแบบเดียวกัน ;)
Kevin Cruijssen




3

Mathematica ขนาด 36 ไบต์

ใช้อัลกอริธึมของ Martin

#//.l:{x_,__}:>Rest@RotateLeft[l,x]&

-5 bytes จาก Misha Lavrov && Martin Ender

ลองออนไลน์!


1
#//.{x_,y__}:>Rest@RotateLeft[{x,y},x]&คุณสามารถบันทึกไบต์ที่สองโดยใช้รูปแบบที่จะเลือกออกองค์ประกอบแรก (สิ่งนี้จะหยุดเมื่อมีองค์ประกอบเดียวเท่านั้นเนื่องจาก{a}ไม่ตรงกับรูปแบบอีกต่อไป{x_,y__})
Misha Lavrov

1
@MishaLavrov ไม่สามารถทดสอบในขณะนี้ แต่คุณอาจจะสามารถร่นว่าต่อไปโดยทิ้งyเรียกรายชื่อทั้งหมดlแล้วใช้แทนl {x,y}
Martin Ender

1
@MartinEnder คุณหมายถึงสิ่งนี้ - #//.l:{x_,__}:>Rest@RotateLeft[l,x]&?
Misha Lavrov

1
@MishaLavrov yep
Martin Ender

3

J , 21 17 ไบต์

-4 ไบต์ขอบคุณ FrownyFrog

((1<#)}.{.|.])^:_

ลองออนไลน์!

เดิม:

([:}.{.|.])^:(1<#)^:_

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

^:_ ทำซ้ำจนกว่าผลลัพธ์จะหยุดการเปลี่ยนแปลง

^:(1<#) ถ้าความยาวของรายการมากกว่า 1

{.|.] หมุนรายการไปทางซ้ายครั้งแรกของรายการ

[:}. วางองค์ประกอบแรกและใส่ส้อม

ลองออนไลน์!


@ FrownyFrog ขอบคุณฉันไม่ได้ลอง - ดีกว่ามาก!
Galen Ivanov

3

JavaScript (ES6), 54 60 ไบต์

บันทึก 1 ไบต์ต้องขอบคุณ @Shaggy
เวอร์ชันที่แก้ไขแล้ว (+6 ไบต์)

ปรับเปลี่ยนอาร์เรย์อินพุตซึ่งลดลงเป็นซิงเกิลตัน

f=(a,p=0)=>1/a||f(a,p=(p+a[p%(l=a.length)])%l,a.splice(p,1))

กรณีทดสอบ

อย่างไร?

เราใช้อัลกอริทึมที่อธิบายซ้ำในการเรียกซ้ำ มีเพียงเงื่อนไขหยุด1/aอาจดูแปลก ๆ เมื่อใช้ตัวดำเนินการทางคณิตศาสตร์:

  • อาร์เรย์ขององค์ประกอบมากกว่าหนึ่งรายการถูกบังคับNaNและ1/NaNยังเป็นNaNเท็จเช่นกัน
  • อาร์เรย์ของจำนวนเต็มว่าหนึ่งจะถูกบังคับให้จำนวนเต็มที่นำไปสู่การอย่างใดอย่างหนึ่ง1/0 = +Infinityหรือ1/N = positive floatสำหรับN> 0 (ทั้ง truthy)
f = (a, p = 0) =>                 // a = input array, p = pointer into this array
  1 / a ||                        // if a is not yet a singleton:
    f(                            //   do a recursive call with:
      a,                          //     a
      p = (                       //     the updated pointer
        p + a[p % (l = a.length)] //
      ) % l,                      //
      a.splice(p, 1)              //     the element at the new position removed
    )                             //   end of recursive call

เห็นเป็นspliceปรับเปลี่ยนอาร์เรย์เดิมคุณสามารถทำf=(a,p=0)=>1/a||f(a,p=p+a[p]%a.length,a.splice(p,1))สำหรับ52 ไบต์
ปุย

ดูเหมือนว่าจะไม่ให้ผลลัพธ์ที่ถูกต้องสำหรับตัวอย่างที่เป็นขั้นตอนที่สองf=(a,p=0)=>1/a?a:f(a,p=(p%a.length+a[p%a.length])%a.length,a.splice(p,1))ก็โอเค แต่อาจปรับให้เหมาะสม
Nahuel Fouilleul

@NahuelFouilleul โอ๊ะโอ ฉันคิดว่าในบางจุดที่วงเล็บp+a[p]ถูกลบออกได้ ซึ่ง - แน่นอน - ไม่ใช่ในกรณีนี้ ขอบคุณที่รายงานสิ่งนี้!
Arnauld

ดูฉันทามตินี้ซึ่ง @Neil มาถึงความสนใจของฉันที่นี่
Shaggy

@ Shaggy โอ้ฉันเข้าใจแล้ว ขอขอบคุณ! (ฉันพลาดลิงค์ TIO ของคุณเป็นครั้งที่ 1 ... )
Arnauld


3

Java 8, 79 ไบต์

แลมบ์ดานี้ยอมรับStack<Integer>และส่งกลับหรือintInteger

l->{for(int i=0,s=l.size();s>1;)l.remove(i=(i+l.get(i%s))%s--);return l.pop();}

ลองใช้ออนไลน์

Ungolfed

l -> {
    for (
        int i = 0, s = l.size()
        ; s > 1
        ;
    )
        l.remove(
            i = (i + l.get(i % s)) % s--
        );
    return l.pop();
}

กิตติกรรมประกาศ

  • -2 ไบต์ขอบคุณ Nahuel Fouilleul

1
i%=sอาจถูกลบออกหากl.get(i)มีการเปลี่ยนแปลงโดยl.get(i%s)
Nahuel Fouilleul

2

Pyth , 9 ไบต์

.WtHt.<Zh

ลองที่นี่!

เอาท์พุทนี้ผลที่ได้เป็นรายการเดี่ยวขณะที่ได้รับอนุญาตโดยค่าเริ่มต้น

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

.WtHt.<Zh ~ Full program.

.W        ~ Functional while. It takes three arguments, two functions: A and B
            and a starting value, which in this case is automatically assigned
            to the input. While A(value) is truthy, value is set to B(value).
            Returns the ending value. A's argument is H and B's is Z.
  tH      ~ A (argument H): Remove the first element of H. A singleton list
            turns into [], which is falsy and thus breaks the loop. Otherwise,
            it is truthy and the loops goes on until the list reaches length 1.
     .<Zh ~ B (argument Z): Cyclically rotate Z by Z[0] places, whereas Z[0]
            represents the first element of Z.
    t     ~ And remove the first element.

หมายเหตุ:หากคุณไม่ต้องการเห็นวงเล็บเหล่านั้นเพียงเพิ่มhหรือeอยู่หน้าโค้ดทั้งหมด


2

Swift , 87 ไบต์

func f(a:inout[Int]){var i=0,c=0;while(c=a.count,c>1).1{i=(i+a[i%c])%c;a.remove(at:i)}}

ผลตอบแทนที่เป็นรายการเดี่ยวโดยการปรับเปลี่ยนการป้อนข้อมูล ลองออนไลน์!

คำอธิบาย

func f(a:inout[Int]){
  var i=0,c=0;            // Set the index i to 0
  while(c=a.count,c>1).1{ // While the length of the list > 0:
    i=(i+a[i%c])%c;       //  Add a[i] to i and loop back using modulo
    a.remove(at:i)        //  Remove a[i]
  }
}

2

Perl 6 , 46 45 ไบต์

(-1 ไบต์ขอบคุณแบรดกิลเบิร์ต)

{($_,{(|$_ xx*)[.[0]+(1..^$_)]}...1)[*-1][0]}

ลองออนไลน์!

($_, { ... } ... 1)สร้างลำดับของรายการเริ่มต้นด้วยรายการอินพุต$_แต่ละองค์ประกอบที่ต่อเนื่องจะถูกสร้างขึ้นโดยการแสดงออกรั้งและยกเลิกเมื่อรายการสมาร์ทการแข่งขัน1--ie มีความยาว 1 การต่อท้าย[* - 1]ได้รับองค์ประกอบสุดท้ายและสุดท้าย[0]นำองค์ประกอบเดียวออกจากรายการซิงเกิลนั้น

(|$_ xx *)สร้างสำเนาปัจจุบันขององค์ประกอบปัจจุบัน รายการนี้ถูกทำดัชนีด้วยช่วง.[0] + (1 ..^ $_)เพื่อแยกรายการ จำกัด ถัดไปในชุด


1
ใจเป่า oO
Adrian

[*-1][0]สามารถรวมกันเป็นการ[*-1;0]บันทึกไบต์ นอกจากนี้ยัง1..$_-1เขียนได้ดีกว่าเช่น1..^$_การบันทึกไบต์อีกครั้ง
Brad Gilbert b2gills

@ BradGilbertb2gills ฉันพยายาม[*-1;0]แต่ดูเหมือนจะไม่เท่ากัน ฟังก์ชันจะส่งคืนรายการแทนที่จะเป็นตัวเลข
Sean

แต่นั่นไม่ได้หยุดการ1..^$_เพิ่มประสิทธิภาพ
แบรดกิลเบิร์ต b2gills

1

Perl 5 , 47 43 41 + 2 ( -ap) = 43 ไบต์

$\=splice@F,($_+=$F[$_%@F])%@F,1while@F}{

ลองออนไลน์!

ใช้อินพุตเป็นตัวเลขคั่นด้วยช่องว่าง


ดูเหมือนว่าจะไม่เหมือนกับตัวอย่างทีละขั้นตอนต่อไปนี้ แต่จะนานกว่า$x%=@F,splice@F,$x=($x+$F[$x])%@F,1while$#F;$_="@F"
Nahuel Fouilleul

1
ว้าว oO ต้องทำให้เกมของฉันดีขึ้น
Adrian



1

Java 8 , 325 Bytes

แข็งแรงเล่นกอล์ฟ:

static void n(Integer[]j){Integer[]h;int a=0;h=j;for(int i=0;i<j.length-1;i++){if(h.length==a){a=0;}a=(a+h[a])%h.length;h[a]=null;h=m(h);}System.out.print(h[0]);}static Integer[] m(Integer[]array){Integer[]x=new Integer[array.length-1];int z=0;for(int i=0;i<array.length;i++){if(array[i]!=null){x[z]=array[i];z++;}}return x;}

Ungolfed:

 interface ArrayLeapFrog {
static void main(String[] z) throws Exception {
    Integer[] j = {6, 2, 3, 4};
    n(j);
}

static void n(Integer[] j) {
    Integer[] h;
    int a = 0;
    h = j;
    for (int i = 0; i < j.length - 1; i++) {
        if (h.length == a) {
            a = 0;
        }
        a = (a + h[a]) % h.length;
        h[a] = null;
        h = m(h);
    }
    System.out.print(h[0]);
}

static Integer[] m(Integer[] array) {
    Integer[] x = new Integer[array.length - 1];
    int z = 0;
    for (int i = 0; i < array.length; i++) {
        if (array[i] != null) {
            x[z] = array[i];
            z++;
        }
    }
    return x;
  }
}

4
ยินดีต้อนรับ! เคล็ดลับคู่: ไม่จำเป็นต้องนับstaticคำหลักที่นี่ โดยทั่วไปแล้วจะมีการนำวิธีการหลายวิธีมาใช้ในฐานะสมาชิกที่ไม่คงที่ของคลาสและmainสร้างอินสแตนซ์สำหรับการทดสอบ นอกจากนี้หากคุณทำเช่นนั้นในแบบที่คุณสนับสนุน Java 7 และสามารถส่งเป็นเพียงแค่ "Java" โซลูชั่น สำหรับการอ้างอิงในอนาคตรูปแบบอินพุตมีแนวโน้มที่จะค่อนข้างยืดหยุ่นที่นี่ดังนั้นตัวอย่างเช่นคุณสามารถเลือกที่จะรับอินพุตเป็นList(ซึ่งค่อนข้างมีประโยชน์สำหรับปัญหานี้)
Jakob

1

APL + WIN, 36 ไบต์

¯1↑⍎¨(1⌈¯1+⍴v←,⎕)⍴⊂'v←(1<⍴v)↓v[1]⌽v'

คำอธิบาย:

แสดงพร้อมต์สำหรับอินพุตหน้าจอ

'v←(1<⍴v)↓v[1]⌽v' Loop logic as a string

 (1<⍴v)↓ only drop the first when number of elements n>1

 (1⌈¯1+⍴v←,⎕)⍴⊂ create a nested vector of logic of length 1 max n-1

 ⍎¨ execute each element of the nested vector in turn

¯1↑ take answer from executing final element

1

Python 2, 61 ไบต์

def f(x):
 while x[1:]:y=x[0]%len(x);x=x[y+1:]+x[:y]
 print x

1
ฉันรู้ว่ามีคำตอบของ python อยู่จำนวนหนึ่ง แต่ฉันคิดว่าฉันอาจเพิ่มของตัวเองได้เช่นกัน
Rɪᴋᴇʀ

1

JavaScript, 58 56 59 ไบต์

let f =

a=>{for(i=0,k=a.length;k>1;)i+=a[i%=k],a.splice(i%=k--,1)}
<h2>Test</h2>
Enter or paste a valid array literal within square brackets and click Run.
<blockquote>
   <input id = "array" type="text" length="20">
   <button type="button" onclick="run()">Run</button>
</blockquote>
Result: <pre id="o"></pre>

<script>
    function run() {
       let a = JSON.parse(array.value);
       f(a);
       o.textContent = a;
    }
</script>

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

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

หักกอล์ฟ:

a => {
    for(i=0,k=a.length;k>1;) // once less than array length
        i+=a[i%=k],          // the new index
        a.splice(            // delete an element
           i%=k--,           // ensuring index is within array,
                             // and post decrement loop count
           1
        )
}

[3, 5, 7, 9]นี้น่าจะให้คำตอบที่ถูกต้องสำหรับ
Neil

[3,5,7,9]ผิด ค่าที่คาดหวัง 5
edc65

ฟังก์ชั่นไม่ส่งคืนค่าฉันไม่แน่ใจว่าจำนวนไบต์นั้นเหมาะสมหรือไม่เนื่องจากมันไม่สามารถทำงานได้ด้วยตัวของมันเอง ...
Brian H.

@ edc65 และ Neil ขอบคุณ - ดัชนีขององค์ประกอบที่ถูกลบที่จุดสิ้นสุดของอาร์เรย์ไม่ได้ถูกปรับเป็นจุดเริ่มต้นของอาร์เรย์ที่สั้นลง
traktor53

@BrianH ฟังก์ชันปรับเปลี่ยนพารามิเตอร์มีมติเกี่ยวกับcodegolf.meta.stackexchange.com/a/4942/21348
edc65

1

Brain-Flak , 104 ไบต์

H.PWiz มีคำตอบสั้น ๆที่นี่ที่ฉันช่วยทำคุณควรตรวจสอบออก

([[]]()){({}()<(({})){({}[()]<({}<(([])<{{}({}<>)<>([])}{}<>>)<>>)<>{({}[()]<({}<>)<>>)}{}<>>)}{}{}>)}{}

ลองออนไลน์!

คำอธิบาย

([[]]())   #Push 1 minus stackheight
{({}()<    #N times
 (({}))    #Get a copy of the top
 {({}[()]< #N times
  ({}<(([])<{{}({}<>)<>([])}{}<>>)<>>)<>{({}[()]<({}<>)<>>)}{}<>
           #Roll the top to the bottom (From the wiki)
 >)}{}     #End loop
 {}        #Remove one value
>)}{}      #End loop

ฉันคิดว่าฉันจะแข่งขัน จากนั้นฉันก็รู้ว่าเหมืองของฉันเกือบจะเหมือนกับของคุณนอกจาก "top roll" ที่แตกต่างกัน
H.PWiz

ผมเห็นว่า ;). การใช้ความจริงที่ว่าทุกอย่างไม่เป็นลบนั้นค่อนข้างฉลาด
ข้าวสาลีตัวช่วยสร้าง


1

R , 111 117 126ไบต์

ขอบคุณ @Giuseppe สำหรับการเล่นกอล์ฟ 11 ไบต์โดยเปลี่ยนเป็นวงวนสักครู่ทำให้ได้อีก 4 โดยการลบฟังก์ชั่นและอ่านอินพุตของผู้ใช้โดยตรง

ฉันไม่รู้สึกดีกับสิ่งที่ต้องทำเมื่อไปถึงที่นั่น - ฉันแน่ใจว่ามีวิธีแก้ปัญหาที่หรูหรากว่านี้

i=scan();m=1;while((l=sum(i|1))-1){j=i[m];p=`if`(j+m>l,j%%l+!m-1,j+m);p=`if`(!p,m,p);i=i[-p];m=`if`(p-l,p,1)};i

ลองออนไลน์!

รหัสที่ไม่ได้รับการปรับปรุง

i=scan()
m=1
while((l=sum(i|1))-1){
  j=i[m]
  p=`if`(j+m>l,j%%l+!m-1,j+m)
  p=`if`(!p,m,p)
  i=i[-p]
  m=`if`(p-l,p,1)
}
i

117 ไบต์ - โปรดทราบว่าเนื่องจากนี่เป็นฟังก์ชันแบบเรียกซ้ำจึงf=ต้องรวมชื่อ
Giuseppe

1
ฉันพบว่ามันค่อนข้างท้าทายสำหรับภาษาดัชนี 1 ตัวที่ไม่มีการหมุนของอาเรย์ whileฉันคิดว่านี่น่าจะสั้นกว่าด้วยการวนลูป1-3 ไบต์
Giuseppe


115 byter ก่อนหน้าของฉันไม่ถูกต้องเนื่องจากเราทั้งคู่ลืมf=ฟังก์ชั่นวนซ้ำ :(
Giuseppe

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