หมายเลขปืนลูกซอง


45

หมายเลขปืนลูกซองเป็นลำดับที่มีความหมายที่ค่อนข้างง่าย แต่บางโครงสร้างที่น่าสนใจ เริ่มต้นด้วยตัวเลขธรรมชาติ:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...

ทีนี้นำตัวเลขทั้งหมดที่ดัชนีหารด้วย2 , จัดกลุ่มเป็นคู่และสลับตัวเลขในแต่ละคู่:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
   ^     ^     ^     ^      ^       ^       ^  
    <--->       <--->        <----->         <----
1, 4, 3, 2, 5, 8, 7, 6, 9, 12, 11, 10, 13, 16, ...

ตอนนี้ทำเช่นเดียวกันกับดัชนีหารด้วย3 :

1, 4, 3, 2, 5, 8, 7, 6, 9, 12, 11, 10, 13, 16, ...
      ^        ^        ^           ^          
       <------>          <--------->           
1, 4, 8, 2, 5, 3, 7, 6, 10, 12, 11, 9, 13, 16, ...

และสำหรับ4 , 5 , 6และอื่น ๆ :

1, 4, 8, 2, 5, 3, 7, 6, 10, 12, 11, 9, 13, 16, ...
1, 4, 8, 6, 5, 3, 7, 2, 10, 12, 11, 14, 13, 16, ...
1, 4, 8, 6, 12, 3, 7, 2, 10, 5, 11, 14, 13, 16, ...
1, 4, 8, 6, 12, 14, 7, 2, 10, 5, 11, 3, 13, 16, ...
...

หลังจากkขั้นตอนดังกล่าวหมายเลขk + 1แรกจะได้รับการแก้ไข ดังนั้นเราสามารถกำหนดลำดับอนันต์ของตัวเลข Shotgun เป็นขีด จำกัด ของการให้kไปที่อนันต์ 66 หมายเลขแรกคือ:

1, 4, 8, 6, 12, 14, 16, 9, 18, 20, 24, 26, 28, 22, 39, 15, 36, 35, 40, 38, 57, 34, 48, 49, 51, 44,
46, 33, 60, 77, 64, 32, 75, 56, 81, 68, 76, 58, 100, 55, 84, 111, 88, 62, 125, 70, 96, 91, 98, 95,
134, 72, 108, 82, 141, 80, 140, 92, 120, 156, 124, 94, 121, 52, 152, 145, ...

ข้อเท็จจริงที่สนุกสนาน:แม้จะได้มาโดยการอนุญาตตัวเลขธรรมชาติเท่านั้นลำดับนี้ไม่มีช่วงเวลาใด ๆ

ความท้าทาย

รับจำนวนเต็มn > 0ค้นหาnหมายเลขปืนลูกซองที่ คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น, รับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด), อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ฟังก์ชันและส่งคืนเอาต์พุตหรือพิมพ์ไปที่ STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด)

นี่คือรหัสกอล์ฟดังนั้นการส่งที่สั้นที่สุด (เป็นไบต์) ชนะ

ลีดเดอร์

นี่เป็นคำตอบที่มากกว่าที่ฉันคิดเช่นเดียวกับหลาย ๆ คนที่แข่งขันกันในภาษาเดียวกัน ดังนั้นนี่คือ Stack Snippet เพื่อสร้างทั้งกระดานผู้นำปกติและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

# Ruby, <s>104</s> <s>101</s> 96 bytes


1
ความจริงที่สนุกนั้นบ้าไปแล้ว หรือมีตัวเลขธรรมชาติอื่น ๆ ที่จะไม่เกิดขึ้น?
Devon Parsons

1
@ DevonParsons ใช่มันจะสับเปลี่ยนทุกช่วงเวลา "จบ" แต่ฉันคิดว่ามีตัวเลขอื่นหายไปเช่นกัน ดูเหมือนว่า10, 21, 25และ30ไม่ปรากฏอย่างใดอย่างหนึ่งเช่น
Martin Ender

