ใหม่ # 4 คำสั่ง: โลก


17

บทนำ(อาจถูกละเว้น)

การใส่ตัวเลขบวกทั้งหมดตามลำดับปกติ (1, 2, 3, ... ) นั้นน่าเบื่อนิดหน่อยใช่ไหม? ดังนั้นนี่คือชุดของความท้าทายรอบพีชคณิต (reshuffelings) ของจำนวนบวกทั้งหมด นี่คือความท้าทายที่สี่ในชุดนี้ (เชื่อมโยงไปครั้งแรก , ครั้งที่สองและสามความท้าทาย)

ในความท้าทายนี้เราจะสำรวจไม่ได้หนึ่งในการเปลี่ยนแปลงของจำนวนธรรมชาติ แต่ทั้งโลกของพีชคณิต!

ในปี 2000 คลาร์ก Kimberlingถูกวางปัญหาใน 26 วันปัญหาของปม Mathematicorum , วารสารวิทยาศาสตร์ของคณิตศาสตร์ที่เผยแพร่โดยสมาคมคณิตศาสตร์แคนาดา ปัญหาคือ:

Sequence a={a1=1an=an12 if an12{0,a1,...,an1}an=3an-1 มิฉะนั้น

ทุกจำนวนเต็มบวกเกิดขึ้นเพียงครั้งเดียวในลำดับนี้

ในปี 2004 Mateusz Kwasnicki ให้การพิสูจน์เชิงบวกในวารสารเดียวกันและในปี 2008 เขาได้ตีพิมพ์เอกสารที่เป็นทางการมากขึ้นและ (เปรียบเทียบกับคำถามเดิม) เป็นข้อพิสูจน์ทั่วไปมากขึ้น เขากำหนดลำดับด้วยพารามิเตอร์และ :พีQ

{a1=1an=an1q if an1q{0,a1,...,an1}an=pan1 otherwise

เขาพิสูจน์ให้เห็นว่าสำหรับนั้นไม่มีเหตุผลลำดับคือการเปลี่ยนแปลงของจำนวนธรรมชาติ เนื่องจากมีจำนวนค่าและไม่สิ้นสุดซึ่งเป็นความจริงนี่จึงเป็นโลกทั้งโลกแห่งการเปลี่ยนแปลงของจำนวนธรรมชาติ เราจะยึดติดกับต้นฉบับและสำหรับพารามิเตอร์เหล่านี้ลำดับสามารถพบได้เป็นA050000ใน OEIS องค์ประกอบ 20 อันดับแรกคือ:p,q>1logp(q)pq( p , q ) = ( 3 , 2 )(p,q)=(3,2)

1, 3, 9, 4, 2, 6, 18, 54, 27, 13, 39, 19, 57, 28, 14, 7, 21, 10, 5, 15

ตั้งแต่นี้เป็น "ลำดับบริสุทธิ์" ความท้าทายของงานคือการเอาท์พุทสำหรับให้เป็น input ที่เป็นA050000a(n)na(n)

งาน

รับอินพุตจำนวนเต็มส่งออกในรูปแบบจำนวนเต็มโดยที่:na(n)

{a(1)=1a(n)=a(n1)2 if a(n1)2{0,a1,...,a(n1)}a(n)=3a(n1) otherwise

หมายเหตุ: การจัดทำดัชนีแบบ 1 จะถือว่าที่นี่ คุณอาจใช้การจัดทำดัชนีดังนั้นฯลฯ โปรดพูดถึงสิ่งนี้ในคำตอบของคุณหากคุณเลือกที่จะใช้a(0)=1;a(1)=3

กรณีทดสอบ

Input | Output
---------------
1     |  1
5     |  2
20    |  15
50    |  165
78    |  207
123   |  94
1234  |  3537
3000  |  2245
9999  |  4065
29890 |  149853

กฎระเบียบ

  • อินพุตและเอาต์พุตเป็นจำนวนเต็ม (อย่างน้อยโปรแกรมของคุณควรสนับสนุนอินพุตและเอาต์พุตในช่วง 1 ถึง 32767)
  • อินพุตไม่ถูกต้อง (0, ลอย, สตริง, ค่าลบ, ฯลฯ ) อาจนำไปสู่ผลลัพธ์ที่ไม่ได้คาดการณ์ไว้, ข้อผิดพลาดหรือ (un) พฤติกรรมที่กำหนดไว้
  • ใช้กฎ I / Oเริ่มต้น
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ

ฉันจะตอบคำถามนี้โดยใช้ TI-BASIC แต่ข้อมูลจะถูก จำกัด ที่เนื่องจากรายการจะถูก จำกัด ที่ 999 องค์ประกอบ ความท้าทายที่ยิ่งใหญ่กระนั้น! 0<ยังไม่มีข้อความ<1000
เอกภาพ

@Tau: แม้ว่า out-of-spec (และนี่ไม่ใช่การแข่งขัน) ฉันจะสนใจวิธีการแก้ปัญหาของคุณ คุณมีโพสต์ที่คุณสามารถโพสต์ได้หรือไม่?
ตลอดไป

1
ฉันลบโปรแกรมแล้ว แต่ควรจะสามารถสร้างใหม่ได้ ฉันจะโพสต์มันว่าไม่ใช่การแข่งขันเมื่อฉันได้ทำมันใหม่
เอกภาพ

@agtoever "ไม่ใช่การแข่งขัน" ไม่ครอบคลุมโซลูชันที่ไม่ถูกต้อง มันเป็นวิธีการแก้ปัญหาโดยใช้ภาษาหรือคุณสมบัติภาษาที่สร้างขึ้นหลังจากความท้าทายถูกโพสต์
Shaggy

PP&CG metaนั้นชัดเจนมากในเรื่องนี้ ฉันไม่ได้รับรางวัลสำหรับการตีความที่เข้มงวดของ "ไม่แข่งขัน" ... @Tau: ดูเหมือนว่าคุณไม่สามารถโพสต์โซลูชัน TI-BASIC ของคุณได้ภายใต้กฎเหล่านี้ ขอโทษ
ตลอดไป

คำตอบ:


3

Japt , 15 14 ไบต์

1 การจัดทำดัชนี

@[X*3Xz]kZ Ì}g

ลองมัน

@[X*3Xz]kZ Ì}g     :Implicit input of integer U
             g     :Starting with the array [0,1] do the following U times, pushing the result to the array each time
@                  :  Pass the last element X in the array Z through the following function
 [                 :    Build an array containing
  X*3              :      X multiplied by 3
     Xz            :      X floor divided by 2
       ]           :    Close array
        kZ         :    Remove all elements contained in Z
           Ì       :    Get the last element
            }      :  End function
                   :Implicit output of the last element in the array

