Yeni sipariş no 4: Dünya


17

Giriş (yok sayılabilir)

Tüm pozitif sayıları düzenli sıraya koymak (1, 2, 3, ...) biraz sıkıcı, değil mi? Burada, tüm pozitif sayıların permütasyonları (yeniden karıştırmaları) etrafında bir dizi zorluk var. Bu, bu dizideki dördüncü zorluktur ( birinci , ikinci ve üçüncü zorluğa bağlantılar).

Bu meydan okumada, doğal sayıların tek bir permütasyonunu değil, tüm permütasyon dünyasını keşfedeceğiz !

2000 yılında, Clark Branson 26 bir sorun teşkil inci konusuna Güneyhaçı Mathematicorum , Kanadalı Matematik Derneği tarafından yayınlanan bir matematik bilim dergisi. Sorun şuydu:

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

Her pozitif tam sayı bu sırayla tam olarak bir kez mi meydana geliyor?

2004 yılında Mateusz Kwasnicki aynı dergide olumlu kanıtlar sunmuş ve 2008'de daha resmi ve (orijinal soruya kıyasla) daha genel bir kanıt yayınlamıştır . Diziyi p ve q parametreleriyle formüle etti :

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

Herhangi bir p,q>1 , logp(q) irrasyonel olacak şekilde, dizinin doğal sayıların bir permütasyonu olduğunu kanıtladı . Sonsuz sayıda bulunduğu için p ve q bu doğrudur hangi değerler, bu gerçekten bütün bir olan Dünya Doğal sayıların Permütasyon. Orijinal (p,q)=(3,2) yapışacağız ve bu parametreler için sıra A050000 olarak bulunabilirOEIS'te. İlk 20 unsuru:

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

Bu bir "saf dizisi" meydan okuma olduğu için, görev çıkışına olan a(n) için, belirli bir n girdi olarak a(n) olduğu A050000 .

Görev

Bir tamsayı girdisi n verildiğinde , tamsayı biçiminde a(n) çıktısını alın ; burada:

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

Not: Burada 1 tabanlı indeksleme varsayılmıştır; 0 tabanlı indeksleme kullanabilirsiniz, böylece a(0)=1;a(1)=3 vb. Bunu kullanmayı seçerseniz lütfen cevabınızda bunu belirtin.

Test senaryoları

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

kurallar

  • Giriş ve çıkış tamsayılardır (programınız en az 1 ila 32767 aralığında giriş ve çıkışı desteklemelidir)
  • Geçersiz giriş (0, kayan nokta, dize, negatif değerler vb.) Öngörülemeyen çıktılara, hatalara veya (tanımlanmamış) davranışa neden olabilir.
  • Varsayılan I / O kuralları geçerlidir.
  • Varsayılan boşluklar yasaktır.
  • Bu , bu yüzden bayttaki en kısa cevaplar kazanıyor

Bunu TI-BASIC kullanarak cevaplayacağım, ancak listeler 999 elemanla sınırlı olduğu için giriş ile sınırlı olacaktır. Yine de büyük bir meydan okuma! 0<N-<1000
Tau

@Tau: teknik özelliklerin dışında (ve bu rakipsiz olsa da), çözümünüzle ilgilenirim. Gönderebileceğiniz bir tane var mı?
agtoever

1
Programı sildim, ancak yeniden oluşturabilmeliyim. Ben onu göndeririz olmayan rakip bunu redone bir kez.
Tau

@agtoever, "rakip olmayan" geçersiz çözümleri kapsamaz; bir meydan okuma gönderildikten sonra oluşturulan dilleri veya dil özelliklerini kullanan çözümler içindir.
Shaggy

PP&CG meta bu konuda gerçekten çok açık. "Rekabet etmeme" konusundaki katı bir yorumla ödüllendirildim ... @Tau: Görünüşe göre TI-BASIC çözümünüzü bu kurallar altında yayınlayamazsınız. Afedersiniz.
agtoever

