Neue Ordnung # 4: Welt

17

Einleitung (kann ignoriert werden)

Es ist ein bisschen langweilig, alle positiven Zahlen in der regulären Reihenfolge (1, 2, 3, ...) anzuordnen, nicht wahr? Hier ist also eine Reihe von Herausforderungen im Zusammenhang mit Permutationen (Umformungen) aller positiven Zahlen. Dies ist die vierte Herausforderung in dieser Reihe (Links zur ersten , zweiten und dritten Herausforderung).

In dieser Herausforderung werden wir nicht nur eine Permutation der natürlichen Zahlen untersuchen, sondern eine ganze Welt von Permutationen!

Im Jahr 2000 Clark Kimberling stellte ein Problem in der 26 - ten Ausgabe von Crux mathe , eine wissenschaftlichen Zeitschrift der Mathematik von dem kanadischen Mathematical Society veröffentlicht. Das Problem war:

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

Kommt jede positive ganze Zahl in dieser Reihenfolge genau einmal vor?

Im Jahr 2004 vorgesehen Mateusz Kwaśnicki positiven Beweis in der gleichen Zeitschrift und im Jahr 2008, er veröffentlichte einen formellere und ( im Vergleich zu der ursprünglichen Frage) ein allgemeinere Beweis. Er formulierte die Sequenz mit den Parametern p und q :

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

Er bewies, dass für jedes p,q>1 so dass logp(q) irrational ist, die Sequenz eine Permutation der natürlichen Zahlen ist. Da es unendlich viele p und q Werte gibt, für die dies zutrifft, ist dies wirklich eine ganze Welt von Permutationen der natürlichen Zahlen. Wir bleiben beim Original (p,q)=(3,2) , und für diese Parameter kann die Sequenz als A050000 gefunden werdenin der OEIS. Die ersten 20 Elemente sind:

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

Da dies eine „reine Sequenz“ Herausforderung ist, die Aufgabe zu Ausgang ist a(n) für eine gegebene n als Eingabe, wobei a(n) ist A050000 .

Aufgabe

Bei einem gegebenen ganzzahligen Eingangs , Ausgabe in Ganzzahl - Format, wobei:na(n)

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

Hinweis: Hier wird eine 1-basierte Indizierung angenommen. Sie können eine 0-basierte Indizierung verwenden, also usw. Bitte erwähnen Sie dies in Ihrer Antwort, wenn Sie dies verwenden möchten.a(0)=1;a(1)=3

Testfälle

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

Regeln

  • Eingabe und Ausgabe sind ganze Zahlen (Ihr Programm sollte mindestens Eingabe und Ausgabe im Bereich von 1 bis 32767 unterstützen)
  • Ungültige Eingaben (0, Gleitkommazahlen, Zeichenfolgen, negative Werte usw.) können zu unvorhergesehenen Ausgaben, Fehlern oder (un) definiertem Verhalten führen.
  • Es gelten die Standard- E / A-Regeln .
  • Standardlücken sind verboten.
  • Das ist , also gewinnt die kürzeste Antwort in Bytes
wie auch immer
quelle
Ich würde dies mit TI-BASIC beantworten, aber die Eingabe wäre auf beschränkt, da Listen auf 999 Elemente beschränkt sind. Trotzdem eine große Herausforderung! 0<N<1000
Tau
@Tau: Obwohl nicht der Spezifikation entsprechend (und dies nicht konkurrierend), würde mich Ihre Lösung interessieren. Hast du eine, die du posten kannst?
immer
1
Ich habe das Programm gelöscht, sollte es aber neu erstellen können. Ich werde es als nicht konkurrierend veröffentlichen, sobald ich es überarbeitet habe.
Tau
@agtoever, "nicht konkurrierend" deckt ungültige Lösungen nicht ab; Dies galt für Lösungen mit Sprachen oder Sprachfunktionen, die nach dem Posten einer Herausforderung erstellt wurden.
Shaggy
PP & CG Meta ist in der Tat sehr klar. Eine so strenge Interpretation von "nicht konkurrierend" wurde mir nicht zugesprochen ... @Tau: Es scheint, dass Sie Ihre TI-BASIC-Lösung nach diesen Regeln nicht veröffentlichen können. Es tut uns leid.
jedenfalls

Antworten:

3

Japt , 15 bis 14 Bytes

1-indiziert.

@[X*3Xz]kZ Ì}g

