Giả thuyết Collatz ngược


13

Tôi nghĩ rằng phỏng đoán Collatz đã nổi tiếng. Nhưng nếu chúng ta đảo ngược các quy tắc thì sao?

Bắt đầu với số nguyên n> = 1.

Lặp lại các bước sau:

Nếu n chẵn , nhân nó với 3 và thêm 1.

Nếu n là số lẻ , trừ 1 và chia cho 2.

Dừng lại khi nó về 0

In các số lặp.

Các trường hợp thử nghiệm:

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

Quy tắc:

  • Chuỗi này không hoạt động cho nhiều số vì nó đi vào một vòng lặp vô hạn. Bạn không cần phải xử lý những trường hợp đó. Chỉ in các trường hợp thử nghiệm ở trên là đủ.

  • Tôi đề nghị trừ đi 1 và chia cho hai để đưa ra một số nguyên hợp lệ để tiếp tục, nhưng không bắt buộc phải tính theo cách đó. Bạn có thể chia cho 2 và chuyển thành số nguyên hoặc bất kỳ phương thức nào khác sẽ cho đầu ra dự kiến.

  • Bạn cần phải in đầu vào ban đầu là tốt.

  • Đầu ra không cần phải được định dạng như các trường hợp thử nghiệm. Nó đã chỉ là một sự gợi ý thôi mà. Tuy nhiên, thứ tự lặp phải được tôn trọng.

  • Mã nhỏ nhất sẽ thắng.


9
Vì đây là câu hỏi thứ ba của bạn sau bao nhiêu giờ, tôi khuyên bạn nên kiểm tra Sandbox , nơi chúng tôi thường đăng các bản nháp câu hỏi để phản hồi và để đảm bảo chúng không trùng lặp.
caird coinheringaahing

Cảm ơn bạn @cairdcoinheringaahing. Tôi không biết về trang này.
Eduardo Hoefel

Chúng ta có phải in 0cuối cùng không?
flawr

2
Bạn có thể muốn mở rộng hai trường hợp thử nghiệm gần nhất, vì chúng không dài
Jo King

3
@JoKing Tôi nén nó vì nó lặp lại đầu ra từ các dòng khác. Tại điểm bạn đạt 3 , nó có cùng một đầu ra khi bạn bắt đầu từ nó. Điều tương tự áp dụng cho 10 hoặc bất kỳ số nào khác.
Eduardo Hoefel

Câu trả lời:


5

Perl 6 , 30 byte

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

Hãy thử trực tuyến!

Khối mã ẩn danh trả về một chuỗi.

Giải trình:

{$_,{$_%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 byte

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

-2 byte nhờ ông Xcoder

Chắc chắn phải có một cách nhanh hơn. Điều kỳ lạ là, khi tôi thử món lambda thì nó cũng giống như vậy. Tôi có lẽ bị ảo giác.

Hãy thử trực tuyến!



@ Mr.Xcoder À, cảm ơn.
Quintec


Mặc dù 0bây giờ là tùy chọn, vì vậy nó ngắn hơn để thoát khỏi phần thứ haiprint
Jo King

Thật vậy, bây giờ bạn có thể làm điều đó trong 44
Ông Xcoder

2

Haskell , 76 69 61 56 byte

Tôi cảm thấy như thế này là quá dài. Đâyl tạo ra một danh sách vô hạn của chuỗi nghịch đảo-collatz và hàm ẩn danh ở dòng đầu tiên chỉ cắt nó ở đúng nơi.

Cảm ơn vì -5 byte @ janrjanJohansen!

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

Hãy thử trực tuyến!


Không có số âm, vì vậy (>0)nên đủ. Cũng có một oddchức năng.
Ørjan Johansen

@ RjanJohansen Cảm ơn rất nhiều!
flawr


2

05AB1E , 15 14 byte

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

-1 byte nhờ @MagicOctopusUrn .

Hãy thử trực tuyến.

Giải trình:

[             # 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÷với =thay vì D,.
Bạch tuộc ma thuật Urn

@MagicOctopusUrn Ah, thật tệ khi quên .. Cảm ơn! :)
Kevin Cruijssen

2

JAEL , 18 byte

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

Hãy thử trực tuyến!


1
Permalink của bạn dường như không hoạt động. Chương trình chỉ in đầu vào và tạm dừng.
Dennis

Vâng bạn đã đúng. Tôi sẽ yêu cầu "họ" kéo phiên bản mới nhất: P
Eduardo Hoefel

Tôi đã thêm JAEL vào danh sách các ngôn ngữ chơi gôn . Vui lòng cho tôi biết nếu tôi có bất kỳ thông tin nào sai :-)
ETHproductions

@ETHproductions Cảm ơn bạn rất nhiều: DI nghĩ rằng tôi có thể nói rằng đặc sản là gói tiện ích giúp lập trình viên nén mã, nhưng đó chỉ là tôi đang cố gắng bán nó.
Eduardo Hoefel



1

Ngôn ngữ Wolfram (Mathicala) , 35 byte

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

Hãy thử trực tuyến!

0<Echo@# && ...&là đánh giá ngắn mạch: nó in đầu vào #, kiểm tra xem nó có dương không và nếu có thì đánh giá .... Trong trường hợp này, ...#0[3#+1-(5#+3)/2#~Mod~2]; vì #0(khe zeroth) là chính hàm, đây là lệnh gọi đệ quy 3#+1-(5#+3)/2#~Mod~2, đơn giản hóa 3#+1khi nào #là chẵn và (#-1)/2khi nào #là số lẻ.




1

Biểu tượng cảm xúc 0,5 , 141 byte

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

Hãy thử trực tuyến!

🐖🎅🏿🍇
🍮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 byte

{o_¥¿½É3*)}∟

