คำนวณ A190810


27

งานของคุณเป็นเรื่องง่ายสวยคำนวณ n-TH องค์ประกอบของA190810

องค์ประกอบของ A190810 ถูกคำนวณตามกฎเหล่านี้:

  1. องค์ประกอบแรกคือ 1
  2. ลำดับกำลังเพิ่มขึ้น
  3. หากxเกิดขึ้นในลำดับที่แล้ว2x+1และ3x-1ยังทำ

คุณสามารถใช้การจัดทำดัชนีแบบ 1 หรือ 0 แต่ถ้าคุณใช้การจัดทำดัชนีแบบ 0 โปรดพูดในคำตอบ

กรณีทดสอบ

a(1) = 1
a(2) = 2
a(3) = 3
a(4) = 5
a(5) = 7
a(10) = 17
a(20) = 50
a(30) = 95
a(55) = 255

ตั้งแต่นี้เป็นรหัสกอล์ฟคำตอบที่สั้นที่สุดในไบต์ชนะ!


2
คุณควรเพิ่มกรณีทดสอบที่ใหญ่ขึ้น
mbomb007

7
คุณช่วยอธิบายสิ่งนี้ให้ชัดเจนยิ่งขึ้นได้ไหม? ฉันเป็นเจ้าของภาษาอังกฤษและฉันไม่รู้ว่า "... และถ้า x อยู่ในช่วง 2x + 1 และ 3x-1 อยู่ใน a" ควรจะหมายถึง
แมว

1
@cat x ϵ A → (2*x) + 1 ϵ Aและx ϵ A → (3*x)-1 ϵ Aโดยที่ϵหมายความว่า "เป็นสมาชิกของ" และสามารถเข้าใจได้ว่า "หมายถึง"
สตีเวนเอช

3
เงื่อนไขโดยนัย: ลำดับไม่ได้มีตัวเลขที่กฎอื่นไม่จำเป็นต้องใช้ (มิฉะนั้น $ a (i) = i $ จะเป็นลำดับที่ถูกต้อง)
Stig Hemmer

1
และคุณจะได้รับคำตอบจาก Mathematica และ Haskell ฟรี :)
หยุดการทำร้ายโมนิก้า

คำตอบ:


9

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

×3’;Ḥ‘$;
1Ç¡ṢQ³ị

ไม่มีประสิทธิภาพมาก ลองออนไลน์!

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

1Ç¡ṢQ³ị   Main link. Argument: n (integer)

1         Set the return value to 1.
 Ç¡       Execute the helper link n times.
   Ṣ      Sort the resulting array.
    Q     Unique; deduplicate the sorted array.
     ³ị   Retrieve its n-th element.


×3’;Ḥ‘$;  Helper link. Argument: A (array)

×3        Multiply all elements of A by 3.
  ’       Decrement the resulting products.
      $   Combine the two links to the left into a monadic chain.
    Ḥ     Unhalve; multiply all elements of A by 2.
     ‘    Increment the resulting products.
   ;      Concatenate 3A-1 and 2A+1.
       ;  Concatenate the result with A.

1
นั่นอาจจะเป็น 16 ตัวอักษรแต่ผมไม่ทราบว่าการเข้ารหัสใด ๆ ที่แสดงถึงว่าในเวลาน้อยกว่า 30 ไบต์
รวย remer

18
เจลลี่มีเพจรหัสของตัวเองซึ่งอนุญาตให้อักขระเหล่านี้มีขนาด 1 ไบต์

15

Python 2, 88 83 72 ไบต์

คุณอาจต้องการอ่านโปรแกรมในคำตอบนี้ในลำดับย้อนกลับ ...

ช้าลงและสั้นลงขอบคุณเดนนิส:

L=1,;exec'L+=2*L[0]+1,3*L[0]-1;L=sorted(set(L))[1:];'*input()
print L[0]

ลองออนไลน์


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

ฉันอาจจะออกไปเล่นกอล์ฟเดนนิส : D

L=[1]
n=input()
while n:L+=[2*L[0]+1,3*L[0]-1];n-=1;L=sorted(set(L))[1:]
print L[0]

ลองออนไลน์


รุ่นด้านล่างนี้ ( 88 ไบต์ ) ทำงานได้เร็วมากค้นหาองค์ประกอบที่ 500,000 ในเวลาประมาณสองวินาที

