Nouvelle commande # 4: Monde

17

Introduction (peut être ignoré)

Mettre tous les nombres positifs dans son ordre régulier (1, 2, 3, ...) est un peu ennuyeux, n'est-ce pas? Voici donc une série de défis autour des permutations (remaniements) de tous les nombres positifs. Il s'agit du quatrième défi de cette série (liens vers les premier , deuxième et troisième défis).

Dans ce défi, nous explorerons non pas une permutation des nombres naturels, mais un monde entier de permutations!

En 2000, Clark Kimberling a posé un problème dans le 26 e numéro de Crux Mathematicorum , une revue scientifique de mathématiques publiée par la Société mathématique du Canada. Le problème était:

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

Est-ce que chaque entier positif se produit exactement une fois dans cette séquence?

En 2004, Mateusz Kwasnicki a fourni une preuve positive dans le même journal et en 2008, il a publié une preuve plus formelle et (par rapport à la question d'origine) plus générale. Il a formulé la séquence avec les paramètres p et q :

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

Il a prouvé que pour tout p,q>1 tel que logp(q) est irrationnel, la séquence est une permutation des nombres naturels. Puisqu'il existe un nombre infini de valeurs p et q pour lesquelles cela est vrai, il s'agit véritablement d'un monde entier de permutations des nombres naturels. Nous nous en tiendrons à l'original (p,q)=(3,2) , et pour ces paramètres, la séquence peut être trouvée comme A050000dans l'OEIS. Ses 20 premiers éléments sont:

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

Puisqu'il s'agit d'un défi de "séquence pure", la tâche consiste à sortir a(n) pour un n donné en entrée, où a(n) est A050000 .

Tâche

Étant donné une entrée entière n , sortie a(n) au format entier, où:

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

Remarque: l'indexation basée sur 1 est supposée ici; vous pouvez utiliser une indexation basée sur 0, donc a(0)=1;a(1)=3 , etc. Veuillez le mentionner dans votre réponse si vous choisissez de l'utiliser.

Cas de test

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

Règles

  • L'entrée et la sortie sont des entiers (votre programme devrait au moins prendre en charge l'entrée et la sortie dans la plage de 1 à 32 767)
  • Une entrée non valide (0, flottants, chaînes, valeurs négatives, etc.) peut entraîner une sortie imprévue, des erreurs ou un comportement (non) défini.
  • Les règles d'E / S par défaut s'appliquent.
  • Les failles par défaut sont interdites.
  • Il s'agit de , donc les réponses les plus courtes en octets l'emportent
toujours
la source
Je répondrais à cela en utilisant TI-BASIC, mais l'entrée serait limitée à car les listes sont limitées à 999 éléments. Grand défi quand même! 0<N<1000
Tau
@Tau: bien que hors spécifications (et non concurrentiel), je serais intéressé par votre solution. En avez-vous un que vous pouvez poster?
agtoever
1
J'ai supprimé le programme, mais je devrais pouvoir le recréer. Je le publierai comme non concurrent une fois que je l'aurai refait.
Tau
@agtoever, "non concurrentiel" ne couvre pas les solutions invalides; il s'agissait de solutions utilisant des langages ou des fonctionnalités de langage créées après la publication d'un défi.
Shaggy
La méta PP&CG est en effet très claire à ce sujet. Je n'ai pas été récompensé d'une interprétation aussi stricte de "non concurrent" ... @Tau: il semble que vous ne puissiez pas publier votre solution TI-BASIC selon ces règles. Pardon.
agtoever

Réponses:

3

Japt , 15 14 octets

1 indexé.

@[X*3Xz]kZ Ì}g

Essayez-le

