Nowe zamówienie nr 4: Świat

17

Wprowadzenie (może zostać zignorowane)

Umieszczenie wszystkich liczb dodatnich w regularnej kolejności (1, 2, 3, ...) jest trochę nudne, prawda? Oto szereg wyzwań związanych z permutacjami (przetasowaniami) wszystkich liczb dodatnich. To czwarte wyzwanie w tej serii (linki do pierwszego , drugiego i trzeciego wyzwania).

W tym wyzwaniu zbadamy nie jedną permutację liczb naturalnych, ale cały świat permutacji!

W 2000 roku Clark Kimberling stanowiły problemu w 26 -tego wydania Crux Mathematicorum , czasopiśmie naukowym matematyki opublikowanych przez Canadian Towarzystwa Matematycznego. Problem polegał na:

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

Czy każda dodatnia liczba całkowita występuje dokładnie raz w tej sekwencji?

W 2004 r. Mateusz Kwasnicki przedstawił pozytywny dowód w tym samym czasopiśmie, aw 2008 r. Opublikował bardziej formalny i (w porównaniu z pierwotnym pytaniem) bardziej ogólny dowód. Sformułował sekwencję z parametrami p i q :

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

Udowodnił, że dla każdego p,q>1 takiego, że logp(q) jest nieracjonalne, sekwencja jest permutacją liczb naturalnych. Ponieważ istnieje nieskończona liczba wartości p i q , dla których jest to prawdą, jest to naprawdę cały świat permutacji liczb naturalnych. Będziemy trzymać się oryginału (p,q)=(3,2) , a dla tych parametrów sekwencję można znaleźć jako A050000w OEIS. Pierwsze 20 elementów to:

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

Ponieważ jest to wyzwanie „czystej sekwencji”, zadaniem jest wyprowadzenie a(n) dla danego n jako danych wejściowych, gdzie a(n) to A050000 .

Zadanie

Biorąc pod uwagę liczbę całkowitą n , wypisz a(n) w formacie liczby całkowitej, gdzie:

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

Uwaga: tutaj zakłada się indeksowanie 1; możesz użyć indeksowania opartego na 0, więc a(0)=1;a(1)=3 itd. Podaj to w swojej odpowiedzi, jeśli zdecydujesz się na to.

Przypadki testowe

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

Zasady

  • Dane wejściowe i wyjściowe są liczbami całkowitymi (program powinien co najmniej obsługiwać dane wejściowe i wyjściowe w zakresie od 1 do 32767)
  • Niepoprawne dane wejściowe (0, liczby zmiennoprzecinkowe, ciągi, wartości ujemne itp.) Mogą prowadzić do nieprzewidzianych wyników, błędów lub (nie) zdefiniowanego zachowania.
  • Obowiązują domyślne reguły we / wy .
  • Domyślne luki są zabronione.
  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach
agtoever
źródło
Odpowiedziałbym na to przy użyciu TI-BASIC, ale dane wejściowe byłyby ograniczone do ponieważ listy są ograniczone do 999 elementów. Niemniej jednak wielkie wyzwanie! 0<N<1000
Tau
@Tau: chociaż nie spełnia specyfikacji (i tego nie konkuruje), byłbym zainteresowany twoim rozwiązaniem. Czy masz taki, który możesz opublikować?
agtoever
1
Usunąłem program, ale powinienem móc go odtworzyć. Opublikuję go jako niekonkurujący, gdy go ponownie dokonam.
Tau
@agtoever, „niekonkurencyjny” nie obejmuje nieprawidłowych rozwiązań; dotyczyło rozwiązań wykorzystujących języki lub funkcje językowe, które zostały utworzone po opublikowaniu wyzwania.
Kudłaty
Meta PP&CG jest naprawdę bardzo jasne w tej kwestii. Nie przyznano mi tak ścisłej interpretacji „niekonkurującego” ... @Tau: wygląda na to, że nie możesz opublikować rozwiązania TI-BASIC na tych zasadach. Przepraszam.
agtoever

Odpowiedzi:

3

Japt , 15 14 bajtów

1-indeksowany.

@[X*3Xz]kZ Ì}g

Spróbuj

