Collatz 추측 (OEIS A006577)


66

이것은 Collatz 추측 (OEIS A006577 )입니다.

  • 정수 n > 1로 시작하십시오 .
  • 다음 단계를 반복하십시오.
    • 경우 n이 짝수이고, 2로 나눈다.
    • 경우 n이 홀수이고, (3)에 의해 곱 1 추가.

모든 양의 정수에 대한 최대 것을 입증 5 * 2 (60) , 또는 약 5764000000000000000 , n은 결국 될 것입니다 1 .

당신의 임무는 1 에 도달하는 데 (반복 또는 삼중 플러스 1 회) 반복 횟수를 찾는 것 입니다.

관련 xkcd :)

규칙 :

  • 가장 짧은 코드가 승리합니다.
  • 숫자 <2가 입력되거나 정수가 아니거나 숫자가 아닌 경우 출력은 중요하지 않습니다.

테스트 사례

2  -> 1
16 -> 4
5  -> 5
7  -> 16

답변:



15

C- 50 47 자

작은 C는 불행히도 기본 I / O를 위해 엄청난 양의 코드를 필요로하므로 모든 것을 줄이면 UI가 약간 직관적이지 않습니다.

b;main(a){return~-a?b++,main(a&1?3*a+1:a/2):b;}

예를 들어 컴파일하십시오 gcc -o 1 collatz.c. 입력은 공백으로 구분 된 숫자와 단항식이며 종료 코드에서 답을 찾을 수 있습니다. 숫자 17의 예 :

$> ./1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
$> echo $?
12
$>

1
return~-a?저장함 1. 케이스로 이동 b++하면 ?저장해야합니다 b--.
ugoren

당신은 규칙을 너무 많이 굽히고 있습니다 : 창의력을 위해 P +1, 골프에 일반적으로 사용되지 않는 언어 사용
Doorknob

고마워요! 글을 쓸 때 술에 취했을 것입니다. :)
Fors

12

Perl 34 (+1) 자

$\++,$_*=$_&1?3+1/$_:.5while$_>1}{

$\평소와 같이 최종 출력을 남용 합니다. -p명령 행 옵션으로 실행 하면 입력이에서 가져옵니다 stdin.

Elias Van Ootegem 때문에 1 바이트를 절약했습니다 . 특히, 다음 두 가지가 동일하다는 관찰 :

$_=$_*3+1
$_*=3+1/$_

1 바이트는 길지만 $_/2just 로 단축 하여 2 바이트를 절약 .5합니다.

샘플 사용법 :

$ echo 176 | perl -p collatz.pl
18

PHP 54 바이트

<?for(;1<$n=&$argv[1];$c++)$n=$n&1?$n*3+1:$n/2;echo$c;

Wooden Spoon Award에 대한 Javascript의 대수는이 도전에서 조금 부족한 것 같습니다. 그러나이 문제에 대한 창의성은 충분하지 않습니다. 입력은 명령 행 인수로 사용됩니다.

샘플 사용법 :

$ php collatz.php 176
18

1
타의 추종을 불허하는 괄호가 무엇인지 알아 내기 위해 잠시 걸렸습니다. :
marinus

1
삼항식 $_에서 반복 하는 것은 낭비 적 인 것처럼 보입니다 . *=다음과 같이 사용하여 다른 캐릭터를 면도 할 수 있습니다 $\++,$_*=$_&1?3+1/$_:.5while$_>1}{. 에 곱하는 1/$_것과 같은 효과가 +1있으므로 $_*=3+1/$_잘 작동합니다.
Elias Van Ootegem

@EliasVanOotegem $_*=3+1/$_은 훌륭합니다, 감사합니다!
primo

11

매스 매 티카 (35)

If[#>1,#0@If[OddQ@#,3#+1,#/2]+1,0]&

용법:

If[#>1,#0[If[OddQ@#,3#+1,#/2]]+1,0]&@16
>> 4

유효한 함수가 아닙니다. 10.3은 결국 @에 대해 불평합니다
CalculatorFeline

@는 거기 왜 나도 몰라, 그냥 빨리 편집 인수를 호출
마일

조심해야 :)
CalculatorFeline

10

평소처럼, 나는 스스로 답을 시작합니다.

자바 스크립트, 46 44 자 (콘솔에서 실행)

for(n=prompt(),c=1;n>1;n=n%2?n*3+1:n/2,++c)c

정수가 아닌 경우 출력이 중요하지 않다고 말하면 ~~ prompt ()의 요점은 무엇입니까? ~~를 제거하여 두 문자를 저장할 수 있습니다.
Resorath

@Resorath Ah, JS의 자동 캐스팅에 대해 잊어 버렸습니다 : P 감사
Doorknob

9

자바, 165, 156, 154,134,131,129,128 , 126 (자세한 언어도 약간의 사랑이 필요)

class a{public static void main(String[]a){for(int x=Short.valueOf(a[0]),y=0;x>1;x=x%2<1?x/2:x*3+1,System.out.println(++y));}}

모든 내부에 이루어집니다

for(int x=Short.valueOf(a[0]),y=0;x>1;x=x%2<1?x/2:x*3+1,System.out.println(++y))

정말 아름다운 남자입니다. Pater Taylor !!! 덕분에, for 루프를 사용한다는 아이디어는 ugoren에서 도난당했습니다.

Integer를 Short로 바꿨습니다.


1
의 길이를 쉽게 저장할 수 있습니다 i(,++y). <대신을 사용하여 두 개를 더 저장할 수 있습니다 ==.
피터 테일러

@ PeterTaylor 당신 말이 맞아, 내 비교는 <보다 짧아 질 것이지만, 나는 사전 증분의 부분을 이해하지 못합니다
jsedano

2
두 번째 삼항의 양면은 구조적으로 동일하므로 삼항을 재귀 호출의 첫 번째 인수로 밀어 넣을 수 있습니다.
피터 테일러

1
MY GOD OH BRILLIANT 있다는
jsedano

2
나는 약 3.5 년이되었습니다 알지만, 당신은으로 골프를 아직 할 수있는 5 바이트 : class a{public static void main(String[]a){for(int x=new Short(a[0]),y=0;x>1;System.out.println(++y))x=x%2<1?x/2:x*3+1;}}변경이 : 1) 대체 Short.valueOf(...)new Short(...)대한 -4 바이트 2) 나는를 넣어 한 x=x%2<1?x/2:x*3+1;의 몸에서 for의 없애 -loop -1 바이트의 경우 쉼표 .
Kevin Cruijssen

