Collat​​z予想(OEIS A006577)


66

これはCollat​​z予想(OEIS A006577)です。

  • 整数n > 1から始めます。
  • 次の手順を繰り返します。
    • nが偶数の場合、2で割ります。
    • nが奇数の場合、3を掛けて1を加算します。

5 * 2 60まで、または約5764000000000000000までのすべての正の整数に対して、nは最終的に1になることが証明されています。

あなたの仕事は、それが到達するために(プラス1を三倍半減かの)かかり反復回数見つけることです1

関連するxkcd :)

ルール:

  • 最短のコードが優先されます。
  • 2未満の数値が入力された場合、または非整数または非数値の場合、出力は関係ありません。

テストケース

2  -> 1
16 -> 4
5  -> 5
7  -> 16

回答:


19

GolfScript、24 23 21 20 18文字

~{(}{3*).2%6\?/}/,

stdinへの入力を想定しています。オンラインテスト


3
1+として特殊なケースになってい)ます。
ピーターテイラー

@PeterTaylorはもちろん、それを忘れていました;)
ボラティリティ

1
よくやった!<!-パディング->
ピーターテイラー

1
@Peter:<!-->はコメントでは機能しません。代わりにこれを使用してください。
イルマリカロネン


15

C- 50 47文字

残念なことに、貧弱なCは基本的なI / Oのためにひどい量のコードを必要とするので、すべてを短くするとUIが少し直感的ではなくなりました。

b;main(a){return~-a?b++,main(a&1?3*a+1:a/2):b;}

たとえばでコンパイルしgcc -o 1 collatz.cます。入力はスペースで区切られた数字の単項式であり、答えは終了コードにあります。番号17の例:

$> ./1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
$> echo $?
12
$>

1
return~-a?saves 1.またb++?ケースに移動するとsaveになりb--ます。
ウゴレン

Heheあなたはルールを非常に曲げている:P +1創造性のために、通常ゴルフに使用されない言語を使用して
ドアノブ

ありがとうございます!書いているときは酔っていたに違いない。:)
Fors

12

Perl 34(+1)文字