3
ดูเหมือนว่าคำถาม Project Euler ฉันไม่คิดว่ามันเป็น ... แต่อาจจะเป็น
Corey Ogburn

9
โดยทั่วไปเมื่อการkทำซ้ำครั้งที่kองค์ประกอบองค์ประกอบที่ในอาร์เรย์ได้รับการเปลี่ยน2kตำแหน่งและจะไม่ได้รับการสัมผัสอีกครั้งจนกว่าการ2kทำซ้ำครั้งที่ th ซึ่งในเวลานั้นได้รับการย้ายไปยัง4kตำแหน่งที่ นายกจะไม่ได้รับการเปลี่ยนใจจนกว่าจะถึงเวลาที่มันจะมาพูดดังนั้นทุกช่วงเวลาจะเดินไปข้างหน้า แต่เราสามารถทำรายชื่อผู้ที่ตกเป็นเหยื่อผู้บริสุทธิ์ได้อย่างง่ายดายเพียงพิมพ์องค์ประกอบแรกที่จะทำการเปลี่ยนในการทำซ้ำ 2 และการทำซ้ำแต่ละครั้ง รายการไป: 2, 3, 5, 7, 10, 11, 13, 21, 17, 19, 30, 23, 27, 25, 29, 31, 45, 42, 37, 54, 41, 43, 65, ...
Théophile

3
@ Sherlock9 เรียบร้อยแล้ว! หากได้รับอนุมัติก็จะhttps://oeis.org/A266679 สวัสดีปีใหม่!
Théophile

คำตอบ:


5

Pyth, 19 22

u-G*H^_!%GH/GHrhQ2Q

การดำเนินไร้เดียงสาเป็นธรรมของ@ คำตอบ

ลองออนไลน์ได้ที่นี่

วิธีนี้ใช้เทคนิคเดียวกันในการแปลงลูป while เป็นโฟลว์เหมือนกับโปรแกรม Pyth อื่น ๆ


u+G**H!%GHty%/GH2rhQ2Q

สำเนาไร้เดียงสาของอัลกอริทึมของ@ Sp3000แปลเป็น Pyth

คุณสามารถลองออนไลน์ได้ที่นี่

ใช้การลด (ชื่อของ python สำหรับ fold) เพื่อเลียนแบบห่วงลูป มันระบุมากกว่าrange(input, 2)ที่ Pyth ใช้งานrange(2, input)[::-1]ได้ดี สนามกอล์ฟอื่น ๆ ที่เกี่ยวข้องกับ Pyth เกี่ยวข้องกับการใช้notแทน<2และใช้yโหมดซ่อนเร้นของการเพิ่มค่าอาร์กิวเมนต์ที่เป็นตัวเลขสองเท่า


21

> <>, 52 45 ไบต์

หน้า Esolangs สำหรับ> <>

i:&&:&1-?vn;
2*1-*+20.>:&:&%1(&:&*{:}&:1-&,2%

มีการคัดลอกและเคลื่อนย้ายองค์ประกอบจำนวนมากด้วยโมดูโล่และการคูณที่จำเป็นมากมาย ตรรกะนั้นเหมือนกับโซลูชัน Pythonของฉันอย่างแน่นอน

ใช้เวลาการป้อนข้อมูลผ่านทางจุดรหัสจาก STDIN "!" = 33 -> 75เช่น


10
และคุณได้รับรางวัลสำหรับรูปแบบการป้อนข้อมูลที่น่าอึดอัดใจมากที่สุด: P
Caridorc

+1 ต่อไปไม่ต้องกังวล :)
Caridorc

@ Sp3000 IMO ควรนับว่าเป็นหนึ่งเดียว
SuperJedi224

@ SuperJedi224 จริงๆแล้วตามmeta post นี้เห็นได้ชัดว่า-vนับเป็นสาม: /
Sp3000