@[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
Hirsute
la source
7

JavaScript (ES6),  55 51  50 octets

1 octet enregistré grâce à @EmbodimentofIgnorance
1 octet enregistré grâce à @tsh

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

Essayez-le en ligne!

Arnauld
la source
55 octets
Incarnation de l'ignorance
@EmbodimentofIgnorance J'évite généralement cette astuce, car le code évalué est beaucoup plus lent. Mais la différence est à peine perceptible pour celui-là, donc je suppose que ça va.
Arnauld
2
Mais c'est du code-golf, nous ne nous soucions pas de la vitesse, tant qu'il fait le travail
Embodiment of Ignorance
n=>eval("for(o=[p=2];n--;)o[p=o[q=p>>1]?3*p:q]=p")
tsh
5

Gelée , 15 octets

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

Un programme complet acceptant l'entier, n(basé sur 1), de STDIN qui imprime le résultat.

Essayez-le en ligne!

Comment?

µ×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
la source
4

05AB1E , 16 15 octets

Enregistré 1 octet grâce à Kevin Cruijssen .
0 indexé.

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

Essayez-le en ligne!

Explication

Utilisation n=1comme exemple

¾ˆ                 # 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
la source
15 octets
Kevin Cruijssen
@KevinCruijssen: Merci! J'ai pensé à utiliser le tableau global, mais j'ai supposé que ce serait la même longueur qu'une liste sur la pile et je ne l'ai jamais essayé: /
Emigna
4

Perl 6 , 49 octets

-2 octets grâce à nwellnof

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

Essayez-le en ligne!

Renvoie l'élément indexé 0 dans la séquence. Vous pouvez changer cela en 1 indexé en remplaçant les éléments de départ par au 0,1lieu de1,3

Explication:

{                                             }  # 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
la source
3

J , 47 40 octets

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

Essayez-le en ligne!

non golfé

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

La traduction directe de la définition en J. Elle se construit de bas en haut en utilisant ^:pour itérer à partir de la valeur de départ le nombre de fois requis.

Jonas
la source
3

Java 10, 120 99 octets

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

Essayez-le en ligne.

Explication:

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
la source
3

Haskell , 67 65 octets

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

Essayez-le en ligne!

Utilise l'indexation basée sur 0.

EDIT: enregistré 2 octets en utilisant elemau lieu de notElemet en changeant les conditions

user1472751
la source
2

Gelée , 21 octets

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

Essayez-le en ligne!

Un lien monadique qui prend l'index zéro n comme argument et retourne une(n).

Nick Kennedy
la source
2

C ++ (gcc) , 189 octets

-9 octets au petit 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];}

Essayez-le en ligne!

Calcule la séquence jusqu'à n, puis renvoie l'élément souhaité. Lent pour les indices plus grands.

Neil A.
la source
@ceilingcat Malheureusement, cela affecte la priorité de l'opérateur et modifie la sortie de la fonction.
Neil A.
2

Python 2 , 66 octets

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

Essayez-le en ligne!

Utilise une indexation à base zéro. Le lambda ne fait guère plus que de construire récursivement la séquence et de revenir dès que l'index requis est atteint.

ArBo
la source
1

Python 3 , 105 103 100 100 95 83 octets

-2 octets grâce à agtoever
-12 octets grâce à 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]

Essayez-le en ligne!

Nouilles9
la source
Vous pouvez remplacer la boucle for par while len(s)<=net remplacer les i avec -1. Cela devrait raser l'un des deux personnages.
agtoever
@agtoever c'est tellement intelligent - merci! :)
Noodle9
83 octets en travaillant avec un tuple au lieu d'une liste, et en supprimant le ifde la whileboucle pour autoriser la doublure de cette boucle
ArBo
@ArBo wow! absolument génial - merci :)
Noodle9
1

Gaia , 22 20 octets

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

Essayez-le en ligne!

Index basé sur 0.

Nous remercions Shaggy pour l'approche

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
la source
0

Lua , 78 octets

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)

Essayez-le en ligne!

wastl
la source
68 octets en supprimant des espaces, en supprimant la zvariable et en changeant l'instruction if en ternaire
Jo King