Pesanan baru # 4: Dunia

17

Pendahuluan (dapat diabaikan)

Menempatkan semua angka positif dalam urutan regulernya (1, 2, 3, ...) agak membosankan, bukan? Jadi di sini adalah serangkaian tantangan seputar permutasi (perombakan) dari semua bilangan positif. Ini adalah tantangan keempat dalam seri ini (tautan ke tantangan pertama , kedua dan ketiga ).

Dalam tantangan ini, kita akan menjelajahi tidak hanya permutasi dari bilangan asli, tetapi seluruh dunia permutasi!

Pada tahun 2000, Clark Kimberling mengajukan masalah dalam edisi ke 26 Crux Mathematicorum , jurnal ilmiah matematika yang diterbitkan oleh Canadian Mathematical Society. Masalahnya adalah:

Sequence a={a1=1an=an12 if an12{0,a1,...,an1}an=3an1 otherwise

Apakah setiap bilangan bulat positif terjadi tepat sekali dalam urutan ini?

Pada 2004, Mateusz Kwasnicki memberikan bukti positif dalam jurnal yang sama dan pada 2008, ia menerbitkan bukti yang lebih formal dan (dibandingkan dengan pertanyaan awal). Dia merumuskan urutan dengan parameter p dan q :

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

Ia membuktikan bahwa untuk setiap p,q>1 sehingga logp(q) adalah tidak rasional, urutan adalah permutasi dari alam nomor. Karena ada jumlah tak terbatas nilai p dan q yang benar, ini benar-benar seluruh dunia permutasi bilangan alami. Kami akan tetap dengan yang asli (p,q)=(3,2) , dan untuk parameter ini, urutannya dapat ditemukan sebagai A050000di OEIS. 20 elemen pertamanya adalah:

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

Karena ini adalah tantangan "urutan murni", tugasnya adalah mengeluarkan a(n) untuk input n diberikan , di mana a(n) adalah A050000 .

Tugas

Diberikan input integer n , output a(n) dalam format integer, di mana:

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

Catatan: pengindeksan berbasis 1 diasumsikan di sini; Anda dapat menggunakan pengindeksan berbasis 0, jadi a(0)=1;a(1)=3 , dll. Sebutkan ini dalam jawaban Anda jika Anda memilih untuk menggunakan ini.

Uji kasus

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

Aturan

  • Input dan output adalah bilangan bulat (program Anda setidaknya harus mendukung input dan output dalam kisaran 1 hingga 32767)
  • Input yang tidak valid (0, float, string, nilai negatif, dll.) Dapat menyebabkan output yang tidak terduga, kesalahan atau (tidak) perilaku yang ditentukan.
  • Standar I / O aturan berlaku.
  • Celah default dilarang.
  • Ini adalah , jadi jawaban tersingkat dalam byte menang
agtoever
sumber
Saya akan menjawab ini menggunakan TI-BASIC, tetapi input akan dibatasi hingga 0<N<1000 karena daftar dibatasi hingga 999 elemen. Meskipun demikian, tantangan besar!
Tau
@Tau: meskipun di luar spesifikasi (dan ini tidak bersaing), saya akan tertarik dengan solusi Anda. Apakah Anda punya yang dapat Anda posting?
agtoever
1
Saya menghapus program, tetapi saya harus dapat membuatnya kembali. Saya akan mempostingnya sebagai non-bersaing setelah saya mengulanginya.
Tau
@agtoever, "tidak bersaing" tidak mencakup solusi yang tidak valid; itu untuk solusi menggunakan bahasa atau fitur bahasa yang dibuat setelah tantangan diposting.
Shaggy
Meta PP&CG memang sangat jelas dalam hal ini. Saya tidak menghargai interpretasi ketat "non-pesaing" ... @Tau: sepertinya Anda tidak dapat memposting solusi TI-BASIC di bawah aturan ini. Maaf.
agtoever

Jawaban:

3

Japt , 15 14 byte

1-diindeks.

@[X*3Xz]kZ Ì}g

Cobalah