17

Python 2, 58 ไบต์

i=n=input()
while~-i:n+=(n%i<1)*i*(n/i%2*2-1);i-=1
print n

เช่นเดียวกับคำตอบอื่น ๆ ส่วนใหญ่ความคิดคือทำงานไปข้างหลัง


ลองเรียกขั้นตอนเป็นขั้นk+1ตอนiเพื่อสลับiหลายรายการทั้งหมดเป็นขั้นตอน iเราต้องการการสังเกตสองอย่าง:

  • ตำแหน่งnในอาร์เรย์จะสลับเฉพาะในขั้นตอนiถ้าnหารด้วยi,
  • n/i mod 2ที่จะบอกว่าคุณเป็นจำนวนที่ต่ำกว่าหรือจำนวนที่สูงขึ้นในการแลกเปลี่ยนดูที่ หากนี่คือ 1 คุณเป็นจำนวนที่ต่ำกว่า (และจะสลับกัน) มิฉะนั้นคุณจะเป็นหมายเลขที่สูงกว่า (และจะสลับลง)

สิ่งนี้ทำให้เรามีอัลกอริทึมสำหรับการทำงานย้อนหลัง ลองทำด้วย 6 เริ่มจากขั้นตอนสุดท้าย (ขั้นตอนi = 6):

Step 6: Position 6 swaps with position 12 (6 is divisible by 6, 6/6 = 1 == 1 mod 2)

ดังนั้นตอนนี้เรารู้ว่าตัวเลขมาจากตำแหน่ง 12 จากนั้น:

Step 5: No swap (12 not divisible by 5)
Step 4: Position 12 swaps with position 16 (12 is divisible by 4, 12/4 = 3 == 1 mod 2)

ตอนนี้เรารู้แล้วว่ามันมาจาก 16 ก่อนหน้านั้น สุดท้าย:

Step 3: No swap (16 not divisible by 3)
Step 2: Position 16 swaps with position 14 (16 divisible by 2, 16/2 = 8 == 0 mod 2)

เนื่องจากนี่เป็นขั้นตอนแรก (จำไว้k+1) เราเสร็จแล้วและจำนวนที่สิ้นสุดในตำแหน่งที่ 6 มาจากตำแหน่งที่ 14 นั่นคือหมายเลขปืนลูกซองที่ 6 คือ 14

ดังนั้นตอนนี้สำหรับคำอธิบายของ Python:

i=n=input()             Read input, and store into i (step) and n (position)
while~-i:               while i-1 != 0:, or since we're descending with i this is just while i>1:
  n+=                   Add to the current position...
    (n%i<1)*            1* whatever's next if n is divisible by i, otherwise 0* (i.e. nothing)
    i*                  How many positions n might go up/down
    (n/i%2*2-1)         n/i%2 tell us higher/lower, *2-1 maps 0 or 1 to -1 (down) or +1 (up)
  i-=1                  Decrement the step number
print n                 Output

วิธีที่น่าสนใจในการเขียนi-1เป็น~-i
mbomb007

6
@ mbomb007: เห็นด้วย เคลฟเวอร์ แต่มันมีความหมายเหมือนกัน whileแต่ไม่จำเป็นต้องสำหรับพื้นที่หลังจากที่ ทำได้ดีมาก Sp3000
Alex A.

สั้นที่สุดที่ฉันจะได้รับสิ่งนี้ใน pyth คือโดยใช้การลด:u+G**H!%GHty%/GH2rhQ2Q
FryAmTheEggman

1
@FryAmTheEggman, Sp3000 ไม่ว่าคุณจะโพสต์นั้นหรือไม่?
Martin Ender

@ MartinBüttnerฉันไม่ได้โพสต์มันเพราะฉันรู้สึกว่ามันเป็นสำเนามากเกินไป ฉันจะโพสต์เป็นคำตอบ CW ในตอนนี้
FryAmTheEggman

6