$\++,$_*=$_&1?3+1/$_:.5while$_>1}{

$\通常どおり、最終出力を悪用します。-pコマンドラインオプションを使用して実行します。入力はから取得されstdinます。

Elias Van Ootegemのために1バイトを節約しました。具体的には、次の2つが同等であるという観察結果:

$_=$_*3+1
$_*=3+1/$_

1バイト長くなりますが、に短縮$_/2することで2バイトを節約します.5

サンプル使用法:

$ echo 176 | perl -p collatz.pl
18

PHP 54バイト

<?for(;1<$n=&$argv[1];$c++)$n=$n&1?$n*3+1:$n/2;echo$c;

Wooden Spoon AwardのJavascriptの大敵は、この課題で少し不足しているようです。ただし、この問題には創造性の余地はあまりありません。入力はコマンドライン引数として取得されます。

サンプル使用法:

$ php collatz.php 176
18

1
比類のない括弧が何をしているのかを理解するのにしばらく
かかった

1
$_3進法で繰り返すことは無駄に思えます。次の*=ように使用すると、別のキャラクターを剃り落とすことができます$\++,$_*=$_&1?3+1/$_:.5while$_>1}{。掛け算1/$_はと同じ効果が+1あるため、$_*=3+1/$_うまく機能します
エリアスヴァンオーテゲム

@EliasVanOotegem $_*=3+1/$_は素晴らしいです、ありがとう!
プリモ

11

Mathematica(35)

If[#>1,#0@If[OddQ@#,3#+1,#/2]+1,0]&

使用法:

If[#>1,#0[If[OddQ@#,3#+1,#/2]]+1,0]&@16
>> 4

これは、10.3が最後に不正の@を訴え、有効な機能ではありません
CalculatorFeline

@が引数を呼び出している、なぜそこにあったのかわからない、ただ簡単な編集
マイル

注意してください:)
CalculatorFeline

10

いつものように、自分で答えを始めます。

JavaScript、46 44文字(コンソールで実行)

for(n=prompt(),c=1;n>1;n=n%2?n*3+1:n/2,++c)c

出力が整数でない場合は重要ではないと言った場合、~~ prompt()のポイントは何ですか?~~を取り除くことにより、2文字を保存できます。
Resorath

@Resorathああ、JSの自動キャストを忘れてしまった:Pありがとう
Doorknob

9

Javaの、165、156、154,134,131,129,128、126(冗長な言語はあまりにもいくつかの愛を必要とします)

class a{public static void main(String[]a){for(int x=Short.valueOf(a[0]),y=0;x>1;x=x%2<1?x/2:x*3+1,System.out.println(++y));}}

すべてはfor内で行われます

for(int x=Short.valueOf(a[0]),y=0;x>1;x=x%2<1?x/2:x*3+1,System.out.println(++y))

それはすごい美しい男だ。Pater Taylor !!!に感謝し、forループを使用するというアイデアはugorenから盗まれました。

IntegerをShortに置き換えました。


1
の長さは非常に簡単に保存できますi(,++y)。の<代わりにを使用して、さらに2つ保存できます==
ピーターテイラー

@PeterTaylorあなたは正しいです、私の比較は<で短くなりますが、プリインクリメントの部分がわかりません
-jsedano

2
2番目の3項の両側は構造的に同一であるため、3項を再帰呼び出しの最初の引数にプッシュできます。
ピーターテイラー

1
ああ

2
私はそれが約3.5年が経ちましたが、知っているあなたは、によってゴルフそれをまだすることができ、5バイトclass a{public static void main(String[]a){for(int x=new Short(a[0]),y=0;x>1;System.out.println(++y))x=x%2<1?x/2:x*3+1;}}行われた変更:1)を交換Short.valueOf(...)してnew Short(...)のために-4バイトおよび2)私が置かれているx=x%2<1?x/2:x*3+1;の体内にfor取り除くために-loop -1バイトのコンマ。
ケビンCruijssen

9

レブム:28

u[++jE1 AeEV?a[d2A][a1M3a]]j

この簡潔で問題の多い問題については、GolfScriptはRebmuに対して数パーセント勝つ可能性が高いです(言うまでもなく、インターネットからファイルを読み取ったり、JPGファイルを生成したりする必要がない場合)。それでも私は、Golfscriptのロジックが従うほど簡単ではなく、それを実行する実行可能スタックの合計が大きいことに同意するだろうと思います。

RebolのクリエイターであるCarl SassenrathはRebmuを「読めない」と言ったが、彼は忙しく、unmushingでブタ・ラテンのような変換を実際に練習する時間がない。これは本当に次のように変換されます。

u [
    ++ j
    e1 a: e ev? a [
        d2 a
    ] [
        a1 m3 a
    ]
]
j

スペースを取得するために必要とされたことに注意してください:Aの代わりに、A。これは「セットワード」です。また、評価者は、割り当てをトリガーするシンボルタイプに気付きます。

略語で書かれていない場合(まだ厄介なRebolで書かれている場合)、次のようになります。

until [
    ++ j
    1 == a: either even? a [
        divide a 2
    ] [
        add 1 multiply 3 a
    ]
 ]
 j

Rebolは、Rubyと同様に、ブロックを最後の値まで評価します。UNTILループは、ループ状態をとらない好奇心の強いループです。ブロックがFALSEまたはNONE以外の値に評価されると、ループを停止します。その1 ==ため、A(rebmuへの引数)をCollat​​z条件の結果に割り当てた結果(どちらかが選択したブランチに評価されるIF-ELSE)...ループが中断します。

JとKは、Rebmuで整数値ゼロに初期化されます。そして前述のように、全体が最後の値に評価されます。したがって、プログラムの最後にあるJ参照は、反復回数を取得することを意味します。