มันค่อนข้างง่าย คำนวณองค์ประกอบของรายการจนกว่าจะมีองค์ประกอบมากกว่าสามเท่าnเนื่องจากทุกองค์ประกอบที่เพิ่มอาจเพิ่มองค์ประกอบที่ไม่ซ้ำกันได้อีก 2 รายการ จากนั้นลบรายการที่ซ้ำกันเรียงลำดับและพิมพ์nอิลิเมนต์ th

L=[1]
i=0
n=input()
while len(L)<3*n:L+=[2*L[i]+1,3*L[i]-1];i+=1
print sorted(set(L))[n]

ลองออนไลน์


8

Python 2, 59 ไบต์

t={1}
exec'm=min(t);t=t-{m}|{2*m+1,3*m-1};'*input()
print m

ขึ้นอยู่กับ@ mbomb007 คำตอบของงูหลาม ทดสอบบนIdeone


"ไม่มีใครเก่งกว่าเดนนิส" ... ฉันหวังว่าฉันจะนึกถึงการใช้ตัวอักษรตั้ง ดูเหมือนชัดเจนมากในขณะนี้ คำตอบนี้เร็วกว่าโปรแกรม "เร็ว" ของฉันหรือไม่ถ้าคุณเปลี่ยนจากการรันสตริงเป็นโค้ดจริง?
mbomb007

Nope มันช้ากว่า ชุดปฏิบัติการมีราคาแพงกว่า
mbomb007

ใช่minเป็นO (n)ในขณะที่การจัดทำดัชนีรายการคือO (1)ดังนั้นวิธีนี้จึงเป็นอย่างน้อยO (n²) ...
Dennis

8

Haskell, 76 73 69 ไบต์

a#b=mod a b<1&&t(div a b)
t x=x<2||(x-1)#2||(x+1)#3
(filter t[1..]!!)

ใช้ดัชนีที่ใช้ 0 ตัวอย่างการใช้งาน: ->(filter t[1..]!!) 54255

แทนที่จะสร้างรายการด้วยการแทรกซ้ำ ๆ2x+1และ3x-1ตามที่เห็นในคำตอบอื่น ๆ ส่วนใหญ่ฉันจะผ่านจำนวนเต็มทั้งหมดและตรวจสอบว่าพวกเขาสามารถลดลงได้1โดยการใช้ซ้ำ ๆ(x-1) / 2หรือ(x+1) / 3ถ้าหารได้


ที่ไม่ได้กำหนดฟังก์ชั่นหรือตัวอย่างรหัสที่ถูกต้องจริงเหรอ?
ซีตา

@Zeta บรรทัดสุดท้ายประเมินว่าเป็นฟังก์ชันที่ไม่มีชื่อ
Zgarb

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

2
@Zgarb ฉันคิดว่าสำหรับบรรทัดสุดท้ายกำหนดให้เป็นผูกพัน (เช่นf=filter t[1..]!!) เพราะฉันไม่คิดว่ามันถูกต้อง
TuxCrafting

1
@ TùxCräftîñgในMeta โพสต์นี้มันถูกกำหนดว่าฟังก์ชั่นตัวช่วยเพิ่มเติมเป็นที่ยอมรับโดยค่าเริ่มต้นในสถานการณ์นี้ นี่เป็นรูปแบบที่ฉันมักจะเห็นสำหรับคำตอบของ Haskell ที่นี่ แน่นอนว่าคุณในฐานะผู้ประพันธ์ท้าทายมีอำนาจขั้นสุดท้าย
Zgarb

7

Haskell, 77 74 ไบต์

import Data.List
i=insert
f(x:y)=x:f(i(2*x+1)$i(3*x-1)y)
a=(!!)(nub$f[1])

นี่เป็นฟังก์ชันaสำหรับรายการที่ n มันเป็นศูนย์การจัดทำดัชนี หรือa=nub$f[1]จะสร้างรายการทั้งหมด (อย่างเกียจคร้าน)

มันเป็นรายการที่แตกต่างจากSetรหัสของ Reinhard Zumkeller