7

JavaScript (ES6),  55 51  50 ไบต์

บันทึก 1 ไบต์ขอบคุณ @EmbodimentofIgnorance
บันทึกแล้ว 1 ไบต์ขอบคุณ @tsh

n=>eval("for(o=[p=2];n--;)o[p=o[q=p>>1]?3*p:q]=p")

ลองออนไลน์!



@EmbodimentofIgnorance ฉันมักจะหลีกเลี่ยงการหลอกลวงว่าเป็นรหัส eval'ed เป็นมากช้าลง แต่ความแตกต่างนั้นแทบจะไม่สังเกตเห็นได้เลยสำหรับฉันคนนั้นดังนั้นฉันเดาว่าไม่เป็นไร
Arnauld

2
แต่นี่คือรหัส - กอล์ฟเราไม่สนใจความเร็วตราบเท่าที่มันทำงานเสร็จ
ศูนย์รวมความไม่รู้

n=>eval("for(o=[p=2];n--;)o[p=o[q=p>>1]?3*p:q]=p")
TSH

5

เยลลี่ 15 ไบต์

µ×3żHḞḢḟȯ1Ṫ;µ¡Ḣ

โปรแกรมเต็มรูปแบบที่รับจำนวนเต็มn(อิง 1) จาก STDIN ซึ่งพิมพ์ผลลัพธ์