9

렙무 : 28

u[++jE1 AeEV?a[d2A][a1M3a]]j

이 간단하고 어려운 문제로 인해 GolfScript는 Rebmu와 비교하여 어느 정도 승리 할 것입니다 (말하지 않아도 인터넷에서 파일을 읽거나 JPG 파일 생성). 그러나 나는 대부분 Golfscript의 논리가 따르기 쉽지 않으며 그것을 실행하는 총 실행 스택이 더 크다는 데 동의 할 것입니다.

Rebol의 제작자 인 Carl Sassenrath 는 Rebmu가 "판독 할 수 없음"을 발견했다고 말했지만 바빠서, unmushing을 통해 돼지와 같은 변형을 실제로 연습 할 시간이 없었습니다 . 이것은 실제로 다음과 같이 변형됩니다.

u [
    ++ j
    e1 a: e ev? a [
        d2 a
    ] [
        a1 m3 a
    ]
]
j

공백은 a 대신 a : 를 얻는 데 필요 했습니다 . 이것은 "집합"입니다! 평가자는 할당을 트리거하기 위해 해당 심볼 유형을 확인합니다.

그것이 축약되지 않은 (그러나 어색하게 작성된 Rebol)으로 작성된 경우 다음을 얻을 수 있습니다.

until [
    ++ j
    1 == a: either even? a [
        divide a 2
    ] [
        add 1 multiply 3 a
    ]
 ]
 j

Ruby와 마찬가지로 Rebol은 블록을 마지막 값으로 평가합니다. UNTIL 루프는 루프 조건이없는 호기심 많은 루프 형태로, 블록이 FALSE 또는 NONE이 아닌 것으로 평가 될 때 루핑을 중지합니다. 따라서 1 ==Collatz 조건부 결과에 A (rebmu에 대한 인수)를 할당 한 결과 (선택한 분기로 평가되는 IF-ELSE) ... 루프가 중단됩니다.

J와 K는 Rebmu에서 정수 값 0으로 초기화됩니다. 그리고 앞에서 언급했듯이 모든 것이 마지막 값으로 평가됩니다. 따라서 프로그램 끝의 J 참조는 반복 횟수를 의미합니다.

용법:

>> rebmu/args [u[++jE1 AeEV?a[d2A][a1M3a]]j] 16
== 4

8

파이썬 레 플리, 48