使用法:

>> rebmu/args [u[++jE1 AeEV?a[d2A][a1M3a]]j] 16
== 4

8

Python repl、48

より短い表現がないことを確信していませんn=3*n+1;n/=1+n%2*5;。たぶん同じ長さのたくさんの異なる表現を見つけました...

i=0
n=input()
while~-n:n=3*n+1;n/=1+n%2*5;i+=1
i

編集:私は競合することはありませんが、共有するにはあまりにも楽しいです別のソリューションを見つけました。

s='s'
i=s
n=i*input()
while 1:
 while n==n[::2]+n[::2]:i+=s;n=n[::2]
 if n==s:i.rindex(s);break
 n=3*n+s
 i+=s

1
今、私の脳が痛い。
ダニエーロ

1
@danieroの2番目のソリューションはあなただけのものです。
ブースビー

ああすごい。光栄です!
ダニエロ

4
(n//2,n*3+1)[n%2]短いです。
Evpok 14

1
@Evpokはn/2、私たちが知っているほどうまく機能しないでしょうか?
ジョージ

7

APL(31)

A←0⋄A⊣{2⊤⍵:1+3×⍵⋄⍵÷2}⍣{⍺=A+←1}⎕

古い答え、まだ、27:{1=⍵:0⋄2|⍵:1+∇1+3×⍵⋄1+∇⍵÷2}
Uriel

1
{1=⍵:0⋄1+∇⊃⍵⌽0 1+.5 3×⍵}
ngn

7

J、30文字

<:#-:`(1+3&*)`]@.(2&|+1&=)^:a:

予想よりもかなり長くなった

使用法:

   <:#-:`(1+3&*)`]@.(2&|+1&=)^:a:2
1
   <:#-:`(1+3&*)`]@.(2&|+1&=)^:a:16
4
   <:#-:`(1+3&*)`]@.(2&|+1&=)^:a:5
5
   <:#-:`(1+3&*)`]@.(2&|+1&=)^:a:7
16
   <:#-:`(1+3&*)`]@.(2&|+1&=)^:a:27
111
  • -:`(1+3&*)`]3つの動詞で構成される動名詞で、3回使用されます。-:は「半分」を意味する(1+3&*)(1+3*])、乗算ステップをエンコードし、](同一性)終了を支援します。

  • 2&|+1&=動名詞の索引を形成します。文字通り、「2で割った後の剰余と1に等しいかどうか」。

  • #verb^:a:結果が安定するまで関数を繰り返し(ここでは明示的に強制)、ステップを収集し、それらをカウントします。@JBから盗まれました<:質問の要件に合わせて、ステップカウントを1減らします。


6
Jの投稿を見るたびに、スマイリーを数えます。この1はかなりよく行われます<:#-::`(&*)=))^:
プリモ

3
@primo nice; 彼らの説明が必要ですか?:-) <:は「減少」または「以下」を#意味し、「カウント」または「n回」を-:意味し、「半分」または「イプシロン平等」を:`(意味し、順に「半分」の終わりを意味し、動名詞と左括弧の2つの動詞(グループ化に使用)。&*)は、「乗算に結合されたsth」(乗算で結合された3は「3回」演算子を作成します)およびグループ化の終わりを意味します。=同等性チェックを実行するか、単項の意味で自己分類を実行します。^:べき積(動詞の繰り返し)です。多くのJ動詞がコロンで終わるため、... :
ジョンドヴォルザーク

数年後...ループブロックの改善: '-&2#(>&1 *-:+ 2&| * +:+>:@-:)^:a:'-> -1 char。:P
randomra

さらに数年後... <:#a:2&(<*|+|6&*%~)19バイト(-11)
マイル

6

Gambitスキーム、106 98文字、40括弧

