Nova ordem # 4: Mundo


17

Introdução (pode ser ignorado)

Colocar todos os números positivos em sua ordem regular (1, 2, 3, ...) é um pouco chato, não é? Então, aqui está uma série de desafios em torno de permutações (reorganizações) de todos os números positivos. Este é o quarto desafio desta série (links para o primeiro , segundo e terceiro desafios).

Neste desafio, exploraremos não uma permutação dos números naturais, mas um mundo inteiro de permutações!

Em 2000, Clark Kimberling colocou um problema na 26ª edição do Crux Mathematicorum , um periódico científico de matemática publicado pela Canadian Mathematics Society. O problema foi:

Seqüência uma={uma1=1uman=uman-12 E se uman-12{0 0,uma1,...,uman-1}uman=3uman-1 de outra forma

Todo inteiro positivo ocorre exatamente uma vez nesta sequência?

Em 2004, Mateusz Kwasnicki forneceu provas positivas na mesma revista e, em 2008, publicou uma prova mais formal e (em comparação com a pergunta original) uma prova mais geral. Ele formulou a seqüência com parâmetros e :pq

{uma1=1uman=uman-1q E se uman-1q{0 0,uma1,...,uman-1}uman=puman-1 de outra forma

Ele provou que para qualquer tal que seja irracional, a sequência é uma permutação dos números naturais. Uma vez que há um número infinito de e valores para os quais isso é verdade, este é verdadeiramente um todo mundo de permutações dos números naturais. Manteremos o original e, para esses parâmetros, a sequência pode ser encontrada como A050000 no OEIS. Seus primeiros 20 elementos são:p,q>1euogp(q)pq(p,q)=(3,2)

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

Como esse é um desafio de "sequência pura", a tarefa é gerar para um dado como entrada, onde é A050000 .uma(n)numa(n)

Tarefa

Dada uma entrada inteira , imprima no formato inteiro, em que:numa(n)

{a(1)=1a(n)=a(n-1)2 E se uma(n-1)2{0 0,uma1,...,uma(n-1)}uma(n)=3uma(n-1) de outra forma

Nota: a indexação baseada em 1 é assumida aqui; você pode usar a indexação baseada em 0; portanto, , etc. Por favor mencione isso na sua resposta se você optar por usá-lo.uma(0 0)=1;uma(1)=3

Casos de teste

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

Regras

  • Entrada e saída são números inteiros (seu programa deve, pelo menos, suportar entrada e saída no intervalo de 1 a 32767)
  • Entrada inválida (0, valores flutuantes, seqüências de caracteres, valores negativos etc.) pode levar a resultados imprevisíveis, erros ou comportamento (não) definido.
  • Regras de E / S padrão se aplicam.
  • As brechas padrão são proibidas.
  • Isso é , então as respostas mais curtas em bytes ganham

Eu responderia isso usando o TI-BASIC, mas a entrada seria limitada a pois as listas são limitadas a 999 elementos. Grande desafio, no entanto! 0 0<N<1000
Tau

@Tau: embora fora de especificação (e isso não seja competitivo), eu estaria interessado em sua solução. Você tem um que você pode postar?
agtoever 9/04

1
Excluí o programa, mas devo poder recriá-lo. Vou publicá-lo como não concorrente depois de refeito.
Tau

@agtoever, "não concorrente" não cobre soluções inválidas; era para soluções que usavam idiomas ou recursos de idiomas criados após o lançamento de um desafio.
Shaggy

A meta de PP&CG é realmente muito clara sobre isso. Não recebi uma interpretação tão estrita de "não-concorrente" ... @Tau: parece que você não pode postar sua solução TI-BASIC sob essas regras. Desculpe.
agtoever 10/04

Respostas:


3

Japonês , 15 14 bytes

1 indexado.

@[X*3Xz]kZ Ì}g

Tente

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

Guardou 1 byte graças a @EmbodimentofIgnorance Guardou
1 byte graças a @tsh

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

Experimente online!



@EmbodimentofIgnorance Normalmente, evito esse truque, pois o código avaliado é muito mais lento. Mas a diferença é quase imperceptível para essa, então acho que está bem.
Arnauld

2
Mas isso é código-golfe, nós não nos importamos com velocidade, desde que faça o trabalho
Embodiment of Ignorance

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

5

Gelatina , 15 bytes

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

Um programa completo que aceita o número inteiro n(baseado em 1) do STDIN que imprime o resultado.

Experimente online!

Quão?

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

Guardou 1 byte graças a Kevin Cruijssen .
Indexado a 0.

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

Experimente online!

Explicação

Usando n=1como exemplo

¾ˆ                 # 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: Obrigado! Pensei em usar a matriz global, mas assumi que teria o mesmo tamanho de uma lista na pilha e nunca tentei: /
Emigna 08/04

4

Perl 6 , 49 bytes

-2 bytes graças a nwellnof

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

Experimente online!

Retorna o elemento indexado 0 na sequência. Você pode alterar isso para 1 indexado, alterando os elementos iniciais para em 0,1vez de1,3

Explicação:

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

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

Experimente online!

destroçado

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

Tradução direta da definição em J. Ele cria de baixo para cima usando ^:para iterar do valor inicial o número de vezes necessário.


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

Experimente online.

Explicação:

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

Experimente online!

Usa indexação baseada em 0.

EDIT: salvou 2 bytes usando em elemvez de notEleme alternando condições




2

C ++ (gcc) , 189 180 bytes

-9 bytes em golfe pequeno

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

Experimente online!

Calcula a sequência até e n, em seguida, retorna o elemento desejado. Lento para índices maiores.


Infelizmente, isso afeta a precedência do operador e altera a saída da função.
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)

Experimente online!

Usa indexação baseada em zero. O lambda faz pouco mais do que construir recursivamente a sequência e retornar assim que o índice necessário for atingido.





1

Python 3 , 105 103 100 95 83 bytes

-2 bytes graças a todos os outros
-12 bytes graças a 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]

Experimente online!


Você pode substituir o loop for while len(s)<=ne substituir os i's por -1. Isso deve cortar um dos dois caracteres.
agtoever 8/04

@agtoever que é tão inteligente - obrigado! :)
Noodle9 08/04

83 bytes trabalhando com uma tupla em vez de uma lista e removendo o ifdo whileloop para permitir um alinhamento desse loop
ArBo

@ArBo wow! absolutamente brilhante - obrigado :)
Noodle9

1

Gaia , 22 20 bytes

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

Experimente online!

Índice baseado em 0.

Agradecemos a Shaggy pela abordagem

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



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)

Experimente online!


68 bytes através da remoção de algum espaço em branco, remoção da zvariável e alteração da instrução if para ternário
Jo King
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.