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

18

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

Последовательность заканчивается, когда она достигает 1, так как все последующие члены будут равны 1.

задача

Если вход nбольше или равен 2, напишите программу / функцию / генератор / и т. Д. который выводит / возвращает соответствующую последовательность жонглера. Вывод может быть в любой разумной форме. Вы не можете использовать встроенную функцию, которая вычисляет последовательность juggler, или любую встроенную функцию, которая непосредственно дает результат. Вы можете предположить, что последовательность заканчивается в 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

Это код гольф. Самый короткий код в байтах побеждает.

Seadrus
источник
3
Я немного понюхал и вычислил количество шагов, которые нужно остановить для первых ~5.6*10^7значений (пока они все останавливаются).
Майкл Кляйн
Напоминает гипотезы Коллатца ( до сих пор не решена)
Вим
@ да, это очень похоже на это.
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 мест для заполнения ...
Annonymus
1
@Annonymus Jelly использует пользовательскую кодовую страницу, которая кодирует каждый из 256 символов, которые он понимает как байт sinlge каждый.
Деннис
1
Я вижу! Благодарю. Кстати, я нашел ошибку в вашей таблице, символ 20 (я предполагаю, что это пробел, если это не «ошибка» в том, что это неясно) удаляется, так как это одинокий пробел, вы должны использовать & nbsp; вместо.
Анонимус
@ Annonymus Да, это выглядело немного странно. Я не хотел использовать NBSP, поскольку любая попытка скопировать таблицу потерпела бы крах, но <code> </code>вместо обратных галочек, похоже, отображается фактический символ SP. Спасибо что подметил это.
Деннис
10

Юлия, 64 50 48 42 32 30 байт

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

Это рекурсивная функция, которая принимает целое число и возвращает массив с плавающей точкой.

Мы строим массив, объединяя входные данные со следующим членом последовательности, вычисляемым как х в степени его четности плюс 1/2. Это дает нам либо x 1/2, либо x 1 + 1/2 = x 3/2 . Целочисленное деление на 1 получает слово. Когда условие x <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
  )

Тестовое задание

** не используется в тесте на совместимость браузера.

user81655
источник
1
Я уверен, что пожелание **было поддержано во всех браузерах.
ETHproductions
@ETHproductions Я уверен, что желание ** было поддержано в C #.
говорит aloisdg Восстановить Монику
7

Mathematica, 40 39 байт

Спасибо Мартину Бюттнеру за сохранение 1 байта.

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

Прецедент

%[5]
(* {5,11,36,6,2,1} *)
njpipeorgan
источник
6

Pyth, 14 12 байт

.us@*B@N2NNQ

демонстрация

Мы начнем с кумулятивного уменьшения, .uкоторое в этом случае начинается с входа и применяет функцию до тех пор, пока результат не повторяется, после чего он выводит все промежуточные результаты.

Функция принимает предыдущее значение как N. Это начинается с принятия его квадратного корня с @N2. Затем он раздваивает это значение при умножении на Nс *B ... N. Это создает список [N ** .5, (N ** .5) * N], незатронутые результаты для четных и нечетных случаев. Затем соответствующий незатронутый результат выбирается путем индексации в списке с помощью @ ... N. Так как Pyth имеет модульную индексацию, не выдается никаких ошибок. Наконец, результат обречен s.

isaacg
источник
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 байт. (Извините за эти изменения; вы можете ознакомиться с краткой информацией о выпуске здесь )
Луис Мендо
О, круто, спасибо, что дали мне знать!
Дэвид
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.
El'ndia Starman
источник
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цикл, но мне пришлось прыгать через обручи, чтобы заставить его работать правильно. После кражи идеи заимствования user81655 вместо того, чтобы использовать ее, я опустил ее на двенадцать байтов.

Geobits
источник
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;

Un-golfed

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 байта благодаря планнапу.

mnel
источник
Учитывая , что все п положительны, можно сократить floor(n^(.5+n%%2))до n^(.5+n%%2)%/%1я думаю. +1 Тем не менее.
plannapus
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 байта.) Он будет печатать термин последовательности по термину вместо сбора терминов в списке.
Матмандан
Я также могу удалить еще один байт, сделав это, n<2orа неn-1and
Кэмерон Аавик
2

TI-Basic, 30 байт

Prompt A
Repeat A=1
Disp A
int(A^(remainder(A,2)+.5->A
End
1
user1812
источник
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;}
MegaTom
источник
1

C #, 62 байта

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

Вдохновленный @ user81655 и @Alex A., я использовал рекурсию.

Aloisdg говорит восстановить Монику
источник
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

mbomb007
источник
1

C 64 63 61 байт

t;q(n){for(;!t;n=pow(n,.5+n%2))printf("%d%c ",n,n^1?44:t++);}
o79y
источник
2
Вы можете заменить n%2?1.5:0.5на n%2+0.5или .5+n%2(если это позволяет C). Если n%2это правда, n%2равен 1, иначе 0.
говорит aloisdg Восстановить Монику
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 Да, вы, вероятно, правы. Я подумаю об этом немного.
Конор О'Брайен
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}

Ungolfed:

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

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
источник
0

Perl 5, 34 байта

33, плюс 1 -pEвместо-e

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

объяснение

Во-первых, -pустанавливает переменную, $_равную вводу из стандартного ввода. Затем мы запускаем блок кода:

  1. say печать $_ .
  2. $_=int$_**($_%2+.5)устанавливает $_равный целой части { $_степени {{ $_по модулю 2} + 0.5}}, благодаря магии порядка операций ( приоритет оператора ). Это назначение возвращает новое значение$_ и
  3. (...)-1&&redoтесты, возвращающие значение, минус 1. Если разница равна 0, ничего не делать; в противном случае повторите этот блок.

Наконец, -pпечатает $_.

Равной длины

Также использует -p.

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

Это: печатает $_; назначает, как указано выше; проверяет, равно ли 0 возвращаемое значение say(которое равно 1), за вычетом нового значения $_, и восстанавливает блок, если это так; затем печатает $_в конце.

msh210
источник
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.

Джо
источник