@[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
Kudłaty
źródło
7

JavaScript (ES6),  55 51  50 bajtów

Zapisano 1 bajt dzięki @EmbodimentofIgnorance
Zapisano 1 bajt dzięki @tsh

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

Wypróbuj online!

Arnauld
źródło
55 bajtów
Embodiment of Ignorance
@EmbodimentofIgnorance Zazwyczaj unikam tej sztuczki, ponieważ ewaluowany kod jest znacznie wolniejszy. Ale różnica jest ledwo zauważalna dla tego, więc myślę, że to w porządku.
Arnauld,
2
Ale to jest golf golfowy, nie dbamy o szybkość, dopóki wykona zadanie
Embodiment of Ignorance
n=>eval("for(o=[p=2];n--;)o[p=o[q=p>>1]?3*p:q]=p")
tsh
5

Galaretka , 15 bajtów

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

Pełny program akceptujący liczbę całkowitą n(na podstawie 1) ze STDIN, który wypisuje wynik.

Wypróbuj online!

W jaki sposób?

µ×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
źródło
4

05AB1E , 16 15 bajtów

Zaoszczędził 1 bajt dzięki Kevinowi Cruijssenowi .
0-indeksowane.

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

Wypróbuj online!

Wyjaśnienie

Używając n=1jako przykład

¾ˆ                 # 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
źródło
15 bajtów
Kevin Cruijssen
@KevinCruijssen: Dzięki! Myślałem o użyciu globalnej tablicy, ale założyłem, że będzie miała taką samą długość jak lista na stosie i nigdy nie spróbowałem: /
Emigna
4

Perl 6 , 49 bajtów

-2 bajty dzięki nwellnof

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

Wypróbuj online!

Zwraca element o indeksie 0 w sekwencji. Możesz zmienić to na 1-indeksowane, zmieniając elementy początkowe na 0,1zamiast1,3

Wyjaśnienie:

{                                             }  # 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
źródło
3

J , 47 40 bajtów

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

Wypróbuj online!

bez golfa

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

Bezpośrednie tłumaczenie definicji na J. Buduje się oddolnie, używając ^:iteracji od wartości początkowej wymaganej liczby razy.

Jonasz
źródło
3

Java 10, 120 99 bajtów

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

Wypróbuj online.

Wyjaśnienie:

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
źródło
3

Haskell , 67 65 bajtów

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

Wypróbuj online!

Wykorzystuje indeksowanie 0.

EDYCJA: zapisano 2 bajty przy użyciu elemzamiast notElemwarunków przełączania

użytkownik1472751
źródło
2

Galaretka , 21 bajtów

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

Wypróbuj online!

Łącze monadyczne, które ma indeksowane zero n jako argument i zwraca za(n).

Nick Kennedy
źródło
2

Rubin , 54 52 48 bajtów

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

Wypróbuj online!

Kirill L.
źródło
2

C ++ (gcc) , 189 180 bajtów

-9 bajtów do małego golfa

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

Wypróbuj online!

Oblicza sekwencję do n, a następnie zwraca żądany element. Powolny dla większych indeksów.

Neil A.
źródło
@ceilingcat Niestety wpływa to na pierwszeństwo operatora i zmienia dane wyjściowe funkcji.
Neil A.
2

Python 2 , 66 bajtów

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

Wypróbuj online!

Używa indeksowania zerowego. Lambda robi niewiele więcej niż rekurencyjne budowanie sekwencji i powrót, gdy tylko zostanie osiągnięty wymagany indeks.

ArBo
źródło
1

Python 3 , 105 103 100 95 83 bajtów

-2 bajty dzięki Agtoever
-12 bajtów dzięki 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]

Wypróbuj online!

Kluski 9
źródło
Możesz zamienić pętlę na while len(s)<=ni zastąpić i -1. To powinno ogolić jedną z dwóch postaci.
przed
@agtoever to takie sprytne - dzięki! :)
Noodle9
83 bajtów postępując w krotce, a nie liście i usuwanie ifz whileobiegu, aby umożliwić jedną okładzinę pętli
ARBO
@ArBo wow! absolutnie genialne - dzięki :)
Noodle9 8.0419
1

Gaia , 22 20 bajtów

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

Wypróbuj online!

Indeks oparty na 0.

Kredyt na Kudłaty na podejściu

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
źródło
0

Lua , 78 bajtów

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)

Wypróbuj online!

pustkowie
źródło
68 bajtów poprzez usunięcie niektórych białych znaków, usunięcie zzmiennej i zmianę instrukcji if na trójskładnik
Jo King