ทำไมไม่yแทนที่จะxsบันทึกสองไบต์? นอกจากนี้ฉันเชื่อว่าคุณอาจสามารถตัดบรรทัดสุดท้ายเป็นอย่างเช่น(!!)$nub.f[1]
Michael Klein

@MichaelKlein: ฉันก็ชิน(x:xs)จนลืมไปแล้วขอบคุณ
ซีตา

6

Python 2, 88 84 ไบต์

g=lambda k:g(k%2*k/2)|g(k%3/2*-~k/3)if k>1else k
f=lambda n,k=1:n and-~f(n-g(k),k+1)

ทดสอบบนIdeone


13
คุณเป็นมืออาชีพในการเปลี่ยนสิ่งที่เรียบง่ายให้กลายเป็นสิ่งที่อ่านไม่ได้
mbomb007


5

Brachylogขนาด 45 ไบต์

:1-I,?:?*:1ydo:Im.
1.|:1-:1&I(:3*:1-.;I*:1+.)

คำนวณN = 1000ในเวลาประมาณ 6 วินาทีในเครื่องของฉัน

นี่คือดัชนี 1 เช่น

run_from_file('code.brachylog',1000,Z).
Z = 13961 .

คำอธิบาย

  • ภาคแสดงหลัก:

    :1-I,               I = Input - 1
         ?:?*           Square the Input
             :1y        Find the first Input*Input valid outputs of predicate 1
                do      Remove duplicates and order
                  :Im.  Output is the Ith element
    
  • คำกริยาที่ 1:

    1.                  Input = Output = 1
    |                   Or
    :1-:1&I             I is the output of predicate 1 called with Input - 1 as input
           (            
             :3*:1-.      Output is 3*I-1
           ;            Or
             I*:1+.       Output is 2*I+1
           )
    

คุณอาจจะทราบว่าเราไม่ได้ผ่านการป้อนข้อมูลใด ๆ ที่จะวินิจฉัย 1 y - Yieldเมื่อเราเรียกว่า เนื่องจากการแพร่กระจายข้อ จำกัด มันจะหาอินพุตที่ถูกต้องเมื่อถึง1.ข้อซึ่งจะเผยแพร่ค่าอินพุตที่ถูกต้อง


4

MATL, 19, 18 17 ไบต์

1w:"tEQy3*qvSu]G)

นี่เป็นอัลกอริทึมที่ไม่มีประสิทธิภาพอย่างยิ่ง ล่ามออนไลน์หมดหน่วยความจำสำหรับอินพุตที่มากกว่า 13

บันทึกหนึ่งไบต์ขอบคุณ Luis Mendo!

ลองออนไลน์!

รุ่นนี้ยาวกว่า แต่มีประสิทธิภาพมากกว่า (21 ไบต์)

1`tEQy3*qvSutnG3*<]G)

ลองออนไลน์

คำอธิบาย:

วิธีตรรกะในการทำคือการเพิ่มองค์ประกอบลงในอาร์เรย์จนกว่ามันจะนานพอที่จะคว้าองค์ประกอบของฉัน นั่นเป็นวิธีที่มีประสิทธิภาพทำงาน วิธีgolfy (และไม่มีประสิทธิภาพ) ที่จะทำคือเพียงแค่เพิ่มขนาดอาร์เรย์ที่ฉันครั้ง

1ดังนั้นครั้งแรกที่เรากำหนดอาร์เรย์เริ่มต้น: จากนั้นเราสลับองค์ประกอบสองอันดับแรกเพื่อให้อินพุตอยู่ด้านบน w. :"ตอนนี้เราห่วงผ่านการป้อนข้อมูลด้วย ดังนั้นฉันคูณ:

t             %Duplicate our starting (or current) array.
 EQ           %Double it and increment
   y          %Push our starting array again
    3*q       %Multiply by 3 and decrement
       v      %Concatenate these two arrays and the starting array
        Su    %Sort them and remove all duplicate elements.

ตอนนี้เรามีลำดับขนาดมหึมา (จำเป็นต้องใช้วิธีการคำนวณมากกว่า) ดังนั้นเราจึงหยุดวนรอบ]และคว้าหมายเลข i จากอาร์เรย์นี้ด้วยG)(ทำดัชนี 1 รายการ)


@LuisMendo ขอบคุณสำหรับเคล็ดลับ! คุณจะเขียนมันใหม่อีกครั้งด้วย while while แทนที่จะเป็น for loop อย่างไร (อาจเป็นคำถามที่ดีกว่าสำหรับห้องแชทของ
MATL

มันสามารถทำได้ด้วยวิธีนี้: 1`tEQy3*qvuStnG<]G). เงื่อนไขการวนซ้ำคือtnG<(ออกเมื่ออาร์เรย์มีขนาดที่ต้องการแล้ว)
Luis Mendo

