Saída da sequência do malabarista

18

A sequência do malabarista é descrita a seguir. Começando com uma entrada a 1 , o próximo termo é definido pela relação de recorrência

A sequência termina quando atinge 1, pois todos os termos subsequentes seriam 1.

Tarefa

Dada uma entrada nmaior ou igual a 2, escreva um programa / função / gerador / etc. que gera / retorna a respectiva sequência de malabarista. A saída pode estar em qualquer forma razoável. Você não pode usar um interno que calcule a sequência do malabarista ou qualquer interno que produz diretamente o resultado. Você pode assumir que a sequência termina em1 .

Casos de teste

Input: output
2: 2, 1
3: 3, 5, 11, 36, 6, 2, 1
4: 4, 2, 1
5: 5, 11, 36, 6, 2, 1

Este é um código de golfe. O menor código em bytes vence.

Seadrus
fonte
3
Eu peguei um pouco de nerd e calculei o número de etapas para interromper os primeiros ~5.6*10^7valores (todos eles até agora).
Michael Klein
Lembra-me da conjectura de Collatz (ainda não resolvido)
Wim
@ wim sim, é muito parecido com isso.
Seadrus

Respostas:

8

Geléia , 12 11 10 bytes

*BṪ×½Ḟµ’п

Graças ao @ Sp3000 por jogar fora 1 byte!

Experimente online!

Como funciona

*BṪ×½Ḟµ’п    Main link. Input: n

*B            Elevate n to all of its digits in base 2.
  Ṫ           Extract the last power.
              This yields n ** (n % 2).
   ×½         Multiply with sqrt(n). This yields n ** (n % 2 + 0.5).
     Ḟ        Floor.

      µ       Push the previous chain on the stack and begin a new, monadic chain.
        п    Repeat the previous chain while...
       ’        n - 1 is non-zero.
              Collect all intermediate results in an array.
Dennis
fonte
Estou quase com medo de perguntar, já que o pôster tem 87k de reputação, mas é realmente possível representar isso em 10 bytes? Você está usando 10 caracteres, mas você pode realmente encaixar todos esses caracteres muito esotéricos em apenas 256 combinações? ½, F, Ð que não parece ser minhas primeiras escolhas para os personagens para adicionar no meu alfabeto, considerando que só tem 256 lugares para preencher ...
Annonymus
1
O @Annonymus Jelly usa uma página de código personalizada que codifica cada um dos 256 caracteres que entende como um byte de sincronização cada.
Dennis
1
Eu vejo! Obrigado. Aliás, encontrei um bug em sua tabela, personagem 20 (suponho que seja um espaço, se não for o "bug" é que isso não está claro) seja removido porque é um espaço solitário, você deve usar o & nbsp; em vez de.
Annonymus 17/07
@Annonymus Sim, isso parecia um pouco estranho. Eu não queria usar o NBSP, pois qualquer tentativa de copiar a tabela seria interrompida, mas em <code> </code>vez dos backticks parece exibir um caractere SP real. Obrigado por apontar isso.
Dennis
10

Julia, 64 50 48 42 32 30 bytes