@[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
Shaggy
sumber
7

JavaScript (ES6),  55 51  50 byte

Disimpan 1 byte berkat @EmbodimentofIgnorance
Disimpan 1 byte berkat @tsh

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

Cobalah online!

Arnauld
sumber
55 byte
Perwujudan Ketidaktahuan
@EmbodimentofIgnorance Saya biasanya menghindari trik itu, karena kode eval'ed jauh lebih lambat. Tetapi perbedaannya hampir tidak terlihat untuk yang itu, jadi saya kira itu tidak masalah.
Arnauld
2
Tapi ini adalah kode-golf, kami tidak peduli tentang kecepatan, selama itu menyelesaikan pekerjaan
Perwujudan Ketidaktahuan
n=>eval("for(o=[p=2];n--;)o[p=o[q=p>>1]?3*p:q]=p")
tsh
5

Jelly , 15 byte

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

Program lengkap yang menerima bilangan bulat, n (berbasis 1), dari STDIN yang mencetak hasilnya.

Cobalah online!

Bagaimana?

µ×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
Jonathan Allan
sumber
4

05AB1E , 16 15 byte

Disimpan 1 byte berkat Kevin Cruijssen .
Diindeks 0.

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

Cobalah online!

Penjelasan

Menggunakan n=1sebagai contoh

¾ˆ                 # 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
Emigna
sumber
15 byte
Kevin Cruijssen
@KevinCruijssen: Terima kasih! Saya berpikir untuk menggunakan array global, tetapi menganggapnya akan sama panjangnya dengan daftar di stack dan tidak pernah mencobanya: /
Emigna
4

Perl 6 , 49 byte

-2 byte terima kasih kepada nwellnof

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

Cobalah online!

Mengembalikan elemen 0-diindeks dalam urutan. Anda dapat mengubah ini menjadi 1-diindeks dengan mengubah elemen awal menjadi 0,1bukan1,3

Penjelasan:

{                                             }  # 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
Jo King
sumber
3

J , 47 40 byte

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

Cobalah online!

ungolfed

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

Terjemahan langsung dari definisi ke J. Ini membangun dari bawah ke atas dengan menggunakan ^:untuk beralih dari nilai awal berapa kali yang diperlukan.

Jonah
sumber
3

Java 10, 120 99 byte

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;}

Cobalah online.

Penjelasan:

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
Kevin Cruijssen
sumber
3

Haskell , 67 65 byte

(h[1,0]!!)
h l@(a:o)|elem(div a 2)o=a:h(3*a:l)|1>0=a:h(div a 2:l)

Cobalah online!

Menggunakan pengindeksan berbasis 0.

EDIT: menyimpan 2 byte dengan menggunakan dan elembukannya notElemmengganti kondisi

pengguna1472751
sumber
2

Jelly , 21 byte

Ø.;0ị×3$:2$:2eɗ?Ɗ$⁸¡Ṫ

Cobalah online!

Tautan monadik yang mengambil indeks-nol n sebagai argumen dan kembali Sebuah(n).

Nick Kennedy
sumber
2

Ruby , 54 52 48 byte

->n{*s=0;j=2;n.times{s<<j=s==s-[j/2]?j/2:j*3};j}

Cobalah online!

Kirill L.
sumber
2

C ++ (gcc) , 189 180 byte

-9 byte untuk bermain golf kecil

#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];}

Cobalah online!

Hitung urutan hingga n, lalu kembalikan elemen yang diinginkan. Lambat untuk indeks yang lebih besar.

Neil A.
sumber
@ceilingcat Sayangnya itu memengaruhi prioritas operator dan mengubah output fungsi.
Neil A.
2

Python 2 , 66 byte

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

Cobalah online!

Menggunakan pengindeksan berbasis nol. Lambda tidak lebih dari secara rekursif membangun urutan dan kembali segera setelah indeks yang diperlukan tercapai.

ArBo
sumber
1

Bahasa Wolfram (Mathematica) , 63 byte

(L=Last)@Nest[{##,If[FreeQ[#,x=⌊L@#/2⌋],x,3L@#]}&,{0,1},#]&

Cobalah online!

Ini diindeks 0
(Dalam TIO saya menambahkan -1 dalam setiap kasus uji)

J42161217
sumber
1

Python 2 , 62 byte

a=lambda n:n<1or a(n-1)*6**(a(n-1)//2in[0]+map(a,range(n)))//2

Cobalah online!

Pengembalian Trueuntuk a(0). Diindeks 0.

Erik the Outgolfer
sumber
1

Python 3 , 105 103 100 95 83 byte

-2 byte terima kasih kepada agtoever
-12 byte terima kasih kepada 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]

Cobalah online!

Mie9
sumber
Anda dapat mengganti for for dengan while len(s)<=ndan mengganti i's dengan -1. Ini harus mengurangi salah satu dari dua karakter.
agtoever
@ Agtoever itu sangat pintar - terima kasih! :)
Noodle9
83 byte dengan bekerja dengan tuple bukan daftar, dan menghapus ifdari whileloop untuk memungkinkan satu-lapisan loop itu
ArBo
@ ArBo wow! benar-benar brilian - terima kasih :)
Noodle9
1

Gaia , 22 20 byte

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

Cobalah online!

Indeks berbasis 0.

Kredit untuk Shaggy untuk pendekatan

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

Giuseppe
sumber
0

Lua , 78 byte

x,y=1,3 u={}for _=2,...do
u[x]=0
x,y=y,y//2
if u[y]then y=3*x end
end
print(x)

Cobalah online!

wastl
sumber
68 byte melalui menghapus spasi, menghapus zvariabel dan mengubah pernyataan if ke ternary
Jo King