ไม่แน่ใจว่ามันโกงมากแค่ไหน แต่ในforรุ่น -loop คุณสามารถป้อนข้อมูลด้วยตัวอักษร unaryว่าเป็นสตริงและลบออกได้:
Luis Mendo

4

JavaScript (ES6), 63 ไบต์

 f=(n,a=[1],i=0)=>a[i++]?--n?f(n,a,a[i*2]=a[i*3-2]=1):i:f(n,a,i)

อาจยอมแพ้อย่างรวดเร็วเนื่องจากการเรียกซ้ำ


4

จอประสาทตา, 57

^.+
$*¶¶1
¶¶(1(1*))
¶1$1$1¶$2$1$1
O`
}`(¶1+)\1\b
$1
G2`
1

ลองออนไลน์!

0 การจัดทำดัชนี ทำตามอัลกอริธึมที่ใช้บ่อย: ลบค่าต่ำสุดจากชุดปัจจุบันเรียกมันxและเพิ่ม2x+1และ3x-1ตั้งค่าจำนวนครั้งเท่ากับการป้อนข้อมูลจากนั้นหมายเลขนำคือผลลัพธ์ "set" ใน Retina เป็นเพียงรายการที่เรียงลำดับซ้ำ ๆ และสร้างขึ้นเพื่อมีองค์ประกอบที่ไม่ซ้ำกันเท่านั้น มีบิตลับ ๆ ล่อๆถูกเพิ่มเข้าไปในอัลกอริทึมสำหรับกอล์ฟซึ่งฉันจะอธิบายเมื่อฉันมีเวลามากขึ้น

ขอบคุณมาร์ตินอย่างมากสำหรับการเล่นกอล์ฟที่มีขนาดประมาณ 20 ไบต์!


4

Clojure, 114 108 ไบต์

#(loop[a(sorted-set 1)n 1](let[x(first a)](if(= n %)x(recur(conj(disj a x)(+(* 2 x)1)(-(* 3 x)1))(inc n)))))

ฉันจะไม่แปลกใจถ้าสิ่งนี้สามารถเล่นกอล์ฟ / ลดจำนวนมาก แต่setไม่สนับสนุน nth จริง ๆ ทำร้ายความคิดของฉัน

ลองออนไลน์

รุ่นที่มีช่องว่าง:

#(loop [a (sorted-set 1)
        n 1]
  (let [x (first a)]
    (if (= n %)
      x
      (recur (conj (disj a x) (+ (* 2 x) 1) (- (* 3 x) 1)) (inc n))
      )))

4

05AB1E, 18 17 ไบต์

ใช้การเข้ารหัสCP-1252

$Fз>s3*<)˜Ù}ï{¹è

คำอธิบาย

$                  # initialize with 1
 F          }      # input number of times do
  Ð                # triplicate current list/number
   ·>              # double one copy and add 1
     s3*<          # multiply one copy by 3 and subtract 1
         )˜Ù       # combine the 3 lists to 1 list and remove duplicates
             ï{    # convert list to int and sort
               ¹è  # take the element from the list at index input

ลองใช้ออนไลน์เพื่อหาตัวเลขขนาดเล็ก

ช้ามาก.
ใช้การจัดทำดัชนีแบบ 0


3

C ++, 102 ไบต์

[](int i){int t;map<int,int>k;for(k[1];i--;k.erase(t))t=k.begin()->first,k[t*2+1],k[t*3-1];return t;};

ฟังก์ชั่นนี้ต้องแลมบ์ดาและ#include <map>using std::map

mapนี่เป็นเพียงคอลเลกชันของคีย์; ค่าของพวกเขาจะถูกละเว้น ฉันใช้mapเพื่อรับประโยชน์จากรหัสสั้นสำหรับการแทรก:

k[1]; // inserts the key 1 into the map

ขอบคุณที่เรียงลำดับขององค์ประกอบที่เล็กที่สุดถูกสกัดด้วยmapk.begin()->first


1
เล็กน้อยสั้น (97) การใช้และการเริ่มต้นรายการ:set [](int i){int t;set<int>k{1};for(;i--;k.erase(t))t=*k.begin(),k.insert({t*2+1,t*3-1});return t;};
nwn

3

ที่จริงแล้ว 27 ไบต์

╗1#╜`;;2*1+)3*1@-#++╔S`n╜@E