(let((f(lambda(x)(cond((= x 1) 0)((odd? x)(+ 1(f(+ 1(* 3 x)))))(else(+ 1(f(/ x 2))))))))(f(read)))

91 89直接定義の文字

(define(f x)(cond((= x 1)0)((odd? x)(+ 1(f(+ 1(* 3 x)))))(else(+ 1(f(/ x 2))))))(f(read))


私は長い間存在していませんが、私は通常、人々がプログラミング言語ごとに1つの答えを投稿することに気づきました。
jsedano

申し訳ありませんが、私はそれを知りませんでした:)
バレンティンクレメント

Pythonのものを削除するために編集されました。
バレンティンクレメント

1
違います!人々は傾向があり、プログラミング言語ごとに答えを投稿することが、彼らは直接短い答えで他の誰かと競合しないようにしようとしているためです。ただし、同じ言語で別の回答を投稿しても文句を言う人はいません。
ブレッドボックス

@breadboxは正しくありません。各ソリューションが他のソリューションと比較してそれ自体で興味深い場合は、言語ごとに1つの回答を投稿します。両方のソリューションがそれぞれ一緒に興味深いものである場合(同じアルゴリズム、興味深い言語トリックはありません)、私はそれらを1つとして投稿します。通常、最初に言語を選択し、その言語で問題を解決するので、複数のソリューションを投稿しません-それから、通常は別の言語で同じものを書くのが面倒です-または、別のプログラミングを学ぶ旅に出ます言語。
ジョンドボラック

6

PowerShell:77 74 71 70 61

ゴルフコード:

for($i=(read-host);$i-ne1;$x++){$i=(($i/2),(3*$i+1))[$i%2]}$x

ノート:

私はもともとユーザー入力を整数に強制せずに取得しようとしましたが、それは興味深い方法で壊れました。奇数の入力は不正確に処理されますが、偶数の入力は正常に機能します。何が起こっているのかを理解するのに少し時間がかかりました。

乗算または加算を実行するとき、PowerShellは最初に型指定されていない入力を文字列として扱います。そのため、'5'*3+116の代わりに「5551」になります。PowerShellには文字列に対する除算のデフォルトアクションがないため、偶数入力は正常に動作しました。PowerShellがループ内で奇数に達するまでに、変数は既に数学演算によって強制的に整数にされていたため、奇数で進む偶数入力でも問題なく機能しました。

指摘してくれたDanko Durbicに感謝します。PowerShellread-hostその演算を最初のオブジェクトに基づいているため、乗算演算を逆にすることができ、int にキャストする必要はありません。

PowerShell Golferのヒント:いくつかのシナリオでは、このようなswitchビートがありif/elseます。ここでは、違いは2文字でした。

Danko Durbicの礼儀:この特定のシナリオでは、配列の代わりにを使用してswitch、さらに8文字を節約できます!

非整数値、または2未満の整数のエラーチェックはありません。

スクリプトを監査する場合は、スクリプト;$iの最後の閉じ括弧の直前に配置します。

PowerShellが非常に大きな値に進行する数値をどの程度適切に処理するかはわかりませんが、ある時点で精度が失われると予想しています。残念ながら、スクリプトを大幅に肥大化させない限り、それについてできることはあまりないと思います。


コメント付きの未ゴルフコード:

# Start for loop to run Collatz algorithm.
# Store user input in $i.
# Run until $i reaches 1.
# Increment a counter, $x, with each run.
for($i=(read-host);$i-ne1;$x++)
{
    # New $i is defined based on an array element derived from old $i.
    $i=(
        # Array element 0 is the even numbers operation.
        ($i/2),
        # Array element 1 is the odd numbers operation.
        (3*$i+1)
    # Array element that defines the new $i is selected by $i%2.
    )[$i%2]
}

# Output $x when the loop is done.
$x

# Variable cleanup. Don't include in golfed code.
rv x,i

テストケース:

以下は、監査が有効になっているサンプルです。また、わかりやすくするために、入力と最終カウントにラベルを追加し、間隔を空けてCollat​​z値を区切ることにより、出力の一部を編集しました。

---
Input: 2

1

Steps: 1

---
Input: 16

8
4
2
1

Steps: 4

---
Input: 5

16
8
4
2
1

Steps: 5

---
Input: 7

22
11
34
17
52
26
13
40
20
10
5
16
8
4
2
1

Steps: 16

---
Input: 42

21
64
32
16
8
4
2
1

Steps: 8

---
Input: 14

7
22
11
34
17
52
26
13
40
20
10
5
16
8
4
2
1

Steps: 17

---
Input: 197

592
296
148
74
37
112
56
28
14
7
22
11
34
17
52
26
13
40
20
10
5
16
8
4
2
1

Steps: 26

---
Input: 31

94
47
142
71
214
107
322
161
484
242
121
364
182
91
274
137
412
206
103
310
155
466
233
700
350
175
526
263
790
395
1186
593
1780
890
445
1336
668
334
167
502
251
754
377
1132
566
283
850
425
1276
638
319
958
479
1438
719
2158
1079
3238
1619
4858
2429
7288
3644
1822
911
2734
1367
4102
2051
6154
3077
9232
4616
2308
1154
577
1732
866
433
1300
650
325
976
488
244
122
61
184
92
46
23
70
35
106
53
160
80
40
20
10
5
16
8
4
2
1

Steps: 106

---
Input: 6174

3087
9262
4631
13894
6947
20842
10421
31264
15632
7816
3908
1954
977
2932
1466
733
2200
1100
550
275
826
413
1240
620
310
155
466
233
700
350
175
526
263
790
395
1186
593
1780
890
445
1336
668
334
167
502
251
754
377
1132
566
283
850
425
1276
638
319
958
479
1438
719
2158
1079
3238
1619
4858
2429
7288
3644
1822
911
2734
1367
4102
2051
6154
3077
9232
4616
2308
1154
577
1732
866
433
1300
650
325
976
488
244
122
61
184
92
46
23
70
35
106
53
160
80
40
20
10
5
16
8
4
2
1

Steps: 111

---
Input: 8008135

24024406
12012203
36036610
18018305
54054916
27027458
13513729
40541188
20270594
10135297
30405892
15202946
7601473
22804420
11402210
5701105
17103316
8551658
4275829
12827488
6413744
3206872
1603436
801718
400859
1202578
601289
1803868
901934
450967
1352902
676451
2029354
1014677
3044032
1522016
761008
380504
190252
95126
47563
142690
71345
214036
107018
53509
160528
80264
40132
20066
10033
30100
15050
7525
22576
11288
5644
2822
1411
4234
2117
6352
3176
1588
794
397
1192
596
298
149
448
224
112
56
28
14
7
22
11
34
17
52
26
13
40
20
10
5
16
8
4
2
1

Steps: 93
---

質問のテストケースからではない入力番号に関する興味深いビット:


2
いいね!あなたはまだ交換することにより、ややそれを短縮することができswitch$i=(($i/2),($i*3+1))[$i%2]
ダンコDurbić

2
また、read-host数値に変換する必要はありません-に変更$i*3するだけ3*$iです。
ダンコドゥルビッチ

スイッチの代わりに配列?ブリリアント!そして$i*3周りを交換する-なぜ私はすでにそれを考えていなかったのですか?
イスジ

1
param($i)for(;$i-ne1;$x++){$i=(($i/2),(3*$i+1))[$i%2]}$x-読み取りホストをパラメーターと交換して、56バイトを取得しますオンラインリンクそれを試してみてください
TessellatingHeckler

6

80386アセンブリ、16バイト

この例では、AT&T構文とfastcall呼び出し規則を使用しています。引数は次のようになりecxます。

collatz:
        or $-1,%eax              # 3 bytes, eax = -1;
