Виведіть послідовність жонглера


18

Послідовність жонглера описана наступним чином. Починаючи з введення a 1 , наступний доданок визначається відношенням повторення

Послідовність завершується, коли вона досягає 1, так як усі наступні умови були б 1.

Завдання

Враховуючи вхід, nбільший або рівний 2, напишіть програму / функцію / генератор / тощо. що виводить / повертає відповідну послідовність жонглера. Вихід може бути в будь-якій розумній формі. Ви не можете використовувати вбудований, який обчислює послідовність жонглера, або будь-який вбудований, який безпосередньо дає результат. Ви можете припустити, що послідовність завершується в 1.

Випробування

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

Це кодовий гольф. Найкоротший код у байтах виграє.


3
Я трохи зрізався і обчислив кількість кроків для зупинки перших ~5.6*10^7значень (всі вони поки зупинені).
Майкл Кляйн

Нагадує про гіпотезу Колатца (досі невирішеною)
прим.

@wim так, це дуже схоже на це.
Seadrus

Відповіді:


8

Желе , 12 11 10 байт

*BṪ×½Ḟµ’п

Дякуємо @ Sp3000 за те, що гольф на 1 байт!

Спробуйте в Інтернеті!

Як це працює

*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.

Я майже боюся запитати, оскільки плакат має репутацію 87k, але чи справді це можливо представити в 10 байтах? Ви використовуєте 10 символів, але чи можете ви насправді вмістити всі ці дуже езотеричні символи лише у 256 комбінаціях? ½, Ḟ, Ð, здавалося б, не був моїм першим вибором персонажів, які потрібно додати до мого алфавіту, враховуючи, що у мене є лише 256 місць для заповнення ...
Анонім

1
@Annonymus Jelly використовує користувацьку кодову сторінку , кодує кожен з 256 символів, який він розуміє як байт sinlge кожен.
Денніс

1
Я бачу! Спасибі. До речі, я знайшов помилку у вашій таблиці, символ 20 (я припускаю, що це пробіл, якщо це не "помилка", це незрозуміло) видаляється, оскільки це самотній простір, вам слід використовувати & nbsp; замість цього.
Анонім

@An anomus Так, це виглядало трохи дивно. Я не хотів використовувати NBSP, оскільки будь-яка спроба скопіювати таблицю зламається, але <code> </code>замість задньої панелі, здається, відображається фактичний символ SP. Дякуємо, що вказали на це.
Денніс

10

Джулія, 64 50 48 42 32 30 байт

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

Це рекурсивна функція, яка приймає ціле число і повертає плаваючий масив.

Ми будуємо масив, об'єднуючи вхід із наступним членом послідовності, обчислюється як х до сили його парності плюс 1/2. Це дає нам або х 1/2, або х 1 + 1/2 = х 3/2 . Ціле ділення на 1 отримує слово. Коли умова х <3 відповідає дійсності, кінцевим елементом буде булеве значення, а не числове значення, але оскільки масив не є типовим Any, це може бути типовим, що і решта масиву.

Збережено 14 байт завдяки Деннісу!


Чи може перекладач Julia обробляти вихідний код у ISO 8859-1? Тоді ціле ділення буде лише одним байтом.
Мартін Ендер

@ MartinBüttner Ні, я спробував це раніше, і він дуже злий. Парламент Юлії передбачає UTF-8.
Алекс А.

8

JavaScript (ES7), 45 33 байт

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

Пояснення

Рекурсивний підхід. Повертає відокремлений комою рядок чисел.

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
  )

Тест

** не використовується в тесті на сумісність браузера.


1
Я впевнений, що бажання **підтримувались у всіх браузерах.
ETHproductions

@ETHproductions Я впевнений, що бажання ** підтримали в C #.
aloisdg переходить на codidact.com

7

Математика, 40 39 байт

Завдяки Мартіну Бюттнеру за збереження 1 байта.

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

Тестовий випадок

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

6

Pyth, 14 12 байт

.us@*B@N2NNQ

Демонстрація

Почнемо з кумулятивного зменшення, .uяке в цьому випадку починається з введення і застосовує функцію, поки результат не повториться, і в цей момент він видає всі проміжні результати.

Функція приймає попереднє значення як N. Починається з взяття його квадратного кореня @N2. Потім він роздвоюється , що значення множення на Nз *B ... N. Це створює список [N ** .5, (N ** .5) * N], незабарвлені результати для парних та непарних випадків. Далі відповідний незабарвлений результат вибирається шляхом індексації до списку з @ ... N. Оскільки Pyth має модульну індексацію, не викидаються помилки поза межами. Нарешті, результат узгоджується s.


6

MATL, 13 12 байт

`tt2\.5+^ktq

Спробуйте в Інтернеті!

Пояснення

`     % 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

Дякую Луїсу за збереження байта!


floorФункція була змінена k, так що ви можете використовувати , що замість того , Zoщоб зберегти 1 байт. (Вибачте за ці зміни; ви можете ознайомитись з підсумками релізів тут )
Luis Mendo

О, здорово, дякую, що повідомили мені!
Девід

5

Мінколанг 0,15 , 25 байт

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

Спробуйте тут!

Пояснення

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.