ลองออนไลน์!

อย่างไร?

µ×3żHḞḢḟȯ1Ṫ;µ¡Ḣ - Main Link: no arguments (implicit left argument = 0)
µ           µ¡  - repeat this monadic chain STDIN times (starting with x=0)
                -                   e.g. x = ...  0      [1,0]            [9,3,1,0]
 ×3             -   multiply by 3                 0      [3,0]            [27,9,3,0]
    H           -   halve                         0      [1.5,0]          [4.5,1.5,0.5,0]
   ż            -   zip together                  [0,0]  [[3,1.5],[0,0]]  [[27,4.5],[9,1.5],[3,0.5],[0,0]]
     Ḟ          -   floor                         [0,0]  [[3,1],[0,0]]    [[27,4],[9,1],[3,0],[0,0]]
      Ḣ         -   head                          0      [3,1]            [27,4]
       ḟ        -   filter discard if in x        []     [3]              [27,4]
        ȯ1      -   logical OR with 1             1      [3]              [27,4]
          Ṫ     -   tail                          1      3                4
           ;    -   concatenate with x            [1,0]  [3,1,0]          [4,9,3,1,0]
              Ḣ - head                            1      3                4
                - implicit print

4

05AB1E , 16 15 ไบต์

ที่บันทึกไว้ 1 ขอบคุณไบต์เควิน Cruijssen
0 การจัดทำดัชนี

¾ˆ$FDˆx3*‚;ï¯Kн

ลองออนไลน์!

คำอธิบาย

ใช้n=1เป็นตัวอย่าง

¾ˆ                 # initialize global array as [0]
  $                # initialize stack with 1, input
   F               # input times do:
    Dˆ             # duplicate current item (initially 1) and add one copy to global array
                   # STACK: 1, GLOBAL_ARRAY: [0, 1]
      x            # push Top_of_stack*2
                   # STACK: 1, 2, GLOBAL_ARRAY: [0, 1]
       3*          # multiply by 3
                   # STACK: 1, 6, GLOBAL_ARRAY: [0, 1]
         ‚;ï       # pair and integer divide both by 2
                   # STACK: [0, 3], GLOBAL_ARRAY: [0, 1]
            ¯K     # remove any numbers already in the global array
                   # STACK: [3], GLOBAL_ARRAY: [0, 1]
              н    # and take the head
                   # STACK: 3


@KevinCruijssen: ขอบคุณ! ฉันคิดว่าการใช้อาร์เรย์ทั่วโลก แต่คิดว่ามันจะมีความยาวเท่ากับรายการในสแต็กและไม่เคยลอง: /
Emigna

4

Perl 6 , 49 ไบต์

-2 ไบต์ต้องขอบคุณอย่างยิ่ง

{(1,3,{(3*@_[*-1]Xdiv 6,1).max(*∉@_)}...*)[$_]}

ลองออนไลน์!

ส่งคืนองค์ประกอบ 0 ดัชนีในลำดับ คุณสามารถเปลี่ยนสิ่งนี้เป็น 1 ดัชนีโดยการเปลี่ยนองค์ประกอบเริ่มต้นเป็น0,1แทน1,3

คำอธิบาย:

{                                             }  # Anonymous code block
 (                                   ...*)[$_]   # Index into the infinite sequence
  1,3                                            # That starts with 1,3
     ,{                             }            # And each element is
       (                 ).max(    )             # The first of
          @_[*-1]X                               # The previous element
        3*        div 6                          # Halved and floored
        3*        div  ,1                        # Or tripled
                               *∉@_             # That hasn't appeared in the sequence yet

3

J , 47 40 ไบต์

