逆Collat​​z猜想


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
由于这是您数小时之内的第三个问题,因此建议您查看Sandbox(我们通常在其中发布问题草稿以获取反馈)的位置,并确保它们不会重复。
Caird coinheringaahing

谢谢@cairdcoinheringaahing。我不知道此页面。
Eduardo Hoefel

我们是否必须0在最后打印?
瑕疵的

2
您可能想扩展最后两个测试用例,因为它们用的时间不长
Jo King

3
@JoKing我压缩了它,因为它重复了其他行的输出。在达到3的点上,它具有与从其开始时相同的输出。10或任何其他数字相同。
Eduardo Hoefel

Answers:


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个字节,感谢Xcoder先生

当然,必须有一种更快的方法。奇怪的是,当我尝试一个lambda时,它是相同的字节数。我可能在幻觉。

在线尝试!



@ Mr.Xcoder嗯,谢谢。
Quintec,


虽然0现在是可选的,所以它的短摆脱第二的print
乔金

实际上,现在您可以在44号
编码

2

Haskell76 69 61 56字节

我觉得这太久了。这里l产生了反colatz序列的无限列表,并且第一行的匿名函数将其截断在正确的位置。

感谢-5个字节@ØrjanJohansen!

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

在线尝试!


没有负数,因此(>0)就足够了。还有一个odd功能。
与Orjan约翰森

@ØrjanJohansen非常感谢!
瑕疵的


2

05AB1E15 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,
魔术章鱼缸

@MagicOctopusUrn啊,那真是太糟糕了,忘了..谢谢!:)
Kevin Cruijssen

2

JAEL,18个字节

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

在线尝试!


1
您的固定链接似乎无效。该程序仅打印输入并暂停。
丹尼斯

你是对的。我要求“他们”下载最新版本:P
Eduardo Hoefel

我已将JAEL添加到高尔夫语言列表中。如果我输入的信息有误,请告诉我:-)
ETHproductions'Nov

@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(第零个槽位)是函数本身,因此这是对的递归调用3#+1-(5#+3)/2#~Mod~2,它简化为3#+1when #is even和(#-1)/2when when #奇数。



1

PowerShell,53 52字节

param($i)for(;$i){$i;$i=(($i*3+1),($i-shr1))[$i%2]}0

在线尝试!

编辑:
-1字节感谢@mazzy


你可以尝试for(;$i),而不是while($i)
MAZZY

1

Emojicode 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 '

在线尝试!


1

R66 61字节

-5个字节,这要感谢Robert S.将ifelse合并if并除去括号,并且x!= 0到x> 0

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

代替

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

在线尝试!



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换行?
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;}

在线尝试!

取消高尔夫:

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.