3

TSQL, 89 байт

Вхід надходить @N:

DECLARE @N INT = 5;

Код:

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

3

APL, 28 24 16 байт

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

Це програма, яка приймає ціле число і друкує послідовні результати на окремих рядках.

Пояснення:

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

Спробуйте в Інтернеті

Збережено 8 байт завдяки Деннісу!


2

Java 7, 83 71 байт

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

Спочатку я використовував типовий forцикл, але мені довелося перестрибувати обручі, щоб він працював правильно. Після того, як викрали позику користувача81655, щоб замість цього повторитись , я знизив дванадцять байт.


2

Haskell, 70 байт

У Haskell немає sqrtвбудованого цілого числа , але я думаю, що може бути щось коротше, ніж 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) 

2

Oracle SQL 11.2, 128 байт

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;

Без гольфу

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;

Додавання MOD (i, 2) до .5 коротше, але є помилка з POWER (2, .5):

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

дає

2   1   1,99999999999999999999999999999999999999

2

R, 54 51 байт

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

Збережено 3 байти завдяки планнапусу.


Зважаючи на те, що всі n позитивні, можна скоротити, floor(n^(.5+n%%2))на n^(.5+n%%2)%/%1мою думку. +1.
планнапус


2

Python 3, 57 , 45 , 43 , 41 байт

Краще рішення з пропозицією від @mathmandan

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

Цей метод буде надрукувати кожен номер у новому рядку

Попереднє рішення: скоротити до 43 байт після рекомендації xnor

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

Ви можете зателефонувати вище, виконавши те, a(10)що повертається[10, 3.0, 5.0, 11.0, 36.0, 6.0, 2.0, 1.0]

Вищенаведене буде виводити значення у формі поплавків. Якщо ви хочете, щоб вони були цілими числами, ми можемо просто додати додаткові 2 байти на 43 байти:

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

Трохи коротше обробляти базовий випадок, роблячи [n][:n<2]or, або як 1/n*[n]orдля цілого випадку.
xnor

Використовуючи Python 2, ви можете зменшити його до 41 байта def j(n):print n;n-1and j(n**(.5+n%2)//1). (Або в Python 3, def j(n):print(n);n-1and j(n**(.5+n%2)//1)це 42 байти.) Він буде друкувати послідовність терміна за терміном, а не збирати терміни у списку.
mathmandan

Я також можу видалити ще один байт, виконуючи n<2orзамість цьогоn-1and
Камерон Аавік

2

TI-Basic, 30 байт

Prompt A
Repeat A=1
Disp A
int(A^(remainder(A,2)+.5->A
End
1

22 байт , якщо взяти вхідні дані з Ans, замініть Repeat Ans=1з While log(Ans, і використання √(Ans)Ans^remainder(Ans,2.
lirtosiast

1

JavaScript ES6, 109 102 байт

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

Я знаю, що це може бути гольф. Повертає рядок розділених комами чисел.


1

C ++, 122 байти

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


1

Сітківка, 144 байти

Вхід і вихід не є одинаковими.

2-й-останній рядок містить пробіл, а дві середні та останній рядки порожні.

{`(\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


Спробуйте в Інтернеті

Пояснення

{`(\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


Цілий квадратний корінь у сітківці , від Digital Trauma



0

TI BASIC, 43 байти

Я тягну Томаса Ква і відповідаю на цей мобільний.

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

Замініть sqrtфактичним символом на калькуляторі. Відображає відокремлений список номерів, що передається за допомогою рядків, що є прийнятним форматом.


Можна більше пограти в гольф.
lirtosiast

@ThomasKwa Так, ти, мабуть, маєш рацію. Я трохи подумаю.
Conor O'Brien

0

JavaScript ES6, 76 байт

Назва генератора j. Для використання встановіть a = j(<your value>);. Щоб побачити наступне значення в послідовності, введіть a.next().value.

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

Безголівки:

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

0

F # 77 байт

Не закінчується о 1, але продовжує дію.

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

Використання:

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

Версія, яка фактично закінчується на 1, 100 байт

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

Безумовно

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

0

Perl 5, 34 байти

33, плюс 1 для -pEзамість-e

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

Пояснення

Спочатку -pвстановлює змінну$_ рівну входу від stdin. Потім запускаємо блок коду:

  1. sayвідбитки $_.
  2. $_=int$_**($_%2+.5)множини, що $_дорівнюють цілій частині { $_до потужності {{ $_modulo 2} + 0,5}}, завдяки магії порядку операцій ( пріоритет оператора ). Це призначення повертає нове значення $_та
  3. (...)-1&&redoтести, які повернули значення, мінус 1. Якщо різниця дорівнює 0, нічого не робіть; в іншому випадку повторіть цей блок.

Нарешті, -p відбитки$_ .

Рівної довжини

Також використовує -p.

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

Це: відбитки $_; призначає, як зазначено вище; перевіряє, чи є повернене значення say(яке дорівнює 1), мінус нове значення $_, 0, і повторює блок, якщо так; потім друкує $_наприкінці.


0

постійний струм, 22 21 байт

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

Пояснили:

[                # 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"

Там помилка: Коли вхід є 1, вихід складається з двох 1s.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.