보다 짧은 표현이 없다고 확신하지 않습니다 n=3*n+1;n/=1+n%2*5;. 아마 같은 길이의 12 가지 표현을 발견했을 것입니다 ...

i=0
n=input()
while~-n:n=3*n+1;n/=1+n%2*5;i+=1
i

편집 : 나는 결코 경쟁하지 않지만 공유하기에는 너무 재미있는 다른 솔루션을 찾았습니다.

s='s'
i=s
n=i*input()
while 1:
 while n==n[::2]+n[::2]:i+=s;n=n[::2]
 if n==s:i.rindex(s);break
 n=3*n+s
 i+=s

1
뇌가 아파요
daniero

1
@daniero 두 번째 솔루션은 바로 당신입니다.
boothby

오 와우. 영광입니다!
daniero

4
(n//2,n*3+1)[n%2]더 짧습니다.
Evpok

1
@Evpok은 n/2우리가 심지어 그것이 알고있는 것처럼 잘 작동 하지 않습니까?
george

7

APL (31)

A←0⋄A⊣{2⊤⍵:1+3×⍵⋄⍵÷2}⍣{⍺=A+←1}⎕

이전 답변, 아직 27 :{1=⍵:0⋄2|⍵:1+∇1+3×⍵⋄1+∇⍵÷2}
Uriel

1
{1=⍵:0⋄1+∇⊃⍵⌽0 1+.5 3×⍵}
ngn

7

J, 30 자

<:#-:`(1+3&*)`]@.(2&|+1&=)^:a:

원하는 것보다 상당히 길다

용법:

   <:#-:`(1+3&*)`]@.(2&|+1&=)^:a:2
1
   <:#-:`(1+3&*)`]@.(2&|+1&=)^:a:16
4
   <:#-:`(1+3&*)`]@.(2&|+1&=)^:a:5
5
   <:#-:`(1+3&*)`]@.(2&|+1&=)^:a:7
16
   <:#-:`(1+3&*)`]@.(2&|+1&=)^:a:27
111
  • -:`(1+3&*)`]세 가지 동사로 구성되는 세 가지 경우에 사용되는 gerund입니다. -:"반"을 의미 (1+3&*)하거나 (1+3*]), 곱셈 단계를 인코딩하고 ](정체성) 종결을 돕는다.

  • 2&|+1&=gerund에 대한 색인을 형성합니다. 말 그대로, "2로 나눈 후 더하기 1과 같다".

  • #verb^:a:단계를 수집하는 동안 결과가 안정적이 될 때까지 (여기서는 명시 적으로 강제 적용) 함수를 반복 한 후 계수합니다. @JB에서 도난당했습니다 . <:질문 요구 사항에 맞게 단계 수를 하나씩 줄입니다.


6
J 제출을 볼 때마다 나는 웃음을 계산합니다. 이 사람은 꽤 잘 수행합니다 <:, #-:, :`(, &*), =), )^:.
primo

3
@primo nice; 그들의 설명을 원하십니까? :-) <:는 "감소"또는 "작거나 같음"을 #의미하고, "횟수"또는 "n 배"를 -:의미하고, "절반"또는 "엡실론-평등"을 :`(의미하며, 차례로 "반"의 끝을 의미하며, gerund에있는 두 동사와 왼쪽 괄호 (그룹화에 사용됨). &*)"곱셈에 결합 된 sth."(곱셈과 결합 된 3은 "times three"연산자를 생성 함) 및 그룹화의 끝을 의미합니다. =평등 검사 또는 단 항적 의미에서 자체 분류를 수행합니다. ^:전원 연결 (동사 반복)입니다. J 동사의 많은 콜론으로 끝나야하기 때문에 ... :-)
존 드보락

몇 년 후 ... 개선 된 루프 블록 : '-& 2 # (> & 1 *-: + 2 & | * + : +> : @-:) ^ : a :'-> -1 char. : P
randomra

몇 년 후 ... <:#a:2&(<*|+|6&*%~)19 바이트 (-11)
마일

6

Gambit 구성표, 106 98 자, 40 괄호

(let((f(lambda(x)(cond((= x 1) 0)((odd? x)(+ 1(f(+ 1(* 3 x)))))(else(+ 1(f(/ x 2))))))))(f(read)))

(91 개) (89)는 문자 를 직접 정의와

(define(f x)(cond((= x 1)0)((odd? x)(+ 1(f(+ 1(* 3 x)))))(else(+ 1(f(/ x 2))))))(f(read))