Versuch es

@[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
Zottelig
quelle
7

JavaScript (ES6),  55 51  50 Byte

1 Byte dank @EmbodimentofIgnorance
gespeichert 1 Byte dank @tsh gespeichert

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

Probieren Sie es online!

Arnauld
quelle
55 Bytes
Verkörperung der Ignoranz
@EmbodimentofIgnorance Normalerweise vermeide ich diesen Trick, da der bewertete Code viel langsamer ist. Aber der Unterschied ist für diesen kaum bemerkbar, also denke ich, dass das in Ordnung ist.
Arnauld
2
Aber das ist Code-Golf, wir kümmern uns nicht um Geschwindigkeit, solange es die Arbeit erledigt
Verkörperung der Ignoranz
n=>eval("for(o=[p=2];n--;)o[p=o[q=p>>1]?3*p:q]=p")
Dienstag,
5

Gelee , 15 Bytes

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

Ein vollständiges Programm, das die Ganzzahl n(1-basiert) von STDIN akzeptiert und das Ergebnis ausgibt.

Probieren Sie es online!

Wie?

µ×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
quelle
4

05AB1E , 16 15 Bytes

Dank Kevin Cruijssen 1 Byte gespeichert .
0-indiziert.

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

Probieren Sie es online!

Erläuterung

Unter Verwendung n=1als Beispiel

¾ˆ                 # 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
quelle
15 Bytes
Kevin Cruijssen
@ KevinCruijssen: Danke! Ich dachte an die Verwendung des globalen Arrays, nahm aber an, dass es die gleiche Länge wie eine Liste auf dem Stapel haben würde, und versuchte es nie: /
Emigna
4

Perl 6 , 49 Bytes

-2 Bytes dank nwellnof

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

Probieren Sie es online!

Gibt das 0-indizierte Element in der Sequenz zurück. Sie können dies in 1-indiziert ändern, indem Sie die Startelemente in 0,1anstelle von ändern1,3

Erläuterung:

{                                             }  # 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
Scherzen
quelle
3

J , 47 40 Bytes

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

Probieren Sie es online!

ungolfed

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

Direkte Übersetzung der Definition in J. Sie wird von Grund auf aufgebaut, indem ^:die erforderliche Anzahl von Iterationen vom Startwert ausgeführt wird.

Jona
quelle
3

Java 10, 120 99 Bytes

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

Probieren Sie es online aus.

Erläuterung:

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
quelle
3

Haskell , 67 65 Bytes

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

Probieren Sie es online!

Verwendet eine 0-basierte Indizierung.

BEARBEITEN: Speichert 2 Bytes, indem elemanstelle von notElemund Bedingungen geändert werden

user1472751
quelle
2

C ++ (GCC) , 189 180 Bytes

-9 Bytes zu kleinem Golfen

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

Probieren Sie es online!

Berechnet die Sequenz bis und ngibt dann das gewünschte Element zurück. Langsam für größere Indizes.

Neil A.
quelle
@ceilingcat Leider wirkt sich das auf die Priorität des Operators aus und verändert die Ausgabe der Funktion.
Neil A.
2

Python 2 , 66 Bytes

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

Probieren Sie es online!

Verwendet nullbasierte Indizierung. Das Lambda baut die Sequenz nur rekursiv auf und kehrt zurück, sobald der erforderliche Index erreicht ist.

ArBo
quelle
1

Python 3 , 105 103 100 95 83 Bytes

-2 Bytes dank agtoever
-12 Bytes dank 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]

Probieren Sie es online!

Noodle9
quelle
Sie können die for-Schleife durch while len(s)<=nund die i ersetzen -1. Dies sollte eines von zwei Zeichen abschneiden.
Am
@agtoever das ist so schlau - danke! :)
Noodle9
83 Bytes, indem Sie mit einem Tupel anstelle einer Liste arbeiten und das ifaus der whileSchleife entfernen , um diese Schleife mit einer
Zeile
@ Arbo wow! absolut genial - danke :)
Noodle9
1

Gaia , 22-20 Bytes

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

Probieren Sie es online!

0-basierter Index.

Dank an Shaggy für die Annäherung

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
quelle
0

Lua , 78 Bytes

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)

Probieren Sie es online!

wastl
quelle
68 Bytes durch Entfernen von Leerzeichen, Entfernen der zVariablen und Ändern der if-Anweisung in ternary
Jo King