ลองออนไลน์!

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

คำอธิบาย:

╗1#╜`;;2*1+)3*1@-#++╔S`n╜@E
╗                            save input (n) in register 0
 1#                          push [1]
   ╜                         push n
    `;;2*1+)3*1@-#++╔S`n     do the following n times:
     ;;                        make two copies of the list
       2*1+                    apply 2x+1 to each element in one copy
           )3*1@-              and 3x-1 to each element in the other copy
                 #             workaround for a weird list bug
                  ++           append those two lists to the original list
                    ╔S         uniquify and sort
                        ╜@E  get the nth element (0-indexed)

2

CJam (25 ไบต์)

ri1a1${{_2*)1$3*(}%_&}*$=

สาธิตออนไลน์ โปรดทราบว่านี่ใช้การทำดัชนีแบบ zero-based

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


2
22: 1ari{(_2*)\3*(@||$}*0=(มีประสิทธิภาพมากกว่าเยอะ)
Martin Ender

2

เรติน่า 48 ไบต์

.+
$*
+1`^(((!*)!(!|\3)(?=\3!1))*!)1|\b
!$1
-2`.

ลองออนไลน์!

ได้รับแรงบันดาลใจจากคำตอบของ nimiฉันคิดว่าฉันลองใช้วิธีการที่ต่างออกไปสำหรับ Retina การใช้ backtracking engine ของ regex เพื่อค้นหาว่ามีหมายเลขใด (unary) ที่เรียงตามลำดับหรือไม่ ปรากฎว่าสิ่งนี้สามารถกำหนดได้ด้วย 27 ไบต์ regex แต่การใช้มันมีค่าใช้จ่ายอีกไม่กี่ แต่มันก็ยังสั้นลงกว่าวิธีการกำเนิด

นี่คือทางเลือก 48- ไบต์ของโซลูชัน:

.+
$*
{`1\b
1!
}T`1``1((!*)!(!|\2)(?=!\2$))*!$
!

และการใช้ unary I / O เราสามารถทำ 42 ไบต์ได้ แต่ฉันพยายามหลีกเลี่ยงปัญหานั้นและคำตอบที่จอประสาทตาอื่นก็ใช้ทศนิยมเช่นกัน

1\b
1!
}T`1``1((!*)!(!|\2)(?=!\2$))*!$
!
1

2

Ruby, 70 ไบต์

->n{a=*1
n.times{a<<a.map{|i|([2*i+1,3*i-1]-a).min||1.0/0}.min}
a[-2]}

คำอธิบาย

->n{
    # Magical, golfy way of initializing an array. Equivalent to a = [1].
    a=*1
    n.times{
        # Generate the next element in the sequence, by...
        a<<
            # ... finding the minimal term that will appear at some point.
            a.map{|i|
                ([2*i+1,3*i-1]-a).min||1.0/0
            }.min
    }
    # We generated n+1 elements, so we'll take the *second* to last one.
    a[-2]
}

1
ว่า*1เคล็ดลับที่เป็นระเบียบ
TuxCrafting

1

J, 31 ไบต์

{1(]]/:~@~.@,3&*,&:<:2*>:)^:[~]

ใช้การทำดัชนีแบบ zero-based หน่วยความจำไม่มีประสิทธิภาพมาก

คำอธิบาย

{1(]]/:~@~.@,3&*,&:<:2*>:)^:[~]  Input: n
                              ]  Identity function, gets n
 1                               The constant 1
  (                      )^:[~   Repeat n times with an initial array a = [1]
                       >:          Increment each in a
                     2*            Multiply by 2 to get 2a+2
             3&*                   Multiply each in a by 3 to get 3a
                 &:<:              Decrement both x and y to get 2a+1 and 3a-1
                ,                  Join them
    ]                              Identity function, gets a
            ,                      Join a with 2a+1 and 3a-1
         ~.@                       Take the distinct values
     /:~@                          Sort up
   ]                               Return the sorted list
{                                Select the value from the list at index n and return it

1

อ็อกเทฟ, 68 ไบต์

function r=a(n)s=1;for(i=1:n)r=s(i);s=union(s,[r*2+1 r*3-1]);end;end

คุณสามารถลบรอบสุดท้าย;end
Luis Mendo

ในเวอร์ชันที่ฉันใช้อย่างน้อย (4.0.0) คุณไม่สามารถ ...
dcsohl

1

Perl, 173 132 bytes +1 สำหรับ -n = 133

sub c{my$a=pop;return($a==1||($a%2&&c(($a-1)/2))?1:$a%3!=2?0:$a%3==2?c(($a+1)/3):1)}while($#b<$_){$i++;@b=(@b,$i)if c$i}say$b[$_-1];

Ungolfed:

my @array = ();
my $n = <>;
sub chk {
    my $a = shift;
    return 1 if ($a == 1);
    if ($a % 2 == 0) {
        if ($a % 3 != 2) {
            return 0;
        } else {
            return chk(($a + 1) / 3);
        }
    } else {
        if (chk(($a - 1) / 2) == 0) {
            if ($a % 3 != 2) {
                return 0;
            } else {
                return chk(($a + 1) / 3);
            }
        } else {
            return 1
        }
    }
}
my $i = 1;
while ($#array < $n-1) {
    push(@array,$i) if (chk($i) == 1);
    $i++;
}
print $array[$n];

ฉันอาจจะทำได้ดีกว่านี้ถ้าฉันคิดถึงเรื่องนี้มากขึ้น แต่นี่คือสิ่งที่ฉันคิดขึ้นหลังจากนั้นไม่กี่นาที การเล่นกอล์ฟครั้งแรกของฉันดังนั้นมันสนุกมาก!

ขอบคุณ @Dada และ @ TùxCräftîñg (และการเพิ่มประสิทธิภาพเล็ก ๆ น้อย ๆ ของไบต์) สำหรับ -40 ไบต์


1
ฉันคิดว่าคุณสามารถวางช่องว่างหลังจากmys returnและและprint(ไม่สามารถทดสอบไม่มี Perl)
TuxCrafting

1
@ returnTùxCräftîñgที่ถูกต้องเกี่ยวกับ สามารถแทนที่ด้วยprint sayส่วนใหญ่myไม่จำเป็นต้องใช้ (คุณต้องการเพียงหนึ่งก่อน$aในฟังก์ชั่นที่ฉันคิดว่าอย่าเริ่มต้นหรือประกาศ@bคุณอาจวางการเริ่มต้นของ$iถ้าคุณทำ$i++ในช่วงเริ่มต้นของการแทนในขณะที่สิ้นสุด. popเป็น สั้นกว่าshiftโปรดจำไว้ว่ามีมากกว่าการเล่นกอล์ฟ perl มากกว่าแค่ลบ whitespaces และ newlines ...
Dada

0

JavaScript (ES6), 58

n=>(a=>{for(;n;)a[++i]?a[i-~i]=a[3*i-1]=--n:0})([i=0,1])|i

น้อย golfed

n=>{
  a=[];
  a[1] = 1;
  for(i = 0; n;)
  {
    ++i
    if (a[i])
    {
      a[2*i+1] = 1;
      a[3*i-1] = 1;
      --n;
    }
  }
  return i
}

ทดสอบ

เกี่ยวกับเวลาและหน่วยความจำ: องค์ประกอบ 500000 ใน ~ 20 วินาทีและ 300MB ที่ใช้โดย FireFox 64 บิตอัลฟาของฉัน

F=
n=>(a=>{for(;n;)a[++i]?a[i-~i]=a[3*i-1]=--n:0})([i=0,1])|i

function test() {
  var n=+I.value, t0=+new Date
  O.textContent = F(n)
  console.log((+new Date-t0)/1000,'sec')
}  

test()
#I { width:5em}
<input id=I type=number value=10 oninput="test()"> 
<span id=O></span>

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