나는 오랫동안 주변에 없었지만 일반적으로 사람들은 프로그래밍 언어 당 1 개의 답변을 게시한다는 것을 알았습니다.
jsedano

죄송합니다, 나는 :) 알고하지 않았다
발렌틴 클레멘트

파이썬을 제거하도록 편집되었습니다.
Valentin CLEMENT

1
사실이 아니다! 사람들 프로그래밍 언어마다 하나의 답변을 게시 하는 경향이 있지만, 더 짧은 답변으로 다른 사람과 직접 경쟁하지 않기 때문입니다. 그러나 같은 언어로 다른 답변을 게시하면 아무도 불평하지 않습니다.
breadbox

@breadbox는 사실이 아닙니다. 각 솔루션이 다른 솔루션에 비해 흥미 롭다면 언어마다 하나의 답변을 게시합니다. 두 솔루션이 모두 서로 재미있을 때 (동일한 알고리즘, 재미있는 언어 트릭 없음), 그것들을 하나로 게시합니다. 일반적으로 언어를 먼저 선택한 다음 해당 언어로 문제를 해결하기 때문에 여러 솔루션을 게시하지 않습니다. 그런 다음 일반적으로 다른 언어로 동일한 언어를 작성하기에는 너무 게 으르거나 또 다른 프로그래밍을 배우기위한 여정을 시작합니다 언어.
John Dvorak

6

PowerShell : 77 74 71 70 61

골프 코드 :

for($i=(read-host);$i-ne1;$x++){$i=(($i/2),(3*$i+1))[$i%2]}$x

노트:

원래 사용자 입력을 정수로 강요하지 않고 시도했지만 흥미로운 방식으로 중단되었습니다. 홀수 입력은 부정확하게 처리되지만 입력조차도 제대로 작동합니다. 무슨 일이 일어나고 있는지 깨닫는 데 시간이 걸렸습니다.

곱셈 또는 덧셈을 수행 할 때 PowerShell은 형식화되지 않은 입력을 문자열로 먼저 처리합니다. 따라서 '5'*3+116 대신 '5551'이됩니다. PowerShell에는 문자열을 구분하기위한 기본 동작이 없기 때문에 짝수 입력이 올바르게 동작합니다. 홀수를 통해 진행되는 짝수 입력조차도 PowerShell에서 홀수에 도달 할 때까지 수학 연산에 의해 변수가 이미 정수로 설정 되었기 때문에 정상적으로 작동했습니다.

Danko Durbic 덕분에 곱셈 연산을 뒤집을 수 있었고 read-hostPowerShell은 첫 번째 객체를 기반으로하기 때문에 int 로 캐스트 할 필요가 없습니다 .

PowerShell 골퍼의 팁 : 이와 같은 일부 시나리오의 경우 switch이길 수 if/else있습니다. 여기서 차이는 2 자입니다.

Danko Durbic 의 Protip courtesy :이 특정 시나리오의 경우 switch8 개 이상의 문자를 절약하기 위해 대신 배열을 사용할 수 있습니다 !

정수가 아닌 값 또는 2보다 작은 정수를 검사하는 데 오류가 없습니다.

스크립트를 감사하려면 스크립트 ;$i에서 마지막 닫기 괄호 바로 앞에 놓으십시오 .

PowerShell이 ​​매우 큰 값으로 진행되는 숫자를 얼마나 잘 처리하는지 잘 모르겠지만 어느 시점에서 정확도가 떨어질 것으로 예상합니다. 불행히도, 나는 대본을 크게 부 풀리지 않고 그것에 대해 할 수있는 일이 많지 않을 것으로 기대합니다.


주석이 달린 언 골프 코드 :

# Start for loop to run Collatz algorithm.
# Store user input in $i.
# Run until $i reaches 1.
# Increment a counter, $x, with each run.
for($i=(read-host);$i-ne1;$x++)
{
    # New $i is defined based on an array element derived from old $i.
    $i=(
        # Array element 0 is the even numbers operation.
        ($i/2),
        # Array element 1 is the odd numbers operation.
        (3*$i+1)
    # Array element that defines the new $i is selected by $i%2.
    )[$i%2]
}

# Output $x when the loop is done.
$x

# Variable cleanup. Don't include in golfed code.
rv x,i

테스트 사례 :

다음은 감사가 활성화 된 샘플입니다. 또한 입력 및 최종 카운트에 레이블을 추가하고 Collatz 값을 구분하기 위해 간격을 두어 명확성을 위해 출력을 약간 편집했습니다.

---
Input: 2