[:{:0 1(],<.@-:@{:@](e.{[,3*{:@])])^:[~]

ลองออนไลน์!

ungolfed

[: {: 0 1 (] , <.@-:@{:@] (e. { [ , 3 * {:@]) ])^:[~ ]

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


3

Java 10, 120 99 ไบต์

n->{var L=" 1 0 ";int r=1,t;for(;n-->0;L+=r+" ")if(L.contains(" "+(r=(t=r)/2)+" "))r=t*3;return r;}

ลองออนไลน์

คำอธิบาย:

n->{                              // Method with integer as both parameter and return-type
  var L=" 1 0 ";                  //  Create a String that acts as 'List', starting at [1,0]
  int r=1,                        //  Result-integer, starting at 1
      t;                          //  Temp-integer, uninitialized
  for(;n-->0;                     //  Loop the input amount of times:
      L+=r+" "))                  //    After every iteration: add the result to the 'List'
                          t=r     //   Create a copy of the result in `t`
                       r=(...)/2  //   Then integer-divide the result by 2
    if(L.contains(" "+(...)+" ")) //   If the 'List' contains this result//2:
      r=t*3;                      //    Set the result to `t` multiplied by 3 instead
  return r;}                      //  Return the result




2

C ++ (gcc) , 189 180 ไบต์

-9 ไบต์ถึงการตีกอล์ฟขนาดเล็ก

#import<vector>
#import<algorithm>
int a(int n){std::vector<int>s={1};for(int i=0;i<n;++i)s.push_back(i&&std::find(s.begin(),s.end(),s[i]/2)==s.end()?s[i]/2:3*s[i]);return s[n-1];}

ลองออนไลน์!

คำนวณลำดับขึ้นไปnจากนั้นส่งคืนองค์ประกอบที่ต้องการ ช้าสำหรับดัชนีขนาดใหญ่


@ceilingcat น่าเสียดายที่มีผลต่อตัวดำเนินการที่สำคัญกว่าและเปลี่ยนผลลัพธ์ของฟังก์ชัน
Neil A.

2

Python 2 , 66 ไบต์

l=lambda n,p=1,s=[0]:p*(n<len(s))or l(n,3*p*(p/2in s)or p/2,[p]+s)

ลองออนไลน์!

ใช้การทำดัชนีแบบ zero-based แลมบ์ดาทำมากกว่าการสร้างลำดับซ้ำและกลับมาอีกเล็กน้อยเมื่อถึงดัชนีที่ต้องการ





1

Python 3 , 105 103 100 95 83 ไบต์

-2 ไบต์ขอบคุณ agtoever
-12 ไบต์ขอบคุณ ArBo

def f(n):
 s=0,1
 while len(s)<=n:t=s[-1]//2;s+=(t in s)*3*s[-1]or t,
 return s[-1]

ลองออนไลน์!


คุณสามารถแทนที่การห่วงด้วยและแทนฉันด้วยwhile len(s)<=n -1วิธีนี้ควรกำจัดอักขระหนึ่งในสองตัว
agtoever

@ ถึงทุกอย่างที่ฉลาด - ขอบคุณ! :)
ก๋วยเตี๋ยว

83 ไบต์โดยทำงานร่วมกับ tuple แทนของรายการและลบifจากwhileวงเพื่อให้หนึ่งในเยื่อบุที่ห่วง
Arbo

@ArBo ว้าว! สุกใสอย่างแน่นอน - ขอบคุณ :)
ก๋วยเตี๋ยว

1

Gaia , 22 20 ไบต์

2…@⟨:):3פḥ⌋,;D)+⟩ₓ)

ลองออนไลน์!

ดัชนีที่ใช้ 0

ขอมอบเครดิตให้กับShaggy สำหรับแนวทางนี้

2…			| push [0 1]
  @⟨		 ⟩ₓ	| do the following n times:
    :):			| dup the list L, take the last element e, and dup that
       3פḥ⌋,		| push [3*e floor(e/2)]
	     ;D		| take the asymmetric set difference [3*e floor(e/2)] - L
	       )+	| take the last element of the difference and add it to the end of L (end of loop)
		   )	| finally, take the last element and output it

;D



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