PowerShell: 77 74 71 70 61
Mã đánh gôn:
for($i=(read-host);$i-ne1;$x++){$i=(($i/2),(3*$i+1))[$i%2]}$x
Ghi chú:
Ban đầu tôi đã thử lấy đầu vào của người dùng mà không buộc nó thành một số nguyên, nhưng điều đó đã phá vỡ một cách thú vị. Bất kỳ đầu vào lẻ nào cũng sẽ xử lý không chính xác, nhưng ngay cả đầu vào cũng hoạt động tốt. Phải mất một phút để tôi nhận ra chuyện gì đang xảy ra.
Khi thực hiện phép nhân hoặc bổ sung, PowerShell xử lý đầu vào chưa gõ dưới dạng chuỗi trước tiên. Vì vậy, '5'*3+1
trở thành '5551' thay vì 16. Các đầu vào chẵn hoạt động tốt vì PowerShell không có hành động mặc định để phân chia theo chuỗi. Ngay cả các đầu vào chẵn sẽ phát triển thông qua các số lẻ vẫn hoạt động tốt bởi vì vào thời điểm PowerShell có một số lẻ trong vòng lặp, biến số đã bị ép buộc thành một số nguyên bởi các phép toán.
Cảm ơn Danko Durbic đã chỉ ra rằng tôi chỉ có thể đảo ngược hoạt động nhân, và không phải chuyển read-host
sang int kể từ khi PowerShell dựa vào các hoạt động của nó trên đối tượng đầu tiên.
Mẹo của PowerShell Golfer: Đối với một số tình huống, như kịch bản này, switch
nhịp đập if/else
. Ở đây, sự khác biệt là 2 ký tự.
Protip lịch sự của Danko Durbic : Đối với kịch bản cụ thể này, một mảng có thể được sử dụng thay vì switch
, để lưu thêm 8 ký tự!
Không có lỗi kiểm tra các giá trị không nguyên hoặc số nguyên nhỏ hơn hai.
Nếu bạn muốn kiểm tra tập lệnh, hãy đặt ;$i
ngay trước dấu ngoặc cuối cùng trong tập lệnh.
Tôi không chắc chắn chính xác PowerShell xử lý các con số tiến triển thành các giá trị rất lớn như thế nào, nhưng tôi hy vọng độ chính xác sẽ bị mất ở một số điểm. Thật không may, tôi cũng hy vọng sẽ không có nhiều điều có thể được thực hiện về điều đó mà không làm phình to kịch bản.
Mã Ungolfed, với ý kiến:
# 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
Các trường hợp thử nghiệm:
Dưới đây là một số mẫu với kiểm toán kích hoạt. Tôi cũng đã chỉnh sửa một số đầu ra cho rõ ràng, bằng cách thêm nhãn vào đầu vào và số cuối cùng và đặt khoảng cách để phân tách các giá trị 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
---
Các bit thú vị về các số đầu vào không phải từ các trường hợp kiểm tra của câu hỏi:
1+
là đặc biệt như)
.