Hãy thử trực tuyến!

Giải trình

{             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

Tôi đã thêm MathGolf vào danh sách các lang đánh gôn - hãy tự do sửa lỗi cho tôi nếu tôi có bất cứ điều gì sai :-)
ETHproductions 12/11/18

Cảm ơn đã thêm nó! Mọi thứ có vẻ đúng với tôi.
maxb

1

mã máy x86, 39 byte

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 

Hội (cú pháp 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 '

Hãy thử trực tuyến!


1

R , 66 61 byte

-5 byte nhờ Robert S. trong việc hợp nhất ifelse vào ifvà xóa dấu ngoặc, và x! = 0 đến x> 0

print(x<-scan());while(x>0)print(x<-`if`(x%%2,(x-1)/2,x*3+1))

thay vì

print(x<-scan());while(x!=0){print(x<-ifelse(x%%2,(x-1)/2,x*3+1))}

Hãy thử trực tuyến!



0

perl -Minteger -nlE, 39 byte

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

0

Thêm ++ , 38 35 33 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Đầu tiên, chúng ta bắt đầu bằng cách định nghĩa một hàm f(x), có một đối số duy nhất, thực hiện thao tác Collatz ngược trên xsau đó đưa ra kết quả. Đó là,

f(x)= ={xthậm chí là,3x+1xlà số lẻ,x2

Khi ở chế độ chức năng, Add ++ sử dụng mô hình bộ nhớ ngăn xếp, nếu không các biến được sử dụng. Khi tính toánf(x), ngăn xếp ban đầu trông giống như S= =[x].

Sau đó, chúng tôi nhân đôi giá trị này ( d), để mang lạiS=[x,x]. We then yield the first possible option, 3x+1 (3*1+), swap the top two values, then calculate x2, leaving S=[3x+1,x2].

Next, we push x to S, and calculate the bit of x i.e. x%2, where a%b denotes the remainder when dividing a by b. This leaves us with S=[3x+1,x2,(x%2)]. Finally, we use D to select the element at the index specified by (x%2). If that's 0, we return the first element i.e. 3x+1, otherwise we return the second element, x2.

That completes the definition of f(x), however, we haven't yet put it into practice. The next three lines have switched from function mode into vanilla mode, where we operate on variables. To be more precise, in this program, we only operate on one variable, the active variable, represented by the letter x. However, x can be omitted from commands where it is obviously the other argument.

For example, +? is identical to x+?, and assigns the input to x, but as x is the active variable, it can be omitted. Next, we output x, then entire the while loop, which loops for as long as x0. The loop is very simple, consisting of a single statement: $f>x. All this does is run f(x), then assign that to x, updating x on each iteration of the loop.


Just to understand: Is the break line part of the code? Or is it just for better explanation? I don't really know this language.
Eduardo Hoefel

@EduardoHoefel Break line?
caird coinheringaahing

@cairdcoinheringaahing The newline characters, presumably.
Lynn

0

Retina 0.8.2, 46 bytes

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

Try it online! Explanation:

.+
$*

Convert to unary.

{

Repeat until the value stops changing.

*M`1

Print the value in decimal.

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

If it is even, multiply by 6 and add 3.

1(.*)\1
$1

Subtract 1 and divide by 2.

The trailing newline can be suppressed by adding a ; before the {.




0

C# (.NET Core), 62 bytes

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

Try it online!

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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.