Saya pikir dugaan Collatz sudah terkenal. Tetapi bagaimana jika kita membalikkan aturan?
Mulai dengan bilangan bulat n> = 1.
Ulangi langkah-langkah berikut:
Jika n adalah genap , kalikan dengan 3 dan tambahkan 1.
Jika n ganjil , kurangi 1 dan bagi dengan 2.
Berhenti ketika mencapai 0
Cetak nomor yang diulang.
Kasus uji:
1 => 1, 0
2 => 2, 7, 3, 1, 0
3 => 3, 1, 0
10 => 10, 31, 15, 7, 3...
14 => 14, 43, 21, 10, ...
Aturan:
Urutan ini tidak berfungsi untuk banyak angka karena masuk dalam loop tak terbatas. Anda tidak perlu menangani kasus-kasus itu. Hanya mencetak test case di atas sudah cukup.
Saya menyarankan untuk mengurangi 1 dan membaginya dengan dua untuk memberikan integer yang valid untuk melanjutkan, tetapi tidak harus dihitung seperti itu. Anda dapat membaginya dengan 2 dan dilemparkan ke integer atau apa pun metode lain yang akan memberikan hasil yang diharapkan.
Anda perlu mencetak input awal juga.
Output tidak perlu diformat sebagai kasus uji. Itu hanya saran. Namun, perintah yang diulang harus dihormati.
Kode terkecil menang.
0
di bagian akhir?Jawaban:
Perl 6 , 30 byte
Cobalah online!
Blok kode anonim yang mengembalikan urutan.
Penjelasan:
sumber
Haskell ,
4039 byteCobalah online!
Sekarang tanpa 0 akhir.
sumber
Bersihkan , 53 byte
Cobalah online!
sumber
Jelly , 9 byte
Cobalah online!
sumber
Python 2,
545244 byte-2 byte terima kasih kepada Tn. Xcoder
Pasti ada cara yang lebih cepat. Anehnya, ketika saya mencoba lambda itu adalah bytecount yang sama. Saya mungkin berhalusinasi.
Cobalah online!
sumber
0
sekarang opsional, jadi lebih pendek untuk menyingkirkan yang keduaprint
Haskell ,
76 69 6156 byteSaya merasa ini terlalu lama. Di sini
l
menghasilkan daftar tak terbatas dari urutan inverse-collatz, dan fungsi anonim di baris pertama hanya memotongnya di tempat yang tepat.Terima kasih untuk -5 byte @ ØrjanJohansen!
Cobalah online!
sumber
(>0)
cukuplah. Juga adaodd
fungsi.Rust ,
6564 byteCobalah online!
sumber
05AB1E ,
1514 byte-1 byte terima kasih @MagicOctopusUrn .
Cobalah online.
Penjelasan:
sumber
[Ð=_#Èi3*>ë<2÷
dengan=
bukannyaD,
.JAEL , 18 byte
Cobalah online!
sumber
JavaScript (ES6), 31 bytes
Try it online!
Or 30 bytes in reverse order.
sumber
Pyth, 12 bytes
Try it here as a test suite!
sumber
Wolfram Language (Mathematica), 35 bytes
Try it online!
0<Echo@# && ...&
is short-circuit evaluation: it prints the input#
, checks if it's positive, and if so, evaluates...
. In this case,...
is#0[3#+1-(5#+3)/2#~Mod~2]
; since#0
(the zeroth slot) is the function itself, this is a recursive call on3#+1-(5#+3)/2#~Mod~2
, which simplifies to3#+1
when#
is even, and(#-1)/2
when#
is odd.sumber
Common Lisp, 79 bytes
Try it online!
sumber
PowerShell,
5352 bytesTry it Online!
Edit:
-1 byte thanks to @mazzy
sumber
for(;$i)
insteadwhile($i)
Emojicode 0.5, 141 bytes
Try it online!
sumber
Stax, 11 bytes
Run and debug it
sumber
MathGolf, 12 bytes
Try it online!
Explanation
sumber
x86 machine code, 39 bytes
Assembly (NASM syntax):
Try it online!
sumber
R,
6661 bytes-5 bytes thanks to Robert S. in consolidating ifelse into
if
and removing brackets, and x!=0 to x>0instead of
Try it online!
sumber
perl -Minteger -nlE, 39 bytes
sumber
Add++,
383533 bytesTry it online!
How it works
First, we begin by defining a functionf(x) , that takes a single argument, performs the inverted Collatz operation on x then outputs the result. That is,
When in function mode, Add++ uses a stack memory model, otherwise variables are used. When calculatingf(x) , the stack initially looks like S=[x] .
We then duplicate this value (S=[x,x] . We then yield the first possible option, 3x+1 (⌊x2⌋ , leaving S=[3x+1,⌊x2⌋] .
d
), to yield3*1+
), swap the top two values, then calculateNext, we pushx 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 (x%2) . If that's 0 , we return the first element i.e. 3x+1 , otherwise we return the second element, ⌊x2⌋ .
D
to select the element at the index specified byThat completes the definition off(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,x≠0 . The loop is very simple, consisting of a single statement: f(x) , then assign that to
+?
is identical tox+?
, and assigns the input tox
, but asx
is the active variable, it can be omitted. Next, we outputx
, then entire the while loop, which loops for as long as$f>x
. All this does is runx
, updatingx
on each iteration of the loop.sumber
Retina 0.8.2, 46 bytes
Try it online! Explanation:
Convert to unary.
Repeat until the value stops changing.
Print the value in decimal.
If it is even, multiply by 6 and add 3.
Subtract 1 and divide by 2.
The trailing newline can be suppressed by adding a
;
before the{
.sumber
Red, 70 bytes
Try it online!
sumber
Racket, 75 bytes
Try it online!
Equivalent to JRowan's Common Lisp solution.
sumber
C# (.NET Core), 62 bytes
Try it online!
Ungolfed:
sumber
Dart, 49 bytes
Try it online!
sumber
Gambit Scheme (gsi), 74 bytes
Try it online!
sumber