การคาดคะเนของ Collatz


13

ฉันคิดว่า Collatz Conjecture เป็นที่รู้จักกันดีอยู่แล้ว แต่ถ้าเรากลับกฎ

เริ่มต้นด้วยจำนวนเต็ม 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 แล้วแปลงเป็นจำนวนเต็มหรือวิธีอื่น ๆ

  • คุณต้องพิมพ์อินพุตเริ่มต้นเช่นกัน

  • ไม่จำเป็นต้องฟอร์แมตเอาต์พุตเป็นกรณีทดสอบ มันเป็นเพียงข้อเสนอแนะ อย่างไรก็ตามคำสั่งซ้ำจะต้องได้รับการเคารพ

  • รหัสที่เล็กที่สุดชนะ


9
เนื่องจากนี่เป็นคำถามที่สามของคุณในอีกไม่กี่ชั่วโมงเราจึงขอแนะนำให้คุณดูSandboxสถานที่ที่เรามักจะโพสต์ร่างคำถามเพื่อรับคำติชมและเพื่อให้แน่ใจว่าพวกเขาจะไม่ซ้ำซ้อน
caird coinheringaahing

ขอบคุณ @cairdcoinheringaahing ฉันไม่รู้เกี่ยวกับหน้านี้
Eduardo Hoefel

เราต้องพิมพ์0ตอนท้ายหรือไม่?
ข้อบกพร่อง

2
คุณอาจต้องการขยายการทดสอบสองกรณีล่าสุดเนื่องจากไม่นานนัก
โจคิง

3
@ โจกิ้งฉันบีบอัดมันเพราะมันทำซ้ำเอาต์พุตจากบรรทัดอื่น เมื่อถึงจุดที่3มันจะมีเอาต์พุตเหมือนกันเมื่อคุณเริ่มจากมัน เช่นเดียวกับ 10 หรือหมายเลขอื่น ๆ
Eduardo Hoefel

คำตอบ:


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

Python 2, 54 52 44 ไบต์

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

-2 ไบต์ขอบคุณ Mr. Xcoder

ต้องมีวิธีที่เร็วกว่าแน่นอน อย่างแปลกประหลาดเมื่อฉันลองแลมบ์ดามันเป็นจำนวนเงินเดียวกัน ฉันอาจเป็นภาพหลอน

ลองออนไลน์!



@ Mr.Xcoder อาขอบคุณ
Quintec


แม้ว่า0ตอนนี้จะเป็นตัวเลือกก็ตามดังนั้นจึงสั้นกว่าที่จะกำจัดวินาทีprint
Jo King

แน่นอนตอนนี้คุณสามารถทำได้ใน44
Mr. Xcoder

2

Haskell , 76 69 61 56 ไบต์

ฉันรู้สึกว่ามันยาวเกินไป ที่นี่lสร้างรายการอนันต์ของลำดับ inverse-collatz และฟังก์ชันที่ไม่ระบุชื่อที่บรรทัดแรกเพิ่งตัดออกในตำแหน่งที่ถูกต้อง

ขอบคุณสำหรับ -5 ไบต์ @ ØrjanJohansen!

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

ลองออนไลน์!


ไม่มีจำนวนลบดังนั้น(>0)ควรพอเพียง นอกจากนี้ยังมีoddฟังก์ชั่น
Ørjan Johansen

@ ØrjanJohansenขอบคุณมาก!
ข้อบกพร่อง


2

05AB1E , 15 14 ไบต์

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

-1 ขอบคุณไบต์@MagicOctopusUrn

ลองออนไลน์

คำอธิบาย:

[             # 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,
Magic Octopus Urn

@MagicOctopusUrn อ่ามันแย่มากที่จะลืม .. ขอบคุณ! :)
Kevin Cruijssen

2

JAEL , 18 ไบต์

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

ลองออนไลน์!


1
ความคิดเห็นของคุณดูเหมือนจะไม่ทำงาน โปรแกรมเพียงพิมพ์อินพุตและหยุดทำงาน
Dennis

ใช่คุณพูดถูก. ฉันจะขอให้ "พวกเขา" ดึงเวอร์ชันล่าสุด: P
Eduardo Hoefel

ฉันได้เพิ่ม JAEL ลงในรายการภาษากอล์ฟแล้ว โปรดแจ้งให้เราทราบหากฉันได้รับข้อมูลใด ๆ ที่ไม่ถูกต้อง :-)
ETHproductions

@ ETHproductions ขอบคุณมาก: DI คิดว่าฉันสามารถพูดได้ว่าพิเศษคือชุดโปรแกรมอรรถประโยชน์ที่ช่วยให้โปรแกรมเมอร์บีบอัดโค้ด แต่นั่นเป็นเพียงฉันพยายามขายสินค้า
Eduardo Hoefel



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(สล็อตข้อที่ศูนย์) เป็นฟังก์ชั่นของตัวเองนี้เป็นโทร recursive บน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(x)x

f(x)={xis even,3x+1xis odd,x2

f(x)S=[x]

dS=[x,x]3x+13*1+x2S=[3x+1,x2]

xSxx%2a%babS=[3x+1,x2,(x%2)]D(x%2)03x+1x2

f(x)xx

+?x+?xxxx0$f>xf(x)xx


เพียงแค่เข้าใจ: เป็นตัวแบ่งบรรทัดของรหัสหรือไม่ หรือเป็นเพียงคำอธิบายที่ดีกว่า ฉันไม่รู้ภาษานี้จริงๆ
Eduardo Hoefel

@EduardoHoefel Break line หรือไม่
caird coinheringaahing

@cairdcoinheringaahing อักขระขึ้นบรรทัดใหม่น่าจะเป็น
ลินน์

0

เรติน่า 0.8.2 , 46 ไบต์

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

ลองออนไลน์! คำอธิบาย:

.+
$*

แปลงเป็นเอก

{

ทำซ้ำจนกว่าค่าจะหยุดการเปลี่ยนแปลง

*M`1

พิมพ์ค่าเป็นทศนิยม

^(..)+$
$&$&$&$&$&$&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;}

ลองออนไลน์!

Ungolfed:

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.