Yanıtlar:


3

Japt , 15 14 bayt

1 endeksli.

@[X*3Xz]kZ Ì}g

Dene

@[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 bayt

@EmbodimentofIgnorance sayesinde 1 bayt kaydedildi @tsh
sayesinde 1 bayt kaydedildi

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

Çevrimiçi deneyin!



@EmbodimentofIgnorance Değerlendirilen kod çok daha yavaş olduğu için genellikle bu numaradan kaçınırım . Ama fark bu fark için neredeyse hiç fark edilmiyor, bu yüzden sanırım bu iyi.
Arnauld

2
Ama bu sürece bu iş bitmiş olur gibi hız umurumda değil, kod-golf
Cehalet Düzenleme

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

5

Jöle , 15 bayt

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

nSonucu basan STDIN tamsayısını (1 tabanlı) kabul eden tam bir program .

Çevrimiçi deneyin!

Nasıl?

µ×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 bayt

Kevin Cruijssen sayesinde 1 bayt kurtardı .
0 endeksli.

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

Çevrimiçi deneyin!

açıklama

n=1Örnek olarak kullanma

¾ˆ                 # 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: Teşekkürler! Global diziyi kullanmayı düşündüm, ancak yığında bir liste ile aynı uzunlukta olacağını varsaydım ve asla denemedim: /
Emigna

4

Perl 6 , 49 bayt

Nwellnof sayesinde -2 bayt

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

Çevrimiçi deneyin!

Sıradaki 0 ​​dizinli öğeyi döndürür. Başlangıç ​​öğelerini 0,1yerine olarak değiştirerek bunu 1 dizinli olarak değiştirebilirsiniz .1,3

Açıklama:

{                                             }  # 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 bayt

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

Çevrimiçi deneyin!

ungolfed

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

Tanımın J'ye doğrudan çevirisi. ^:Başlangıç ​​değerinden istenen sayıda yineleme yapmak için aşağıdan yukarıya oluşturur .


3

Java 10, 120 99 bayt

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

Çevrimiçi deneyin.

Açıklama:

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

3

Haskell , 67 65 bayt

(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)

Çevrimiçi deneyin!

0 tabanlı indeksleme kullanır.

EDIT: elemyerine notElemve anahtarlama koşullarını kullanarak 2 bayt kaydedildi




2

C ++ (gcc) , 189180 bayt

-9 bayt - küçük golf

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

Çevrimiçi deneyin!

Sekansı en fazla hesaplar n, sonra istenen elemanı döndürür. Daha büyük endeksler için yavaş.


@ceilingcat Ne yazık ki operatör önceliğini etkiler ve işlevin çıktısını değiştirir.
Neil

2

Python 2 , 66 bayt

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

Çevrimiçi deneyin!

Sıfır tabanlı indeksleme kullanır. Lambda, diziyi tekrar tekrar oluşturmaktan ve gerekli dizine ulaşır ulaşmaz geri dönmekten biraz daha fazlasını yapar.





1

Piton 3 , 105 103 , 100 95 83 bayt

Agtoever sayesinde -2 bayt ArBo
sayesinde -12 bayt

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]

Çevrimiçi deneyin!


For döngüsünü ile while len(s)<=ndeğiştirebilir ve i ile değiştirebilirsiniz -1. Bu, iki karakterden birini tıraş etmelidir.
agtoever

@agtoever bu kadar akıllı - teşekkürler! :)
Erişte9

Bir liste yerine bir demet ile çalışarak ve ifbu whiledöngüyü tek astarlı hale getirmek için döngüyü kaldırarak 83 bayt
ArBo

@ArBo vay! kesinlikle parlak - teşekkürler :)
Noodle9

1

Gaia , 22 20 bayt

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

Çevrimiçi deneyin!

0 tabanlı dizin.

Shaggy'ye yaklaşım için teşekkür ederiz

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



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.