Haskell, 68 ไบต์

n#k|mod k(2*n)<1=k-n|mod k n<1=k+n|k>0=k
s n=foldr((.).(#))id[2..n]n

น่าจะเป็นสนามกอล์ฟที่ไกลออกไปโดยเฉพาะในแถวแรก ฟังก์ชั่นนี้กำหนดฟังก์ชั่นsที่ใช้nและส่งกลับnหมายเลขปืนลูกซอง th

map s [1..66]
[1,4,8,6,12,14,16,9,18,20,24,26,28,22,39,15,36,35,40,38,57,34,48,49,51,44,46,33,60,77,64,32,75,56,81,68,76,58,100,55,84,111,88,62,125,70,96,91,98,95,134,72,108,82,141,80,140,92,120,156,124,94,121,52,152,145]

คำอธิบาย

ฟังก์ชั่นตัวช่วย#ใช้ตัวเลขสองตัวnและkและส่งกลับkหมายเลข th ในรายการที่กำหนดโดยใช้การดำเนินการสลับคู่กับทุกnหมายเลข th ตัวอย่างเช่นการใช้กับตัวเลข 20 ตัวแรกที่n = 4ให้ผลดังนี้:

map (4#) [1..20]
[1,2,3,8,5,6,7,4,9,10,11,16,13,14,15,12,17,18,19,24]

ผลจากการs nที่จะได้รับโดยการลด ( "พับ") รายการ[2..n]โดยฟังก์ชั่นที่สองของการสั่งซื้อ(.).(#)ซึ่งจะใช้เวลาในจำนวนmและฟังก์ชั่นf(ต้นฟังก์ชั่นตัวตนid) และผลตอบแทนที่ได้ฟังก์ชั่นที่ใช้และผลตอบแทนk f (m # k)ยกตัวอย่างเช่นในกรณีที่n = 4รายการ[2,3,4]จะลดลงถึงฟังก์ชั่นที่ใช้และผลตอบแทนk เป็นสิ่งจำเป็นสำหรับกรณีฐานที่รายการว่างเปล่า ในที่สุดเราให้ฟังก์ชั่นนี้ได้รับหมายเลขปืนลูกซองที่id (4 # (3 # (2 # k)))idn = 1k = nn



5

Ruby, 92 ไบต์

def s(d,n)
d==1?n:s(d-1,n%d==0?n+(n%(d*2)==0?-d :d):n)
end
n=ARGV[0].to_i
print s(n,n).to_s

ความพยายามครั้งแรกของฉันเกี่ยวกับกอล์ฟ ไม่ได้ขึ้นอยู่กับคำตอบอื่น ๆ


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


84 ไบต์

n=ARGV[0].to_i
d=n
while d>1
n+=(n%d==0?(n%(d*2)==0?-d :d):0)
d-=1
end
print n.to_s

หลังจากดูคำตอบอื่น ๆ แล้วตระหนักว่าวิธีแก้ปัญหาซ้ำ ๆ นั้นเป็นไปได้


2
การปรับปรุงเล็ก ๆ น้อย ๆ สำหรับโซลูชัน 84 ไบต์ของคุณ: 1. เปลี่ยนARGVเป็น$*เวทมนต์ระดับโลก 2. สิ่งที่to_sไม่จำเป็น 3. แทนที่จะกำหนดdให้nกับบรรทัดที่แยกจากกันให้ทำd=n=...เพื่อกำจัดอักขระ การทำงานที่ดีสำหรับกอล์ฟครั้งแรกของคุณ! :)
Doorknob

1
ฉันขอโปรแกรมที่สมบูรณ์ได้ที่ไหน "คุณอาจเขียนโปรแกรมหรือฟังก์ชั่น ... ";) (นี่เป็นค่าเริ่มต้นสำหรับความท้าทายของcode-golfแต่ฉันมักจะรวมไว้เพื่อความสมบูรณ์)
Martin Ender

เพื่อเพิ่มความ @ ข้อเสนอแนะ Doorknob ของสองชุดของวงเล็บในn+=บรรทัดที่ไม่จำเป็นและทั้งสองเหตุการณ์ได้อย่างปลอดภัยจะเปลี่ยนไป==0 <1
Peter Taylor

5

Python 2, 97 79 ตัวอักษร

g=lambda n,k:n>1and g(n-1,k-(k%n<1)*n*(-1)**(k/n%2))or k
n=input()
print g(n,n)

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

แก้ไข: ตอนนี้มันพิมพ์เฉพาะnหมายเลข th แทนที่จะเป็นnตัวเลขแรก แน่นอนว่าวิธีการวนซ้ำจะสั้นลง แต่ฉันไม่ต้องการคัดลอกรหัสของ Sp3000


ใช่ฉันคิดว่าทุกคนจะมารวมกันในเรื่องนี้ ฉันพบg(i,i)ส่วนที่น่ารำคาญเป็นพิเศษแม้ว่า ...
Sp3000

2
ภาษาที่ควรทำเครื่องหมายเป็น Python 2 เนื่องจากprintคำสั่ง
mbomb007

@ mbomb007 แก้ไขแล้ว
Jakube

4

Haskell, 79 ไบต์

1#i=i
s#i|i`mod`(2*s)==0=(s-1)#(i-s)|i`mod`s==0=(s-1)#(i+s)|1<2=(s-1)#i
p n=n#n

การใช้งาน: p 66ผลลัพธ์ใด145

ไม่มากที่จะอธิบาย: ฟังก์ชั่น#ซ้ำคำนวณจำนวนปืนลูกซองที่ตำแหน่งของขั้นตอนi ส่งกลับจำนวนที่ตำแหน่งของขั้นตอนsp nnn


โอ้ฉันไม่เห็นคำตอบของคุณก่อนส่งของฉัน ดูเหมือนว่าเรามีวิธีการที่แตกต่างกันมาก
Zgarb

4

k, 41 ไบต์

{{x+$[y!x;0;$[2!_x%y;y;-y]]}/[x;|2+!x-1]}

 / apply to an int
 {{x+$[y!x;0;$[2!_x%y;y;-y]]}/[x;|2+!x-1]} 42
111
 / apply to 1 through 66
 {{x+$[y!x;0;$[2!_x%y;y;-y]]}/[x;|2+!x-1]}'1+!66
1 4 8 6 12 14 16 9 18 20 24 26 28 22 39 15 36 35 40 38 57 34 48 49 51 44 46 33 60 77 64 32 75 56 81 68 76 58 100 55 84 111 88 62 125 70 96 91 98 95 134 72 108 82 141 80 140 92 120 156 124 94 121 52 152 145
  • {...} แลมบ์ดา, x และ y เป็นอาร์กิวเมนต์ที่ 1 และ 2 โดยปริยาย
  • $[b;t;f] ผู้ประกอบการที่ประกอบไปด้วยประเมิน b ตามด้วย t / f ตามลำดับ
  • b!a a modulo b
  • _ พื้นปลดเปลื้องผลลัพธ์ของการหารไปยัง int
  • % แผนก
  • {...}/[x;y] นายก {... } ด้วย x และใช้กับรายการ y เท่ากับ f [f [.. f [f [x; y0]; y1]; .. yn-1]; yn]
  • | ถอยหลัง
  • ! ฟังก์ชั่น iota สร้างรายการ 0 ถึง n-1

4

สามัญชัด113 91

(ซ้ำ: 91)

(defun s(n)(do((r n(1- r)))((= r 1)n)(if(= 0(mod n r))(incf n(* r(if(oddp(/ n r))1 -1))))))

(ต้นฉบับเรียกซ้ำ: 113)

(defun s(n &optional(r n))(cond((= r 1)n)((= 0(mod n r))(s(+ n(* r(if(oddp(/ n r))1 -1)))(1- r)))(t(s n(1- r)))))

ตัวอย่าง

ด้วยเวอร์ชันแบบเรียกซ้ำ:

(trace s)
(s 10)

  0: (S 10)
    1: (S 20 9)
      2: (S 20 8)
        3: (S 20 7)
          4: (S 20 6)
            5: (S 20 5)
              6: (S 15 4)
                7: (S 15 3)
                  8: (S 18 2)
                    9: (S 20 1)
                    9: S returned 20
         ...
    1: S returned 20
  0: S returned 20

การทดสอบ

ตรวจสอบและวัดสำหรับเวอร์ชันที่ซ้ำ:

(let ((list '(1 4 8 6 12 14 16 9 18 20 24 26 28 22 39 15 36 35 40 38 57 34 48 49 51 44
              46 33 60 77 64 32 75 56 81 68 76 58 100 55 84 111 88 62 125 70 96 91 98 95
              134 72 108 82 141 80 140 92 120 156 124 94 121 52 152 145)))
  (time
   (loop for r in list
         for n from 1
         always (= r (s n)))))

 => T

Evaluation took:
  0.000 seconds of real time
  0.000000 seconds of total run time (0.000000 user, 0.000000 system)
  100.00% CPU
  807,160 processor cycles
  32,768 bytes consed

4

Mathematica, 53 49 ไบต์

(For[i=n=#,n>1,--n,If[n∣i,i+=Mod[i,2n]2-n]];i)&

ฉันตัดสินใจที่จะใช้งานการอ้างอิงของฉัน นี่คือสัญลักษณ์ Unicode สำหรับ "หาร" และนับเป็น 3 ไบต์ มิฉะนั้นจะใช้อัลกอริทึมเดียวกันกับทุกคน

มันกำหนดฟังก์ชั่นที่ไม่มีชื่อซึ่งใช้nเป็นพารามิเตอร์เดียวและส่งกลับnจำนวน Shotgun


4

GolfScript, 27 ตัวอักษร

~.,(~%{):i\.@%!~)1$i/?i*-}/

คำอธิบาย

ถ้าf(i, n)เป็นค่าที่ตำแหน่งnหลังจากการi-1แปลงเรามี

f(1, n) = n
f(i, n) = f(i - 1, n % i == 0 ? (((n / i - 1) ^ 1) + 1) * i : n)  for i > 1

ที่^หมายถึง bitor xor; ได้รับการป้อนข้อมูลที่เราต้องการในการคำนวณnf(n, n)

การแปลงจากฟังก์ชันเวียนเกิดเป็นวนซ้ำนั้นไม่น่าสนใจ สิ่งที่น่าสนใจคือวิธีการที่

n % i == 0 ? (((n / i - 1) ^ 1) + 1) * i : n

สามารถเขียนใหม่ได้ วิธีที่ชัดเจนกว่าคือการบอกว่าต้องเป็น

n + (n % i == 0 ? i : 0) * g(n / i)

gสำหรับบางคน เห็นได้ชัดว่าgสลับระหว่าง1และ-1เป็นตำแหน่งสลับสลับขึ้นและลง; ตั้งแต่g(1) = 1(เพราะ1แลกเปลี่ยนถึง2) เรามี

n + (n % i == 0 ? i : 0) * -1**(1 + n / i)

โดยที่**หมายถึงการยกกำลัง เงินออมขั้นสุดท้ายมาจากการเขียนใหม่เช่นนี้

n - i * (n % i == 0 ? -1 : 0)**(n / i)

การผ่า

~             # Evaluate input to get n
.,(~%{        # For n-1 downto 1...
  ):i         #   Let i be that value + 1, so for i = n downto 2...
  \.@%!       #   Find n % i == 0 ? 1 : 0
  ~)          #   Negate
  1$i/?       #   Raise to the power of n/i
  i*-         #   Multiply by i and subtract
}/

เมื่อเห็นว่าคุณมีคำตอบของ GS และ CJam ที่สั้นที่สุดทำไมไม่มีคำตอบ Pyth ที่สั้นที่สุด u-G*H^_!%GH/GHrhQ2Qหากคุณไม่ต้องการโพสต์สิ่งนี้ด้วยตนเองบอกฉัน / เพิ่มลงในคำตอบ CW
FryAmTheEggman

@FryAmTheEggman ฉันอาจจะไม่ได้ฝึกฝนที่ CJam มากนัก แต่ฉันสามารถอ่านได้มากกว่าหรือน้อยกว่านั้น ฉันไม่ได้เบาะแสสิ่งที่ Pyth ในความคิดเห็นของคุณพูดถึงแม้ว่าจากบริบทฉันคิดว่ามันเป็นพอร์ตของคำตอบนี้ ดังนั้นจึงเป็นการดีที่สุดที่คุณจะโพสต์เพราะคุณสามารถตอบคำถามเกี่ยวกับมัน
Peter Taylor

4

CJam, 24 ไบต์

l~__(,f-{_Imd!~)\#I*-}fI

การสาธิตออนไลน์

นี่คือพอร์ตของคำตอบ GolfScript ของฉันยืมวนจากคำตอบ CJam ของมาร์ตินและใช้ประโยชน์จากdivmodผู้ประกอบการของ CJam ( ฉันบอกว่ามันจะมีประโยชน์!)


4

จูเลีย61 61ไบต์

n->(i=n;while~-i!=0 n+=(n%i<1)*i*(n÷i%2*2-1);i-=1;end;n)

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่มีชื่อซึ่งรับอาร์กิวเมนต์เดี่ยวnและส่งกลับnหมายเลขปืนลูกซอง th f=n->(...)เรียกว่าให้มันชื่อเช่น

ตัวอย่าง:

julia> for i = 1:10 println(f(i)) end
1
4
8
6
12
14
16
9
18
20

ขณะนี้เป็นไปตาม @ SP3000 น่ากลัวคำตอบหลาม ฉันจะกลับมาใหม่ในเร็ว ๆ นี้เพราะจะต้องมีวิธีที่สั้นกว่าในการทำจูเลียในสิ่งที่ฉันทำที่นี่ ยินดีต้อนรับการป้อนข้อมูลใด ๆ เช่นเคย



3

CJam, 28 27 ไบต์

ดังนั้นนี่เป็นเรื่องน่าอายเล็กน้อย ... ก่อนโพสต์สิ่งนี้ฉันลองเล่นกอล์ฟด้วยตัวเองและไปถึง 30 ไบต์ใน CJam ยังไม่มีคำตอบใดที่เอาชนะได้ ในขณะเดียวกันฉันก็สามารถกำจัดได้อีกสามไบต์ มีเป็นวิธีการแก้ปัญหา Pyth สั้นในความคิดเห็น แต่ไม่มีอะไรที่สั้นลงได้รับการโพสต์ในคำตอบเพื่อให้ที่นี่มันเป็น บางทีมันอาจเป็นแรงบันดาลใจให้ผู้คน APL / J ลองหนักขึ้นเล็กน้อย (หรือบางคนโพสต์โซลูชั่น Pyth) ก่อนที่ฉันจะต้องตอบคำถามของตัวเอง ;)

l~__(,f-{_I_+%_+I-_zI=*+}fI

ทดสอบที่นี่

คำอธิบาย

l~                          "Read input N and eval.";
  __(,                      "Duplicate twice, create range [0 1 2 ... N-2].";
      f-                    "Subtract each from N, giving [N N-1 N-2 ... 2].";
        {               }fI "For each element, storing the element in I.";
         _I_+%_+I-          "Compute 2(N % 2I)-I - the shuffling offset";
                  _zI=      "Check that this offset is ±I.";
                      *+    "Multiply the offset by this boolean and update to N.";



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