1

Steps: 1

---
Input: 16

8
4
2
1

Steps: 4

---
Input: 5

16
8
4
2
1

Steps: 5

---
Input: 7

22
11
34
17
52
26
13
40
20
10
5
16
8
4
2
1

Steps: 16

---
Input: 42

21
64
32
16
8
4
2
1

Steps: 8

---
Input: 14

7
22
11
34
17
52
26
13
40
20
10
5
16
8
4
2
1

Steps: 17

---
Input: 197

592
296
148
74
37
112
56
28
14
7
22
11
34
17
52
26
13
40
20
10
5
16
8
4
2
1

Steps: 26

---
Input: 31

94
47
142
71
214
107
322
161
484
242
121
364
182
91
274
137
412
206
103
310
155
466
233
700
350
175
526
263
790
395
1186
593
1780
890
445
1336
668
334
167
502
251
754
377
1132
566
283
850
425
1276
638
319
958
479
1438
719
2158
1079
3238
1619
4858
2429
7288
3644
1822
911
2734
1367
4102
2051
6154
3077
9232
4616
2308
1154
577
1732
866
433
1300
650
325
976
488
244
122
61
184
92
46
23
70
35
106
53
160
80
40
20
10
5
16
8
4
2
1

Steps: 106

---
Input: 6174

3087
9262
4631
13894
6947
20842
10421
31264
15632
7816
3908
1954
977
2932
1466
733
2200
1100
550
275
826
413
1240
620
310
155
466
233
700
350
175
526
263
790
395
1186
593
1780
890
445
1336
668
334
167
502
251
754
377
1132
566
283
850
425
1276
638
319
958
479
1438
719
2158
1079
3238
1619
4858
2429
7288
3644
1822
911
2734
1367
4102
2051
6154
3077
9232
4616
2308
1154
577
1732
866
433
1300
650
325
976
488
244
122
61
184
92
46
23
70
35
106
53
160
80
40
20
10
5
16
8
4
2
1

Steps: 111

---
Input: 8008135

24024406
12012203
36036610
18018305
54054916
27027458
13513729
40541188
20270594
10135297
30405892
15202946
7601473
22804420
11402210
5701105
17103316
8551658
4275829
12827488
6413744
3206872
1603436
801718
400859
1202578
601289
1803868
901934
450967
1352902
676451
2029354
1014677
3044032
1522016
761008
380504
190252
95126
47563
142690
71345
214036
107018
53509
160528
80264
40132
20066
10033
30100
15050
7525
22576
11288
5644
2822
1411
4234
2117
6352
3176
1588
794
397
1192
596
298
149
448
224
112
56
28
14
7
22
11
34
17
52
26
13
40
20
10
5
16
8
4
2
1

Steps: 93
---

질문의 테스트 사례가 아닌 입력 숫자에 대한 흥미로운 내용 :


2
좋은! 당신은 여전히 대체하여, 어느 정도를 단축 할 수 switch$i=(($i/2),($i*3+1))[$i%2]
단코 Durbić

2
또한 read-host숫자 로 변환 할 필요가 없습니다 .로 변경 $i*3하십시오 3*$i.
Danko Durbić

스위치 대신 배열? 훌륭한! 그리고 스와핑 $i*3-왜 그렇게 생각하지 않았습니까?
Iszi

1
param($i)for(;$i-ne1;$x++){$i=(($i/2),(3*$i+1))[$i%2]}$x-읽기 바이트 를 매개 변수로 바꾸고 56 바이트 를 얻습니다 . 온라인으로 사용해보십시오
TessellatingHeckler

6

80386 어셈블리, 16 바이트

이 예제는 AT & T 구문과 빠른 호출 호출 규칙을 사용하며 인수는 다음과 ecx같습니다.

collatz:
        or $-1,%eax              # 3 bytes, eax = -1;
.Loop:  inc %eax                 # 1 byte,  eax += 1;
        lea 1(%ecx,%ecx,2),%edx  # 4 bytes, edx = 3*ecx + 1;
        shr %ecx                 # 2 bytes, CF = ecx & 1;
                                 #          ecx /= 2;
                                 #          ZF = ecx == 0;
        cmovc %edx,%ecx          # 3 bytes, if (CF) ecx = edx;
        jnz .Loop                # 2 bytes, if (!ZF) goto .Loop;
        ret                      # 1 byte,  return (eax);

16 바이트의 기계 코드 결과는 다음과 같습니다.

