逆コラッツ予想


13

Collat​​z予想はすでによく知られていると思います。しかし、ルールを逆にするとどうなりますか?

整数n> = 1から始めます。

次の手順を繰り返します。

nが偶数の場合、3を掛けて1を加算します。

nが奇数の場合、1を減算し、2で除算します。

0に達したら停止

繰り返し数を印刷します。

テストケース:

 1        => 1, 0
 2        => 2, 7, 3, 1, 0
 3        => 3, 1, 0
10        => 10, 31, 15, 7, 3...
14        => 14, 43, 21, 10, ...

ルール:

  • このシーケンスは、無限ループに入るため、多くの数値では機能しません。これらのケースを処理する必要はありません。上記のテストケースを印刷するだけで十分です。

  • 1を減算し、2で除算して有効な整数を求めることをお勧めしますが、そのように計算する必要はありません。2で割って整数にキャストするか、期待される出力が得られる他のメソッドにキャストします。

  • 最初の入力も印刷する必要があります。

  • 出力をテストケースとしてフォーマットする必要はありません。これは単なる提案でした。ただし、繰り返しの順序を尊重する必要があります。

  • 最小のコードが優先されます。


9
これは数時間で3番目の質問なので、フィードバックのために質問のドラフトを通常投稿するSandboxをチェックアウトしそれらが重複していないことを確認することをお勧めします。

@cairdcoinheringaahingありがとうございます。このページについては知りませんでした。
エドゥアルドヘフェル

0最後に印刷する必要がありますか?
-flawr

2
あなたは、彼らが長いということじゃないから、最後の2つのテストケースを拡張することができます
ジョー・キング

3
@JoKing他の行からの出力を繰り返すため、圧縮しました。3に到達した時点で、それから開始したときと同じ出力になります。同じことが10またはその他の番号にも適用されます。
エドゥアルドヘフェル

回答:


5

Perl 6、30バイト

{$_,{$_%2??$_+>1!!$_*3+1}...0}

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

シーケンスを返す匿名コードブロック。

説明:

{$_,{$_%2??$_+>1!!$_*3+1}...0}
{                            }   # Anonymous code block
   ,                     ...     # Define a sequence
 $_                              # That starts with the given value
    {                   }        # With each element being
     $_%2??     !!               # Is the previous element odd?
           $_+>1                 # Return the previous element bitshifted right by 1
                  $_*3+1         # Else the previous element multiplied by 3 plus 1
                            0    # Until the element is 0




2

パイソン2、54 52 44バイト

n=input()
while n:print n;n=(n*3+1,n/2)[n%2]

-Mr. Xcoderのおかげで2バイト

確かにもっと速い方法がなければなりません。奇妙なことに、ラムダを試してみると、同じバイト数でした。私はおそらく幻覚です。

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



@ Mr.Xcoderああ、ありがとう。
Quintec


けれども0、それは第二を取り除くために短いですので、オプションになりましたprint
ジョー・キング

確かに、今では44で
Xcoder氏18年

2

Haskell76 69 61 56バイト

これは長すぎるように感じます。ここでlは、逆コラッツシーケンスの無限リストが作成され、最初の行の無名関数は正しい場所で切り捨てます。

-5バイト@ØrjanJohansenをありがとう!

fst.span(>0).l
l r=r:[last$3*k+1:[div k 2|odd k]|k<-l r]

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


負の数はありませんので、それで(>0)十分です。また、odd機能があります。
Ørjanヨハンセン

@ØrjanJohansenどうもありがとう!
flawr


2

05AB1E15 14 バイト

[Ð=_#Èi3*>ë<2÷

@MagicOctopusUrnのおかげで-1バイト。

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

説明:

[             # Start an infinite loop
 Ð            #  Duplicate the top value on the stack three times
              #  (Which will be the (implicit) input in the first iteration)
  =           #  Output it with trailing newline (without popping the value)
   _#         #  If it's exactly 0: stop the infinite loop
     Èi       #  If it's even:
       3*     #   Multiply by 3
         >    #   And add 1
      ë       #  Else:
       <      #   Subtract 1
        2÷    #   And integer-divide by 2

[Ð=_#Èi3*>ë<2÷=代わりにD,
魔法のタコ

@MagicOctopusUrnああ、それは忘れるのがかなり悪かった。ありがとう!:)
ケビンクルーイッセン

2

JAEL、18バイト

![ؼw>î?èÛ|õÀ

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


1
パーマリンクが機能していないようです。プログラムは単に入力を出力して停止します。
デニス

はい、あなたが正しい。P:私は「彼ら」は、最新バージョン引っ張って頼むよ
エドゥアルドHoefel

JAELをゴルフ言語リストに追加しました。情報が間違っている場合はお知らせください:
ETHproductions

@ETHproductionsどうもありがとう:DIは、プログラマーがコードを圧縮するのに役立つユーティリティパッケージだと言えると思いますが、それは私が商品化しようとしているだけです。
エドゥアルドヘフェル



1

Wolfram言語(Mathematica)、35バイト

0<Echo@#&&#0[3#+1-(5#+3)/2#~Mod~2]&

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

0<Echo@# && ...&は短絡評価です。入力を出力し#、正かどうかをチェックし、正しければ評価し...ます。この場合、...です#0[3#+1-(5#+3)/2#~Mod~2]。以降#0関数そのものである(ゼロ番目のスロット)、これは上の再帰呼び出しである3#+1-(5#+3)/2#~Mod~2ように簡単に、3#+1場合#もあり、(#-1)/2場合#奇数です。




1

絵文字コード0.5、141バイト

🐖🎅🏿🍇🍮a🐕😀🔡a 10🔁▶️a 0🍇🍊😛🚮a 2 1🍇🍮a➗a 2🍉🍓🍇🍮a➕✖️a 3 1🍉😀🔡a 10🍉🍉

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

🐖🎅🏿🍇
🍮a🐕      👴 input integer variable 'a'
😀🔡a 10      👴 print input int
🔁▶️a 0🍇      👴 loop while number isn’t 0
🍊😛🚮a 2 1🍇     👴 if number is odd
🍮a➗a 2       👴 divide number by 2
🍉
🍓🍇      👴 else
🍮a➕✖️a 3 1   👴 multiply by 3 and add 1
🍉
😀🔡a 10     👴 print iteration
🍉🍉


1

MathGolf、12バイト

{o_¥¿½É3*)}∟

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

説明

{             Start block of arbitrary length
 o            Output the number
  _           Duplicate
   ¥          Modulo 2
    ¿         If-else with the next two blocks. Implicit blocks consist of 1 operator
     ½        Halve the number to integer (effectively subtracting 1 before)
      É       Start block of 3 bytes
       3*)    Multiply by 3 and add 1
          }∟  End block and make it do-while-true

MathGolfをゴルフラングのリストに追加しました。間違ったことがある場合はお気軽に修正してください:-)
ETHproductions

