ジャグラーシーケンスを出力する


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値で停止するステップ数を計算しました(これまでのところすべて停止しています)。
マイケルクライン

(まだ未解決)このCollat​​z予想を思い出させる
WIM

@wim yes、それは非常に似ています。
シードラス

回答:


8

ゼリー12 11 10 バイト

*BṪ×½Ḟµ’п

1バイトのゴルフをしてくれた@ Sp3000に感謝します!

オンラインでお試しください!

使い方

*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文字のそれぞれをエンコードするカスタムコードページを使用します
デニス

1
そうですか!ありがとう。ところで、私はあなたのテーブルにバグを見つけました、キャラクター20(スペースではないと思いますが、それが「バグ」ではないのなら、これは不明確です)は、孤独なスペースなので削除されます、 を使用する必要があります; 代わりに。
匿名

@Annonymusはい、それは少し奇妙に見えました。テーブルをコピーしようとすると失敗するため、NBSPを使用したくありませんでしたが、<code> </code>代わりにバックティックの代わりに実際のSPキャラクターが表示されるようです。それを指摘してくれてありがとう。
デニス

10

ジュリア、64 50 48 42 32 30バイト

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

これは、整数を受け入れ、float配列を返す再帰関数です。

入力をシーケンスの次の項と連結して配列を作成します。xは、そのパリティの1/2乗で計算されます。これにより、x 1/2またはx 1 + 1/2 = x 3/2が得られます。1による整数除算は、床を取得します。条件x <3が真の場合、最終要素は数値ではなくブール値になりますが、配列はtype Anyではないため、これは配列の残りの部分と同じ型を持つようにキャストされます。

デニスのおかげで14バイトを節約できました!


JuliaインタープリターはISO 8859-1のソースコードを処理できますか?その場合、整数の除算は1バイトのみになります。
マーティンエンダー

@MartinBüttnerいいえ、私は前に試しましたが、かなり怒っていました。JuliaのパーサーはUTF-8を想定しています。
アレックスA.

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は、

7

Mathematica、40 39バイト

1バイトを節約してくれたMartinBüttnerに感謝します。

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ますが、その代わりにを使用できるように、Zo1つのバイトを保存します。(これらの変更については申し訳ありません。リリースの概要はこちらでご覧いただけます
ルイスメンドー

クールだ、知らせてくれてありがとう!
デビッド

5

Minkolang 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ループを使用していましたが、正しく動作させるためにフープをジャンプする必要がありました。借りているuser81655の代わりに再帰するというアイデア盗んだ後、私はそれを12バイト減らしました。


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

plannapusのおかげで3バイト節約されました。


すべてのnが正であることを考えると、短縮floor(n^(.5+n%%2))することができn^(.5+n%%2)%/%1ます。それでも+1。
プランナパス


2

Pythonの3、574543、41のバイト

@mathmandanからの提案によるより良いソリューション

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

このメソッドは、各行を新しい行に印刷します

前の解決策:xnorの推奨後に43バイトに削減

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

a(10)whichを返すことで上記を呼び出すことができます[10, 3.0, 5.0, 11.0, 36.0, 6.0, 2.0, 1.0]

上記は値をフロートとして出力します。整数として必要な場合は、43バイトに対して2バイトを追加するだけです。

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
キャメロンAavik

2

TI-Basic、30バイト

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

Ansから入力を取得し、に置き換えRepeat Ans=1While log(Ansを使用する場合は22バイト√(Ans)Ans^remainder(Ans,2
リルトシアスト

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番目から最後の行にはスペースが含まれ、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


デジタル外傷による網膜の整数平方根


1

C、64 63 61バイト

t;q(n){for(;!t;n=pow(n,.5+n%2))printf("%d%c ",n,n^1?44:t++);}

2
あなたは置き換えることができn%2?1.5:0.5n%2+0.5または.5+n%2(Cで許可されていれば)。場合はn%2trueで、 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}

ゴルフをしていない:

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)セットは$_、{の整数部分と等しい$_{{乗$_動作の順序(の魔法のために、モジュロ2} + 0.5}} 演算子の優先順位)。この割り当ては、新しい値を返す$_と、
  3. (...)-1&&redo1を引いた値を返すテスト。差が0の場合、何もしません。それ以外の場合は、このブロックをやり直してください。

最後に、-p印刷し$_ます。

等しい長さの

も使用し-pます。

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

これ:印刷し$_ます。上記のように割り当てます。say(1の)の戻り値からの新しい値を引いた値$_が0 かどうかをテストし、そうであればブロックをやり直します。その後$_、最後に印刷します。


0

dc、 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場合、出力は2つ1ので構成されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.