83 c8 ff 40 8d 54 49 01 d1 e9 0f 42 ca 75 f4 c3

6

Brachylog , 16 바이트

1b|{/₂ℕ|×₃+₁}↰+₁

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

설명

         Either:
  1        The input is 1.
  b        In which case we unify the output with 0 by beheading the 1
           (which removes the leading digit of the 1, and an "empty integer"
           is the same as zero).
|        Or:
  {        This inline predicate evaluates a single Collatz step on the input.
           Either:
    /₂       Divide the input by 2.
    ℕ        And ensure that the result is a natural number (which is
             equivalent to asserting that the input was even).
  |        Or:
    ×₃+₁     Multiply the input by 3 and add 1.
  }
  ↰        Recursively call the predicate on this result.
  +₁       And add one to the output of the recursive call.

동일한 바이트 수의 대안 솔루션 :

;.{/₂ℕ|×₃+₁}ⁱ⁾1∧

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

;.          The output of this is a pair [X,I] where X is the input and
            I will be unified with the output.
{/₂ℕ|×₃+₁}  This is the Collatz step predicate we've also used above.
ⁱ⁾          We iterate this predicate I times on X. Since we haven't actually
            specified I, it is still a free variable that Brachylog can backtrack
            over and it will keep adding on iterations until the next
            constraint can be satisfied.
1           Require the result of the iteration to be 1. Once this is
            satisfied, the output variable will have been unified with
            the minimum number of iterations to get here.
∧           This AND is just used to prevent the 1 from being implicitly
            unified with the output variable as well.


5

F #-65 자

let rec c n=function 1->n|i->c(n+1)(if i%2=0 then i/2 else i*3+1)

5

Python 68 58 54 52 자

f=lambda n:1+(n-2and f((n/2,3*n+1)[n%2]));f(input())

Bakuriu와 boothby에게 팁을 주셔서 감사합니다 :)


n%2and 3*n+1or n/25자를 저장할 수 있습니다 . 또한 python2에서는에 대한 호출을 제거 int하여 크기를 58 바이트로 줄일 수 있습니다 .
Bakuriu

아, 그것보다 짧아 질 수도 있습니다 : [n/2,3*n+1][n%2].
부스비

멋지다!
Valentin CLEMENT

이 파이썬 2.7입니까? Python 3.5.1에서 오류가 발생합니까? unsupported operand type(s) for -: 'str' and 'int'
george

5

레티 나 , 43 바이트