追加していただきありがとうございます!すべてが私にとって正しいように見えます。
maxb

1

x86マシンコード、39バイト

00000000: 9150 6800 0000 00e8 fcff ffff 5958 a901  .Ph.........YX..
00000010: 0000 0074 04d1 e8eb 066a 035a f7e2 4009  ...t.....j.Z..@.
00000020: c075 dec3 2564 20                        .u..%d 

アセンブリ(NASM構文):

section .text
	global func
	extern printf
func:					;the function uses fastcall conventions
	xchg eax, ecx			;load function arg into eax
	loop:
		push eax
		push fmt
		call printf	;print eax
		pop ecx
		pop eax
		test eax, 1	;if even zf=1
		jz even		;if eax is even jmp to even
		odd:		;eax=eax/2
			shr eax, 1
			jmp skip
		even:		;eax=eax*3+1
			push 3
			pop edx
			mul edx
			inc eax
		skip:
		or eax, eax
		jne loop	;if eax!=0, keep looping
	ret			;return eax
section .data
	fmt db '%d '

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



0

perl -Minteger -nlE、39バイト

{say;$_=$_%2?$_/2:3*$_+1 and redo}say 0

0

追加++38 35 33バイト

D,f,@:,d3*1+$2/iA2%D
+?
O
Wx,$f>x

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

使い方

まず、関数を定義することから始めます fバツ、単一の引数を取り、逆コラッツ演算を実行します バツその後、結果を出力します。あれは、

fバツ={バツ偶数です3バツ+1バツ奇妙ですバツ2

関数モードの場合、Add ++はスタックメモリモデルを使用し、そうでない場合は変数が使用されます。計算するときfバツ、スタックは最初は次のようになります S=[バツ]

次に、この値(d)を複製して、S=[バツバツ]。次に、最初の可能なオプションを生成します。3バツ+13*1+)、上位2つの値を交換してから計算するバツ2、離れる S=[3バツ+1バツ2]

次に、プッシュ バツS、およびビットの計算 バツ すなわち バツ2、 どこ ab除算時の剰余を示しますa 沿って b。これにより、S=[3バツ+1バツ2バツ2]。最後に、次でD指定されたインデックスで要素を選択するために使用しますバツ2。もしそうなら0、最初の要素、つまり 3バツ+1、そうでない場合は2番目の要素を返します。 バツ2

以上で定義は完了です fバツ、しかし、私たちはまだそれを実践していません。次の3行は、関数モードから変数を操作するバニラモードに切り替わりました。より正確には、このプログラムでは、文字で表される1つの変数、アクティブ変数のみを操作しますx。ただし、x明らかに他の引数であるコマンドからは省略できます。

たとえば、はと+?同一x+?であり、入力をxに割り当てますxが、アクティブ変数と同様に、省略できます。次に、を出力しx、whileループ全体を出力します。バツ0。ループは非常に単純で、単一のステートメントで構成されています$f>x。これはすべて実行されますfバツ、それをに割り当て、ループの各反復でx更新xします。


理解するために:ブレークラインはコードの一部ですか?それとも単により良い説明のためですか?私はこの言語を本当に知りません。
エドゥアルドヘフェル

@EduardoHoefel Break line?

@cairdcoinheringaahingおそらく改行文字。
リン

0

Retina 0.8.2、46バイト

.+
$*
{*M`1
^(..)+$
$&$&$&$&$&$&111
1(.*)\1
$1

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

.+
$*

単項に変換します。

{

値が変化しなくなるまで繰り返します。

*M`1

値を10進数で出力します。

^(..)+$
$&$&$&$&$&$&111

偶数の場合、6を掛けて3を加算します。

1(.*)\1
$1

1を引き、2で割ります。

末尾の改行は、の;前にを追加することで抑制できます{




0

C#(.NET Core)、62バイト

a=>{for(;a>0;a=a%2<1?a*3+1:a/2)Console.Write(a+" ");return a;}

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

ゴルフをしていない:

a => {
    for(; a > 0;                // until a equals 0
        a = a % 2 < 1 ?             // set a depending on if a is odd or even
                a * 3 + 1 :             // even
                a / 2                   // odd (minus one unnecessary because of int casting)
    )
        Console.Write(a + " "); // writes the current a to the console
    return a;                   // writes a to the console (always 0)
}


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