g(x)=[x;x<3||g(x^(x%2+.51)]

Esta é uma função recursiva que aceita um número inteiro e retorna uma matriz flutuante.

Construímos uma matriz concatenando a entrada com o próximo termo da sequência, computado como x à potência de sua paridade mais 1/2. Isso nos dá x 1/2 ou x 1 + 1/2 = x 3/2 . A divisão inteira por 1 obtém a palavra. Quando a condição x <3 for verdadeira, o elemento final será um valor booleano e não numérico, mas como a matriz não é do tipoAny , ela é convertida para ter o mesmo tipo que o restante da matriz.

Economizou 14 bytes graças a Dennis!

Alex A.
fonte
O intérprete Julia pode lidar com o código fonte na ISO 8859-1? Então a divisão inteira seria apenas um byte.
Martin Ender
@ MartinBüttner Não, eu tentei isso antes e ficou muito louco. O analisador de Julia assume UTF-8.
Alex A.
8

JavaScript (ES7), 45 33 bytes

f=n=>n<2?n:n+","+f(n**(.5+n%2)|0)

Explicação

Abordagem recursiva. Retorna uma sequência de números separados por vírgula.

f=n=>
  n<2?n:          // stop when n == 1
  n               // return n at the start of the list
  +","+f(         // add the rest of the sequence to the list
    n**(.5+n%2)|0 // juggler algorithm
  )

Teste

** não usado no teste de compatibilidade do navegador.

user81655
fonte
1
Eu com certeza gostaria de ter **suporte em todos os navegadores.
ETHproductions
@ETHproductions Eu com certeza gostaria de ter ** suporte em C #.
aloisdg diz Reinstate Monica
7

Mathematica, 40 39 bytes

Agradecemos a Martin Büttner por economizar 1 byte.

NestWhileList[⌊#^.5#^#~Mod~2⌋&,#,#>1&]&

Caso de teste

%[5]
(* {5,11,36,6,2,1} *)
njpipeorgan
fonte
6

Pitão, 14 12 bytes

.us@*B@N2NNQ

Demonstração

Começamos com uma redução cumulativa, .u , que neste caso inicia na entrada e aplica uma função até que o resultado se repita; nesse ponto, ele gera todos os resultados intermediários.

A função assume o valor anterior como N. Começa tomando sua raiz quadrada com @N2. Em seguida, bifurca esse valor na multiplicação Ncom *B ... N. Isso cria a lista [N ** .5, (N ** .5) * N], os resultados não gravados para os casos pares e ímpares. Em seguida, o resultado não pavimentado apropriado é selecionado pela indexação na lista com @ ... N. Como o Pyth possui indexação modular, nenhum erro fora dos limites é gerado. Finalmente, o resultado é marcado com s.

isaacg
fonte
6

MATL, 13 12 bytes

`tt2\.5+^ktq

Experimente online!

Explicação

`     % do...while loop
tt   % duplicate top of stack twice, takes implicit input on first iteration
2\    % take a_k mod 2
.5+^  % adds 0.5, to give 1.5 if odd, 0.5 if even, and takes a_k^(0.5 or 1.5)
kt    % Rounds down, and duplicates
q     % Decrement by 1 and use for termination condition---if it is 0, loop will finish

Obrigado Luis por salvar um byte!

David
fonte
A floorfunção foi alterada para k, para que você possa usá-la em vez de Zosalvar 1 byte. (Desculpe por essas mudanças, você pode ver os resumos de libertação aqui )
Luis Mendo
Oh legal, obrigado por me avisar!
David David
5

Minkolang 0.15 , 25 bytes

ndN(d$7;r2%2*1+;YdNd1=,).

Experimente aqui!

Explicação

n                            Take number from input => n
 dN                          Duplicate and output as number
   (                         Open while loop
    d                        Duplicate top of stack => n, n
     $7                      Push 0.5
       ;                     Pop b,a and push a**b => n, sqrt(n)
        r                    Reverse stack => sqrt(n), n
         2%                  Modulo by 2
           2*                Multiply by 2
             1+              Add 1 => sqrt(n), [1 if even, 3 if odd]
               ;             Pop b,a and push a**b => sqrt(n)**{1,3}
                Y            Floor top of stack
                 dN          Duplicate and output as number
                   d1=,      Duplicate and => 0 if 1, 1 otherwise
                       ).    Pop top of stack and end while loop if 0, then stop.
El'endia Starman
fonte
3

TSQL, 89 bytes

A entrada entra @N:

DECLARE @N INT = 5;

Código:

WITH N AS(SELECT @N N UNION ALL SELECT POWER(N,N%2+.5) N FROM N WHERE N>1)SELECT * FROM N
Liesel
fonte
3

APL, 28 24 16 bytes

{⌊⍵*.5+2|⎕←⍵}⍣=⎕

Este é um programa que aceita um número inteiro e imprime as saídas sucessivas em linhas separadas.

Explicação:

{           }⍣=⎕   ⍝ Apply the function until the result is the input
 ⌊⍵*.5+2|⎕←⍵       ⍝ Print the input, compute floor(input^(input % 2 + 0.5))

Experimente online

Economizou 8 bytes graças a Dennis!

Alex A.
fonte
2

Java 7, 83 71 bytes

void g(int a){System.out.println(a);if(a>1)g((int)Math.pow(a,a%2+.5));}

Originalmente, usei um forloop típico , mas tive que pular os bastidores para fazê-lo funcionar corretamente. Depois de roubar mutuários ideia das user81655 ao recurse em vez disso, eu consegui-lo doze bytes.

Geobits
fonte
2

Haskell, 70 bytes

Haskell não tem um número inteiro sqrtembutido, mas acho que pode haver algo mais curto que floor.sqrt.fromInteger.

s=floor.sqrt.fromInteger
f n|odd n=s$n^3|1<2=s n
g 1=[1]
g n=n:g(f n) 
Michael Klein
fonte
2

Oracle SQL 11.2, 128 bytes

WITH v(i)AS(SELECT :1 FROM DUAL UNION ALL SELECT FLOOR(DECODE(MOD(i,2),0,SQRT(i),POWER(i,1.5)))FROM v WHERE i>1)SELECT i FROM v;

Sem golfe

WITH v(i) AS
(
  SELECT :1 FROM DUAL
  UNION ALL
--  SELECT FLOOR(POWER(i,0.5+MOD(i,2))) FROM v WHERE i>1
  SELECT FLOOR(DECODE(MOD(i,2),0,SQRT(i),POWER(i,1.5))) FROM v WHERE i>1 
)
SELECT * FROM v;

Adicionar MOD (i, 2) a 0,5 é mais curto, mas há um erro com POWER (2, .5):

SELECT POWER(4,.5), FLOOR(POWER(4,.5)), TO_CHAR(POWER(4,.5)) FROM DUAL

2   1   1,99999999999999999999999999999999999999
Jeto
fonte
2

R, 54 51 bytes

z=n=scan();while(n>1){n=n^(.5+n%%2)%/%1;z=c(z,n)};z

Economizou 3 bytes graças ao plannapus.

mnel
fonte
Dado que todos os n são positivos, pode-se diminuir floor(n^(.5+n%%2))para o n^(.5+n%%2)%/%1que penso. +1.
plannapus
2

Python 3, 57 , 45 , 43 , 41 bytes

Melhor solução com sugestão de @mathmandan

def a(n):print(n);n<2or a(n**(.5+n%2)//1)

Este método imprimirá cada número em uma nova linha

Solução anterior: reduza para 43 bytes após a recomendação do xnor

a=lambda n:[n][:n<2]or[n]+a(n**(n%2+.5)//1)

Você pode chamar o acima, fazendo a(10)quais retornos[10, 3.0, 5.0, 11.0, 36.0, 6.0, 2.0, 1.0]

O acima irá gerar os valores como flutuadores. Se você os quiser como números inteiros, podemos adicionar 2 bytes extras para 43 bytes:

def a(n):print(n);n<2or a(int(n**(.5+n%2)))
Cameron Aavik
fonte
É um pouco menor para lidar com o caso base, fazendo [n][:n<2]orou como 1/n*[n]oro caso inteiro.
Xnor
Usando o Python 2, você pode reduzi-lo para 41 bytes com def j(n):print n;n-1and j(n**(.5+n%2)//1). (Ou no Python 3, def j(n):print(n);n-1and j(n**(.5+n%2)//1)tem 42 bytes.) Ele imprimirá o termo da sequência por termo, em vez de coletar os termos em uma lista.
mathmandan
Eu também pode remover outro byte off que, ao fazer n<2or, em vez den-1and
Cameron Aavik
2

TI-Basic, 30 bytes

Prompt A
Repeat A=1
Disp A
int(A^(remainder(A,2)+.5->A
End
1
user1812
fonte
22 bytes se você receber a entrada da Ans, substitua Repeat Ans=1por While log(Anse use √(Ans)Ans^remainder(Ans,2.
lirtosiast
1

JavaScript ES6, 109 102 bytes

s=>(f=n=>n==1?n:n%2?Math.pow(n,3/2)|0:Math.sqrt(n)|0,a=[s],eval("while(f(s)-1)a.push(s=f(s))"),a+",1")

Eu sei que isso pode ser jogado. Retorna uma sequência de números separados por vírgula.

Conor O'Brien
fonte
1

C ++, 122 bytes

#include <iostream>
void f(int n){int i;while(n^1){std::cout<<n<<',';for(i=n*n;i*i>(n%2?n*n*n:n);i--);n=i;}std::cout<<1;}
MegaTom
fonte
1

C #, 62 bytes

string f(int n)=>n+(n<2?"":","+f((int)Math.Pow(n,.5+n%2)));

Inspirado por @ user81655 e @Alex A., usei a recursão.

aloisdg diz Restabelecer Monica
fonte
1

Retina, 144 bytes

Entrada e saída são unárias.

A penúltima linha contém um espaço, e as duas linhas do meio e a última linha estão vazias.

{`(\b|)11+$
$&¶$&
m-1=`^(?=^(11)*(1?)).*$
$&,$2
(1+),1$
$1;,
1(?=1*;)
$%_
1+;
$%_
;|,

m-1=`^
1:
+`(1+):(11\1)
1 $2:
1+:$|:1+

-1=`(1+\b)
$#1


Experimente online

Explicação

{`(\b|)11+$                 # Loop, Duplicate last line
$&¶$&
m-1=`^(?=^(11)*(1?)).*$     # Append ,n%2 to that line (number modulo 2)
$&,$2
(1+),1$                     # Cube that number if odd
$1;,
1(?=1*;)
$%_
1+;
$%_
;|,                         # (Last stage of cubing number)

m-1=`^                      # Integer square root of that number, 
1:                          #   borrowed and modified from another user's answer
+`(1+):(11\1)
1 $2:
1+:$|:1+

-1=`(1+\b)
$#1


Raiz quadrada inteira na Retina , por Digital Trauma

mbomb007
fonte
1

C, 64 63 61 bytes

t;q(n){for(;!t;n=pow(n,.5+n%2))printf("%d%c ",n,n^1?44:t++);}
o79y
fonte
2
You can replace n%2?1.5:0.5 with n%2+0.5 or .5+n%2 (if C allows it). If n%2 is true, n%2 is 1, else 0.
aloisdg says Reinstate Monica
0

TI BASIC, 43 bytes

I'm pulling a Thomas Kwa and answering this one on my mobile.

Input N
Repeat N=1
Disp N
remainder(N,2->B
If not(B:int(sqrt(N->N
If B:int(N^1.5->N
End
1

Substitua sqrtpelo símbolo real na sua calculadora. Exibe uma lista de números separados por avanço de linha, que é um formato razoável.

Conor O'Brien
fonte
Você pode jogar mais isso.
lirtosiast
@ThomasKwa Sim, você provavelmente está certo. Vou pensar um pouco.
Conor O'Brien
0

JavaScript ES6, 76 bytes

É um gerador chamado j. Para usar, defina a = j(<your value>);. Para ver o próximo valor na sequência, insira a.next().value.

function*j(N){for(yield N;N-1;)yield N=(N%2?Math.pow(N,3/2):Math.sqrt(N))|0}

Ungolfed:

function* juggler(N){
    yield N;
    while(N!=1){
        N = Math.floor(N % 2 ? Math.pow(N,3/2) : Math.sqrt(N));
        yield N;
    }
}
Conor O'Brien
fonte
0

F # 77 bytes

Não termina em 1, mas continua.

let j=Seq.unfold(fun x->Some(x,floor(match x%2. with 0.->x**0.5|1.->x**1.5)))

Uso:

j 3.;;
> val it : seq<float> = seq [3.0; 5.0; 11.0; 36.0; ...]

Versão que realmente termina em 1, 100 bytes

let j=Seq.unfold(fun x->if x=1. then None else Some(x,floor(match x%2. with 0.->x**0.5|1.->x**1.5)))

Ungolfed

let juggle input =
    let next x = 
        floor
            (match x % 2. with 
                | 0. -> x ** 0.5
                | 1. -> x ** 1.5
                | _ -> failwith "this should never happen") // addressing a compiler warning
    Seq.unfold (fun x -> if x = 1. then None else Some(x, next x)) input
asibahi
fonte
0

Perl 5, 34 bytes

33, mais 1 para em -pEvez de-e

say;($_=int$_**($_%2+.5))-1&&redo

Explicação

Primeiro, -pdefine a variável $_igual à entrada de stdin. Então começamos um bloco de código:

  1. sayimpressões $_.
  2. $_=int$_**($_%2+.5)conjuntos $_iguais à parte inteira de { $_à potência de {{ $_módulo 2} + 0,5}}, devido à magia da ordem das operações ( precedência do operador ). Essa atribuição retorna o novo valor de $_, e
  3. (...)-1&&redotestes que retornaram valor, menos 1. Se a diferença for 0, não faça nada; caso contrário, refaça esse bloco.

Finalmente, -pimprime $_.

De igual comprimento

Também usa -p.

say()-($_=int$_**($_%2+.5))&&redo

Isso: imprime $_; atribui como acima; testa se o valor de retorno de say(que é 1), menos o novo valor de $_, é 0 e, se for o caso, refaz o bloco; depois imprime $_no final.

msh210
fonte
0

dc, 22 21 bytes

[pd2%2*1+^vd1<F]dsFxn

Explicado:

[                # Begin macro definition
 p               # Peek at top of stack (print without popping, followed by newline)
 d               # Duplicate top of stack
 2%              # Mod 2: If even, 0; if odd, 1
 2*1+            # If even: 0*2+1==1; if odd: 1*2+1==3
 ^v              # Raise, then square root: equivalent to `^(0.5)' or `^(1.5)'
 d1<F            # If result is not 1, run macro again
]dsFx            # Duplicate macro, store as `F', execute
n                # Print the final "1"

Há um erro: quando a entrada é 1, a saída consiste em dois 1s.

Joe
fonte