11
2
(2+)1
$1$1$0$0$0$0
2.*
$0x
)`2
1
1?x
1

단항으로 입력을 받아서 출력을 인쇄합니다.

각 줄은 자체 파일로 이동해야합니다. 바이트 수에 추가 된 추가 파일 당 1 바이트.

-s플래그를 사용하여 코드를 하나의 파일로 실행할 수 있습니다 . 예 :

> echo -n 1111111|retina -s collatz
1111111111111111

이 알고리즘은 단항 숫자로 Collatz 단계를 수행 x하고 숫자가 1이 아닌 경우 문자열 끝에 새 단계 마커 를 추가하는 루프입니다 .

루프가로 끝나면 1마커를 1원하는 출력 인 단항으로 변환합니다 (리딩 제거 ).


5

비경쟁 젤리

12 바이트이 대답은 경쟁이 아니기 때문에 도전이 젤리를 만들기 전에 시작됩니다.

×3‘$HḂ?ß0’?‘

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

작동 원리

×3‘$HḂ?ß0’?‘  Main link. Argument: n (integer)

     Ḃ?       Yield the last bit of n is 1:
   $            Evaluate the three links to the left as a monadic chain:
×3                Multiply n by 3.
  ‘               Increment the product by 1.
    H           Else, halve n.
         ’?   If n-1 is non-zero:
       ß        Recursively call the main link.
        0     Else, yield 0.
           ‘  Increment the result by 1.

4

dc, 27 자

부스비 흑 마법 적용 :

?[d3*1+d2%5*1+/d1<x]dsxxkzp

나 - 나는 방법을 이해하면 정말 모르겠어요 작동 -.

용법:
$ dc collatz.dc <<< 7
16

dc, 36 자

내 자신의 창조; 다소 전통적인 접근 방식, 심지어는 문장 에 대한 else부분 의 부족을 극복하기 위해 언어와 상당히 관련이 있어야했습니다 if.

?[2/2Q]se[dd2%[0=e3*1+]xd1<x]dsxxkzp

내부적으로 모든 수의 시퀀스를 생성하여 스택에 저장 한 다음 최종을 팝 1하고 스택 높이를 표시합니다.


1
패리티는 흑 마법 이 아닙니다 .
boothby

1
아니요, 그러나 매우 깔끔한 트릭입니다! 나는 실제로 비슷한 일을 직접했습니다.이 경우에는 그것에 대해 생각하지 않았습니다. 1 초 동안 저를 비틀었던 것은 나누기였습니다. 그러나 나는 6으로 나눕니다. 패리티가 잘못되면 첫 번째 연산 (* = 3, + = 1)을 두 번째로 되돌리고 정수 나누기 때문에 더하기는갑니다. 우리는 기본적으로 / = 2를 수행했습니다. 매우 영리한 :)
daniero

1
+1. 나는 dc로이 도전을 무너 뜨릴 것이라고 생각했지만 40에 불과했다. 나는 당신의 27 답변을 보았다. 오 잘
Digital Trauma

나는이 도전을 보지 못했지만 dc에서 Collatz 시퀀스를 인쇄하는 것에 대해 잠시 블로그를 올렸습니다. 내 접근 방식은 귀하와 비슷하지만 바이트별로 손실되므로 게시해야 할 이유가 없습니다. 그러나 각 단계를 인쇄하는 단계에서 여러 단계를 인쇄하는 단계까지 쉽게 진행하는 방법을 찾기 위해 광산을 살펴볼 때 Collatz 시퀀스가 ​​항상 2에서 1로 진행되므로 조건을로 변경 2<x하고를 제거 할 수 있습니다 k. 4 년 후에 바이트를 원할 경우를 대비하여. : D
brhfl

4

brainfuck , 59 56 바이트

,-[<->[[>]+<[-<]>>]>[-<<[++>+<]>->]<<[+>+++<]<<+>>>]<<<.

온라인으로 사용해보십시오! (사용 편의성을 위해 약간 수정)

문자 코드로 입력 및 출력합니다. 이것은 임의 크기의 셀에서 더 유용하지만 제한된 셀 크기에서 작은 값으로 계속 작동 할 수 있습니다.

작동 원리

Tape Format:
Counter 0 Copy Number Binary...
^End           ^Start

,-[ Get input, decrement by 1 and start loop
  <->                  Initialises the copy of the value at -1
  [[>]+<[-<]>>]        Converts the input to binary while preserving a negative copy
  <+>>[-<<[++>+<]>->] If the last digit of the binary is 1 (n-1 is odd), divide by 2 and decrement
  <<[+>+++<]            If the last digit of the binary is 0 (n-1 is even), multiply by 3
  <<+>>>               Increment counter and end on n-1
]<<<.                 End loop and print counter

4

헥사 고니 , 48 44 바이트

?(]$_)"){{?{*')}/&!/={:<$["/>&_(.<@2'%<>./>=

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

넓히는:

     ? ( ] $ _
    ) " ) { { ?
   { * ' ) } / &
  ! / = . { < $ [
 " / > & _ ( . < @
  2 ' % < > : / >
   = . . . . . .
    . . . . . .
     . . . . .

이것은 1uhh ... 이유로 실패합니다 . 솔직히, 나는 이것이 더 이상 어떻게 작동하는지 잘 모르겠습니다. 내가 아는 전부는 홀수에 대한 코드가 짝수에 대해 거꾸로 실행된다는 것입니다. 어쩐지?

새 버전은 이전 버전보다 훨씬 깨끗하지만 방향이 몇 개 더 있고 0으로 나누기 오류로 끝납니다. 오류가 아닌 유일한 경우는 실제로 1올바르게 처리 하는 경우입니다.


If a number < 2 is input ... output does not matter.: o)
Sok

@ Sok Yep, 그래서 나는 그것을 고치려고 노력하는 대신 미쳤습니다
Jo King

3

C, 70 69 자

매우 간단하고 트릭은 없습니다.
stdin에서 입력을 읽습니다.

a;
main(b){
    for(scanf("%d",&b);b-1;b=b%2?b*3+1:b/2)a++;
    printf("%d",a);
}

3

Q, 46

{i::0;{x>1}{i+:1;$[x mod 2;1+3*x;(_)x%2]}\x;i}

32 바이트(#)1_(1<){(1+3*x;x%2)0=x mod 2}\
streetster

3

루비 1.9, 49 자

stabby lambda 구문을 사용하여 Rubyfied Valentin CLEMENT의 Python 답변 . 가독성을 높이기 위해 하나의 문장으로 스퀴즈했습니다.

(f=->n{n>1&&1+f[[n/2,3*n+1][n%2]]||0})[gets.to_i]

루비는 파이썬과 달리 숫자를 부울과 섞는 것에 만족하지 않기 때문에 약간의 오버 헤드가 있습니다.


3

C ++ ( 51 48)

이것은 재귀 함수입니다. 입력 판독 값은 별도로 제공됩니다.

int c(n){return n==1?0:1+(n%2?c(n*3+1):c(n/2));}

나는 == 0물건으로 어떤 종류의 "그리고 / 또는"속임수를 쓸 수 있다고 확신 하지만, 나는 방법을 모른다.


를 제거하고 ==0조건부 측면을 교체 할 수 있습니다.
Doorknob

또한 n==1숫자가 항상 1보다 큽니다.
손잡이 :

문제는 n==1기본 재귀 사례입니다. n==2점수를 올리면 점수가 향상되지 않습니다.
Joe Z.

아, 그럼 당신은 이것을 다음 return~-n?과 같이 바꿀 수 있습니다 : 조건부를 바꾸십시오
Doorknob

. n==1== n<2.
CalculatorFeline

3

~-~! (댓글 없음) -71 53

이 언어는 많은 양의 기본 기능이 없기 때문에 골프에 가장 적합하지는 않지만 그 아름다움입니다.

'=|*;~~[*,~~~-~]*/~~|:''=|'''==~[*]'''='&''':''&*+~|:

먼저 '''입력으로 설정 하십시오. 함수 ''%입력 된대로 호출 할 수 있으며 다음과 같이 응답을 반환합니다.

'''=~~~~~:''&%:

이 반환 ~~~~~됩니다. 실제로 작동합니다 n==1(영원히 반복됩니다 n==0).

이 언어와 마찬가지로 테스트되지 않았습니다.


3

JavaScript (ES6)-29 자

f=x=>x>1?f(x%2?x*3+1:x/2)+1:0

f단일 인수를 허용하고 반복 횟수를 리턴 하는 함수 를 작성합니다.

자바 스크립트-31 자

for(c=0;n>1;n=n%2?n*3+1:n/2)++c

입력이 변수에 있다고 가정하고 반복 횟수를 포함 n하는 변수 c를 작성 c하고 마지막 명령으로 콘솔에 출력 합니다.



3

펄 6, 40 바이트

Valentin CLEMENTdaniero에 따른 재귀 함수 방법 : 40 자

sub f(\n){n>1&&1+f n%2??3*n+1!!n/2}(get)

게으른 목록 방법 : 32 자

+(get,{$_%2??$_*3+1!!$_/2}...^1)

3

> <>, 27 26 23 바이트

\ln;
\::2%:@5*1+2,*+:2=?

다른> <> 답변과 마찬가지로 스택에서 시퀀스를 작성합니다. 시퀀스가 2에 도달하면 스택 크기는 수행 된 단계 수입니다.

@Hohmannfan 덕분에 다음 값을 직접 계산하는 매우 영리한 방법으로 3 바이트를 절약했습니다. 시퀀스에서 다음 값을 계산하는 데 사용되는 공식은 다음과 같습니다.

f(n)=n5(nmod2)+12+(nmod2)

분수는 짝수를 0.5로, 홀수를 3으로 매핑합니다. 곱하고 n더하면 n%2계산이 완료됩니다. 다음 값을 전혀 선택할 필요가 없습니다!

편집 2 : 사전 @Hohmannfan 버전은 다음과 같습니다.

\ln;
\:::3*1+@2,@2%?$~:2=?

여기 트릭 모두이다 3n+1n/2시퀀스 이후 선택된 시퀀스에서의 각 단계, 및 상기 하나에서 계산이 감소된다. 즉, 1에 도달 할 때까지 코드를 분기 할 필요가 없으며 시퀀스 계산은 한 줄의 코드로 진행될 수 있습니다.

편집 : 1로 이어질 수있는 유일한 양의 정수는 2라는 것을 깨닫고 다른 문자를 골라냅니다. 프로그램의 출력이 입력 <2에 중요하지 않기 때문에 2에 도달하면 시퀀스 생성이 종료되어 스택 크기를 남길 수 있습니다 필요한 정확한 단계 수입니다.

이전 버전 :

\~ln;
\:::3*1+@2,@2%?$~:1=?

1
두 번째 줄을 더 많이 \::2%:@5*1+2,*+:2=?
풀면
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.