역 Collatz 추측


13

Collatz 추측은 이미 잘 알려져 있다고 생각합니다. 그러나 규칙을 뒤집 으면 어떻게 될까요?

정수 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마지막 에 인쇄해야 합니까?
flawr

2
오래 걸리지 않기 때문에 마지막 두 가지 테스트 사례를 확장하고 싶을 수도 있습니다.
Jo King

3
@ JoKing 다른 줄의 출력을 반복하기 때문에 압축했습니다. 3 에 도달 하면 시작 시점과 동일한 출력을 갖습니다. 10 또는 다른 숫자에도 동일하게 적용됩니다.
Eduardo Hoefel

답변:


5

펄 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
Jo King

실제로, 지금 당신은 44
Mr. Xcoder

2

하스켈 , 76 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 Johansen

@ ØrjanJohansen 감사합니다!
flawr


2

05AB1E , 15 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,.
매직 문어 Urn

@MagicOctopusUrn 아아, 그것은 잊어 버린 꽤 나빴어 .. 감사합니다! :)
Kevin Cruijssen

2

JAEL , 18 바이트

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

온라인으로 사용해보십시오!


1
귀하의 영구 링크가 작동하지 않는 것 같습니다. 프로그램은 입력을 인쇄하고 정지합니다.
데니스

네 말이 맞아. "그들"에게 최신 버전을 가져 오라고 요청할 것입니다 : P
Eduardo Hoefel

골프 언어 목록에 JAEL을 추가했습니다 . 내가 잘못된 정보를 가지고 있다면 알려주세요 :-)
ETHproductions

@ETHproductions 대단히 감사합니다 : DI 전문 분야는 프로그래머가 코드를 압축하는 데 도움이되는 유틸리티 패키지라고 말할 수 있다고 생각합니다.하지만 그것은 단지 그것을 상품화하려고합니다.
Eduardo Hoefel



1

Wolfram Language (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을 추가 한 골프 랭 가문의 목록 나는 아무것도 잘못을 가지고있는 경우 :-) 저를 해결하기 --feel 무료
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 브레이크 라인?
caird coinheringaahing

@cairdcoinheringaahing 아마도 개행 문자 일 것이다.
Lynn

0

레티 나 0.8.2 , 46 바이트

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

온라인으로 사용해보십시오! 설명:

.+
$*

단항으로 변환합니다.

{

값 변경이 멈출 때까지 반복하십시오.

*M`1

값을 10 진수로 인쇄하십시오.

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

짝수이면 6을 곱하고 3을 더하십시오.

1(.*)\1
$1

1을 빼고 2로 나눕니다.

;앞에 개행 문자를 추가하여 후행 줄 바꿈을 억제 할 수 있습니다 {.




0

C # (. NET 코어) , 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.