.Loop:  inc %eax                 # 1 byte,  eax += 1;
        lea 1(%ecx,%ecx,2),%edx  # 4 bytes, edx = 3*ecx + 1;
        shr %ecx                 # 2 bytes, CF = ecx & 1;
                                 #          ecx /= 2;
                                 #          ZF = ecx == 0;
        cmovc %edx,%ecx          # 3 bytes, if (CF) ecx = edx;
        jnz .Loop                # 2 bytes, if (!ZF) goto .Loop;
        ret                      # 1 byte,  return (eax);

結果の16バイトのマシンコードは次のとおりです。

83 c8 ff 40 8d 54 49 01 d1 e9 0f 42 ca 75 f4 c3

6

Brachylog、16バイト

1b|{/₂ℕ|×₃+₁}↰+₁

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

説明

         Either:
  1        The input is 1.
  b        In which case we unify the output with 0 by beheading the 1
           (which removes the leading digit of the 1, and an "empty integer"
           is the same as zero).
|        Or:
  {        This inline predicate evaluates a single Collatz step on the input.
           Either:
    /₂       Divide the input by 2.
    ℕ        And ensure that the result is a natural number (which is
             equivalent to asserting that the input was even).
  |        Or:
    ×₃+₁     Multiply the input by 3 and add 1.
  }
  ↰        Recursively call the predicate on this result.
  +₁       And add one to the output of the recursive call.

同じバイト数での代替ソリューション:

;.{/₂ℕ|×₃+₁}ⁱ⁾1∧

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

;.          The output of this is a pair [X,I] where X is the input and
            I will be unified with the output.
{/₂ℕ|×₃+₁}  This is the Collatz step predicate we've also used above.
ⁱ⁾          We iterate this predicate I times on X. Since we haven't actually
            specified I, it is still a free variable that Brachylog can backtrack
            over and it will keep adding on iterations until the next
            constraint can be satisfied.
1           Require the result of the iteration to be 1. Once this is
            satisfied, the output variable will have been unified with
            the minimum number of iterations to get here.
∧           This AND is just used to prevent the 1 from being implicitly
            unified with the output variable as well.



5

Python 68 58 54 52文字

f=lambda n:1+(n-2and f((n/2,3*n+1)[n%2]));f(input())

ヒントをくれたBakuriuとboothbyに感謝します。


n%2and 3*n+1or n/25文字を保存するために使用できます。また、python2 intでは、への呼び出しを削除して、サイズを58バイトに減らすことができます。
バクリウ

ああ、それよりも短くすることさえできます:[n/2,3*n+1][n%2]
ブースバイ

それは素晴らしい!
バレンティンクレメント

これはPython 2.7ですか?Python 3.5.1でエラーが発生しますか?unsupported operand type(s) for -: 'str' and 'int'
ジョージ

5

網膜、43バイト

11
2
(2+)1
$1$1$0$0$0$0
2.*
$0x
)`2
1
1?x
1

入力を受け取り、出力を単項で出力します。

各行は独自のファイルに移動する必要があります。バイトカウントに追加される余分なファイルごとに1バイト。

-sフラグを使用して、コードを1つのファイルとして実行できます。例えば:

> echo -n 1111111|retina -s collatz
1111111111111111

アルゴリズムは、単項数を使用してCollat​​zステップを実行しx、数が1でない場合に文字列の最後に新しいステップマーカーを追加するループです。

ループがで終わると1、マーカーを単項数に変換し(先頭のを削除して1)、目的の出力になります。


5

ゼリー、非競合

12 バイト チャレンジはゼリーの作成よりも前のことなので、この答えは競合しません。

×3‘$HḂ?ß0’?‘

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

使い方

×3‘$HḂ?ß0’?‘  Main link. Argument: n (integer)

     Ḃ?       Yield the last bit of n is 1:
   $            Evaluate the three links to the left as a monadic chain:
×3                Multiply n by 3.
  ‘               Increment the product by 1.
    H           Else, halve n.
         ’?   If n-1 is non-zero:
       ß        Recursively call the main link.
        0     Else, yield 0.
           ‘  Increment the result by 1.

4

dc、27文字

ブースビーの黒魔術の適用:

?[d3*1+d2%5*1+/d1<x]dsxxkzp

または-私はどのように理解していれば、私は本当にわからないこと、それは動作します- 。

使用法:
$ dc collatz.dc <<< 7
16

dc、36文字

私自身の創造; やや伝統的なアプローチで、文のelse一部がないことを克服するために、私は言語にかなりこだわる必要がありましたif

?[2/2Q]se[dd2%[0=e3*1+]xd1<x]dsxxkzp

内部的には、シーケンスのすべての番号を生成してスタックに保存し、最後にポップし1てスタックの高さを表示します。


1
パリティは黒魔術ではありません
ブースビー

1
いいえ、しかしそれは非常に巧妙なトリックです!私は実際に自分で同様のことをしましたが、この場合は考えていませんでした。少しの間私をつまずかせたのは除算でしたが、私はそれを得ます:パリティが間違っていた場合、6で除算し、最初の操作(* = 3、+ = 1)を元に戻し、整数除算のために加算されますまた、基本的に/ = 2を完了しました。非常に賢い:)
daniero

1
+1。私はこの挑戦をdcで打ち破ろうと思っていましたが、たった40個しか得られませんでした。しかたがない。
デジタル外傷

私はこの挑戦を見たことはありませんでしたが、DCでCollat​​zシーケンスを印刷することについてしばらくブログを書きました。私のアプローチはあなたのものに似ていますが、1バイトずつ失われるので、投稿する理由が本当にわかりません。しかし、各ステップの印刷からステップ数の印刷に簡単に移行する方法を確認するために私のものを見ていたとき、私はあなたのバイトをゴルフできるものを見つけました... Collat​​zシーケンスは常に2から1になります。条件を変更して2<x、を取り除くことができますk。4年後に1バイト戻したい場合に備えて。:D
brhfl

4

brainfuck59 56バイト

,-[<->[[>]+<[-<]>>]>[-<<[++>+<]>->]<<[+>+++<]<<+>>>]<<<.

オンラインでお試しください!(使いやすさのために少し変更されています)

文字コードとしての入出力。これは、任意のサイズのセルではより便利ですが、限られたセルサイズの小さな値でも機能します。

使い方

Tape Format:
Counter 0 Copy Number Binary...
^End           ^Start

,-[ Get input, decrement by 1 and start loop
  <->                  Initialises the copy of the value at -1
  [[>]+<[-<]>>]        Converts the input to binary while preserving a negative copy
  <+>>[-<<[++>+<]>->] If the last digit of the binary is 1 (n-1 is odd), divide by 2 and decrement
  <<[+>+++<]            If the last digit of the binary is 0 (n-1 is even), multiply by 3
  <<+>>>               Increment counter and end on n-1
]<<<.                 End loop and print counter

4

六角形48 44バイト

?(]$_)"){{?{*')}/&!/={:<$["/>&_(.<@2'%<>./>=

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

拡張:

     ? ( ] $ _
    ) " ) { { ?
   { * ' ) } / &
  ! / = . { < $ [
 " / > & _ ( . < @
  2 ' % < > : / >
   = . . . . . .
    . . . . . .
     . . . . .

これは1uhh ... 理由で失敗することに注意してください。正直なところ、これがどのように機能するかは本当にわかりません。私が知っているのは、奇数のコードが偶数のコードに対して逆方向に実行されることだけです?どういうわけか?

新しいバージョンは以前のものよりもずっときれいですが、比較していくつかの方向性があり、ゼロ除算エラーで終わります。エラーにならないのは、実際に1正しく処理される場合だけです。


If a number < 2 is input ... output does not matter.:o)
ソク

私が代わりにその問題を解決しようとする非常識行くのそれを掲示し、なぜうん@Sok、それはだ
ジョー・キング

3

C、70 69文字

非常に簡単で、トリックはありません。
stdinから入力を読み取ります。

a;
main(b){
    for(scanf("%d",&b);b-1;b=b%2?b*3+1:b/2)a++;
    printf("%d",a);
}


3

Ruby 1.9、49文字

安定したラムダ構文を使用した、Rubyfied Valentin CLEMENTのPythonの回答。読みにくくするために、それを1つのステートメントに絞りました。

(f=->n{n>1&&1+f[[n/2,3*n+1][n%2]]||0})[gets.to_i]

Pythonとは異なり、Rubyは数値とブール値を混在させることに満足していないため、オーバーヘッドが発生します。


3

C ++(51 48)

これは、これを行う再帰関数です。入力の読み取りは個別に行われます。

int c(n){return n==1?0:1+(n%2?c(n*3+1):c(n/2));}

なんらかの「および/または」トリックを行うことができると確信していますが== 0、どうすればよいのかわかりません。


削除して==0、条件付きの側面を入れ替えることができます
Doorknob

また、n==1番号が常に1より大きいという質問で指定したため、処理する必要はありません
Doorknob

問題はn==1、基本的な再帰の場合です。n==2そこに置いてもスコアは改善されません。
ジョーZ。13年

ああ、それをこれに置き換えることができます:return~-n?条件付きの側面を入れ替える
Doorknob

n==1== n<2
CalculatorFeline

3

〜-〜!(コメントなし)-71 53

この言語は、ネイティブの機能を大量に欠いているため、明らかにゴルフには最適ではありませんが、それが美しさです。

'=|*;~~[*,~~~-~]*/~~|:''=|'''==~[*]'''='&''':''&*+~|:

まず、'''入力に設定します。この関数''は、%入力時に呼び出され、次のように答えを返します。

'''=~~~~~:''&%:

これは戻り~~~~~ます。実際に動作しますn==1(で永久にループしますn==0)。

この言語ではいつものように、テストされていません。


3

JavaScript(ES6)-29文字

f=x=>x>1?f(x%2?x*3+1:x/2)+1:0

f単一の引数を受け入れ、反復回数を返す関数を作成します。

JavaScript-31文字

for(c=0;n>1;n=n%2?n*3+1:n/2)++c

入力が変数内にあるnと想定し、c反復回数を含む変数を作成します(またc、最後のコマンドとしてコンソールに出力します)。




3

> <>、27 26 23バイト

\ln;
\::2%:@5*1+2,*+:2=?

他の> <>回答と同様に、これはスタック上にシーケンスを構築します。シーケンスが2に達すると、スタックのサイズは実行されたステップ数になります。

@Hohmannfanのおかげで、次の値を直接計算する非常に賢い方法で3バイトを節約しました。シーケンスの次の値を計算するために使用される式は次のとおりです。

f(n)=n5(nmod2)+12+(nmod2)

分数は偶数を0.5に、奇数を3にマッピングします。乗算しnて加算n%2すると計算が完了します。次の値を選択する必要はまったくありません。

編集2:これはpre- @ Hohmannfanバージョンです:

\ln;
\:::3*1+@2,@2%?$~:2=?

ここでのコツは、両方3n+1n/2がシーケンスの各ステップで計算され、シーケンスからドロップされる方が後で選択されることです。つまり、コードは1に達するまで分岐する必要がなく、シーケンスの計算は1行のコードで実行できます。

編集: 1につながる唯一の正の整数は2であることに気付いた後、別の文字をゴルフオフ。必要な正確なステップ数。

以前のバージョン:

\~ln;
\:::3*1+@2,@2%?$~:1=?

1
:あなたは、さらに二行目unbranch場合は、23にゴルフをすることができます\::2%:@5*1+2,*+:2=?
Hohmannfan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.