Thay thế twos bằng threes


36

Cho một số nguyên dương n viết một số mã để lấy thừa số nguyên tố của nó và thay thế tất cả các thừa số của nó 2bằng 3.

Ví dụ

12 = 2 * 2 * 3 -> 3 * 3 * 3 = 27

Đây là vì vậy mục tiêu là giảm thiểu số byte trong câu trả lời của bạn.

Các trường hợp thử nghiệm

1 -> 1
2 -> 3
3 -> 3
4 -> 9
5 -> 5
6 -> 9
7 -> 7
8 -> 27
9 -> 9
10 -> 15
11 -> 11
12 -> 27
13 -> 13
14 -> 21
15 -> 15
16 -> 81
17 -> 17
18 -> 27
19 -> 19
20 -> 45
21 -> 21
22 -> 33
23 -> 23
24 -> 81
25 -> 25
26 -> 39
27 -> 27
28 -> 63
29 -> 29

Câu trả lời:


63

Fractran , 3 byte

3/2

Fractran theo nghĩa đen chỉ có một nội dung, nhưng nó thực hiện chính xác những gì nhiệm vụ này đang yêu cầu. (Bản thân nó cũng hoàn thành Turing.)

Ngôn ngữ không thực sự có cú pháp hoặc trình thông dịch chuẩn hóa. Trình thông dịch này (trong một bình luận cho một bài đăng trên blog - đó là một ngôn ngữ rất đơn giản) sẽ chấp nhận cú pháp được hiển thị ở đây. (Có các trình thông dịch Fractran khác với các cú pháp khác, ví dụ: một số người sẽ viết chương trình này như 3 2, hoặc thậm chí sử dụng 32 như các đối số dòng lệnh, mà sẽ dẫn đến một số điểm từ 0 + 3 byte. Tôi nghi ngờ nó có thể làm tốt hơn so với 3 trong một thông dịch viên có sẵn, mặc dù.)

Giải trình

3/2
 /   Replace a factor of
  2  2
3    with 3
     {implicit: repeat until no more replacements are possible}

10
Nói về công cụ phù hợp cho công việc ..
Kevin Cruijssen

23
"Đừng nâng cao các giải pháp tầm thường chỉ sử dụng một nội dung đơn giản." Chà, trong trường hợp này: Biết rằng có một ngôn ngữ "Fractran" có một nội dung duy nhất giải quyết nhiệm vụ cụ thể này tự nó rất ấn tượng.
Stewie Griffin

3
Golf mã liên quan SO (tiền PPCG): Viết trình thông dịch Fractran .
hobbs

1
@AnderBiguri: Có khả năng tìm kiếm một ngôn ngữ hoàn chỉnh Turing rất đơn giản / dễ thực hiện. Fractran thực sự thanh lịch như những tấm bạt Turing đi; hầu hết có nhiều cạnh thô hơn, trường hợp đặc biệt hoặc chi tiết có thể thay đổi mà không tạo ra sự khác biệt lớn.

3
@AnderBiguri Có vẻ như nó xuất phát từ nghiên cứu của ông về phỏng đoán Collatz; ông đã chứng minh rằng việc khái quát hóa Collatz tương đương với Fractran và Fractran hoàn thành Turing, do đó, Collatz tổng quát là không thể giải quyết được.
hobbs

21

Python 2 , 28 byte

f=lambda n:n%2*n or 3*f(n/2)

Hãy thử trực tuyến!

Chia đệ quy số cho 2 và nhân kết quả với 3, miễn là số chẵn. Số lẻ tự trả về.

Alt 32 byte:

lambda n:n*(n&-n)**0.58496250072

Hãy thử trực tuyến . Có một số lỗi float. Hằng số làlog_2(3)-1 .

Sử dụng (n&-n)để tìm ra yếu tố sức mạnh lớn nhất của 2 n, chuyển đổi 3**kthành 2**kbằng cách nâng nó lên sức mạnh của log_2(3)-1.


Đẹp đây là giải pháp của tôi chính xác!
Thuật sĩ lúa mì

@WheatWizard Tôi cũng vậy, aha!
Graviton

18

05AB1E , 4 byte

Ò1~P

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Ò     Compute the prime factorization of the input.
 1~   Perform bitwise OR with 1, making the only even prime (2) odd (3).
   P  Take the product of the result.

Điều này đánh bại Jelly 1 byte đơn giản vì hệ số nguyên tố chỉ có một byte ở đây :(
HyperNeutrino

5
@HyperNeutrino: Tôi cũng nhận thấy rằng: "tại sao Dennis sử dụng 05AB1E? Ồ, thuật toán giống hệt nhau, tên dựng sẵn ngắn hơn". Vì vậy, tôi đã phải đi và tìm một ngôn ngữ mà tôi có thể làm điều đó với số lượng byte ít hơn, thông qua việc sử dụng một tập hợp nội dung thậm chí phù hợp hơn.

14

Haskell, 24 23 byte

until odd$(*3).(`div`2)

Việc chia cho hai và nhân với 3 cho đến khi có số lẻ trong Haskell.

Hãy thử trực tuyến!

Thay thế bằng lambda thay vì chức năng pointfree và có cùng số byte:

odd`until`\x->div(x*3)2

Chỉnh sửa: @ ais523 đã lưu một byte trong phiên bản gốc và @ rjan Johansen một byte trong phiên bản thay thế, vì vậy cả hai phiên bản vẫn có cùng độ dài. Cảm ơn!


3
Phiên bản lambda có thể được rút ngắn thành odd`until`\x->div(x*3)2.
Ørjan Johansen

2
Phiên bản gốc cũng có thể được rút ngắn một byte thông qua việc sử dụng $để thay thế một cặp dấu ngoặc đơn: Hãy thử trực tuyến!

@ RjanJohansen: à, tốt đẹp! Cảm ơn.
nimi

@ ais523: Làm thế nào tôi có thể bỏ lỡ cái đó, Cảm ơn!
nimi

2
Tôi nghĩ rằng bạn đã quên xóa một cặp ()khỏi phiên bản lambda
CAD97

8

JavaScript (ES6), 19 byte

f=x=>x%2?x:f(x*1.5)

Trong khi đầu vào chia hết cho hai, nhân nó với 1,5, tương đương với chia cho 2 và nhân với 3.


2
x*3/2có cùng một số lượng lớn
Leaky Nun

1
f=là không cần thiết cho js.
Christoph

3
@Christoph Cảm ơn, nhưng để gọi chính f(x*1.5)nó, nó cần phải có tên f, do đó tại sao lại f=được bao gồm.
Sản phẩm ETH

@ETHproductions Uhm ... tất nhiên! Tôi bỏ lỡ điều đó. Có bất kỳ meta về những gì mã gọi chính xác trông như thế nào?
Christoph

2
@Christoph Đây là bài meta có liên quan.
Sản phẩm ETH

8

Brain-Flak , 76 byte

{{({}[()]<([({})]()<({}{})>)>)}{}([{}]()){{}((({})){}{})<>}<>}<>({}({}){}())

Hãy thử trực tuyến!

Giải trình

Chương trình này hoạt động bằng cách chia số cho hai và nhân ba cho đến khi phần còn lại của một từ bộ phận. Sau đó, nó dừng vòng lặp và nhân đôi và thêm một vào số cuối cùng.

Giải thích chi tiết hơn cuối cùng ...


> Sắp có ...
Wheat Wizard

7

Toán học, 22 19 byte

Cảm ơn lanlock4 vì đã tiết kiệm 3 byte!

#//.x_?EvenQ:>3x/2&

Chức năng thuần túy thực hiện thay thế nhiều lần, một yếu tố 2 tại một thời điểm. Hoạt động trên tất cả các số nguyên dương nhỏ hơn 2 65537 .


Sẽ x_?EvenQlàm việc thay vì x_/;EvenQ@x?
Không phải là một cây vào

1
Bạn hoàn toàn đúng, cảm ơn!
Greg Martin


6

05AB1E , 6 5 byte

Đã lưu một byte nhờ Adnan .

ÒDÈ+P

Hãy thử trực tuyến!

Giải trình

Ò       # push list of prime factors of input
 D      # duplicate
  È     # check each factor for evenness (1 if true, else 0)
   +    # add list of factors and list of comparison results
    P   # product

2
ÒDÈ+Pnên lưu một byte
Adnan

@Ad Nam: Cảm ơn!
Emigna

6

Alice , 9 byte

2/S 3
o@i

Hãy thử trực tuyến!

Alice có tích hợp sẵn để thay thế một ước của một số bằng một số khác. Tôi không nghĩ rằng tôi thực sự sẽ sử dụng nó sớm như vậy ...

Sử dụng các điểm mã của các ký tự cho I / O, điều này trở thành 6 byte : I23SO@.

Giải trình

2   Push 2 (irrelevant).
/   Reflect to SE. Switch to Ordinal.
i   Read all input as a string.
    The IP bounces up and down, hits the bottom right corner and turns around,
    bounces down again.
i   Try to read more input, but we're at EOF so this pushes an empty string.
/   Reflect to W. Switch to Cardinal.
2   Push 2.
    The IP wraps around to the last column.
3   Push 3.
S   Implicitly discard the empty string and convert the input string to the integer
    value it contains. Then replace the divisor 2 with the divisor 3 in the input.
    This works by multiplying the value by 3/2 as long as it's divisible by 2.
/   Reflect to NW. Switch to Ordinal.
    Immediately bounce off the top boundary. Move SW.   
o   Implicitly convert the result to a string and print it.
    Bounce off the bottom left corner. Move NE.
/   Reflect to S. Switch to Cardinal.
@   Terminate the program.

1
Nỗi ám ảnh của bạn chính thức được xác nhận.
Nữ tu bị rò rỉ

4

Thạch , 8 5 byte

Æf3»P

Æf3»P  Main Link, argument is z
Æf     Prime factors
  3»   Takes maximum of 3 and the value for each value in the array
    P  Takes the product of the whole thing

Hãy thử trực tuyến!

-3 byte nhờ một gợi ý từ @Dennis!


2
Gợi ý: 2 là số nguyên tố duy nhất chẵn và nhỏ nhất.
Dennis

@Dennis tôi hiểu rồi. Vâng, hiểu rồi Cảm ơn! :)
HyperNeutrino

Chúc mừng bạn đã học Jelly.
Nữ tu bị rò rỉ

@LeakyNun Cảm ơn! Và cảm ơn vì đã dạy nó cho tôi. :)
HyperNeutrino

Chúc mừng câu trả lời này!
Erik the Outgolfer

4

Pyth - 14 10 9 byte

*^1.5/PQ2

Đếm số lượng 2 giây trong hệ số nguyên tố (/ PQ2). Nhân số đầu vào bằng 1,5 ^ (số 2 giây)

Thử nó


Cách tiếp cận thú vị - quá tệ, nó không ngắn như giải pháp Pyth hiện có.
Esolanging Fruit

@ Challenger5 Tôi không thấy bất kỳ giải pháp Pyth nào khác ở đây.
Maria

1
Ồ, được rồi. Đó là một cách tiếp cận thú vị hơn so với phương pháp điển hình cho thử thách này.
Esolanging Fruit


4

Lục giác , 112 91 byte

Kích thước lưới 6 (91 byte)

      ? { 2 . . <
     / = { * = \ "
    . & . . . { _ '
   . . { . . } ' * 2
  _ } { / . } & . ! "
 . > % . . < | . . @ |
  \ . . \ . | ~ . . 3
   . . " . } . " . "
    . & . \ = & / 1
     \ = { : = } .
      [ = { { { <

Phiên bản nhỏ gọn

?{2..</={*=\".&...{_'..{..}'*2_}{/.}&.!".>%..<|..@|\..\.|~..3..".}.".".&.\=&/1\={:=}.[={{{<

Kích thước lưới 7 (112 byte)

       ? { 2 " ' 2 <
      / { * \ / : \ "
     . = . = . = | . 3
    / & / { . . } { . "
   . > $ } { { } / = . 1
  _ . . } . . _ . . & . {
 . > % < . . ~ & . . " . |
  | . . } - " . ' . @ | {
   . . . = & . . * ! . {
    . . . _ . . . _ . =
     > 1 . . . . . < [
      . . . . . . . .
       . . . . . . .

Hãy thử trực tuyến!

Phiên bản nhỏ gọn:

?{2"'2</{*\/:\".=.=.=|.3/&/{..}{.".>$}{{}/=.1_..}.._..&.{.>%<..~&..".||..}-".'.@|{...=&..*!.{..._..._.=>1.....<[

Phiên bản Ungolfed để dễ đọc hơn:

Ung dung

Bố cục bộ nhớ gần đúng

nhập mô tả hình ảnh ở đây

Đường dẫn màu xám (Khởi tạo bộ nhớ)

?     Read input as integer (Input)
{     Move to memory edge "Divisor left"
2     Set current memory edge to 2 
" '   Move to memory edge "Divisor right" 
2     Set current memory edge to 2
"     Move to memory edge "Multiplier" 
3     Set current memory edge to 3
"     Move to memory edge "Temp 2" 
1     Set current memory edge to 1 
{ { { Move to memory edge "Modulo"
=     Turn memory pointer around 
[     Continue with next instruction pointer

Nhập vòng

%     Set "Modulo" to Input mod Divisor
<     Branch depending on result

Đường dẫn xanh (giá trị vẫn chia hết cho 2)

} } {     Move to memory edge "Result"
=         Turn memory pointer around 
*         Set "Result" to "Temp 2" times "Multiplier" (3) 
{ = &     Copy "Result" into "Temp2" 
{ { } } = Move to "Temp"
:         Set "Temp" to Input / Divisor (2)
{ = &     Copy "Temp" back to "Input"
"         Move back to "Modulo"

Đường dẫn màu đỏ (giá trị không còn chia hết cho 2)

} = & " ~ & ' Drag what's left of "Input" along to "Multiplier"
*             Multiply "Multiplier" with "Temp 2"
! @           Output result, exit program

1
Chào mừng đến với PPCG! :)
Martin Ender

@MartinEnder Cảm ơn, btw ngôn ngữ tuyệt vời. :)
Manfred Radlwimmer 23/03/18

1
Cảm ơn bạn đã sử dụng nó! :) Bạn không thể đơn giản hóa bố cục bộ nhớ (và do đó số lượng chuyển động bạn cần làm) nếu bạn tính toán %2:2cả hai vào cạnh "modulo"? (Vì vậy, bạn có thể thoát khỏi hai cạnh trên cùng.) Và sau đó, bạn có thể gắn nhánh "số nhân" lên cạnh "modulo" thay vì cạnh "ước số" để bạn cần ít chuyển động hơn sau mỗi nhánh không? (Bạn thậm chí có thể xoay phần đó, để "kết quả" hoặc "temp 2" chạm vào "modulo" có nghĩa là bạn chỉ cần sao chép kết quả cuối cùng một lần trước khi có thể tính toán sản phẩm.)
Martin Ender

@MartinEnder Uhhhm có lẽ. Tôi vẫn đang tìm hiểu về phần "Agony" của ngôn ngữ nên bây giờ tôi có thể sẽ làm cho lưới nhỏ hơn mà không cần chạm vào logic ^^
Manfred Radlwimmer 23/03/18


3

Brachylog , 7 byte

~×₂×₃↰|

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

~×₂×₃↰|      original program
?~×₂×₃↰.|?.  with implicit input (?) and output (.) added

?~×₂         input "un-multiplied" by 2
    ×₃       multiplied by 3
      ↰      recursion
       .     is the output
        |    or (in case the above fails, meaning that the input
                 cannot be "un-multiplied" by 2)
         ?.  the input is the output


2

J , 11 byte

[:*/q:+2=q:

Hãy thử trực tuyến!

[: cap (giữ chỗ để gọi động từ tiếp theo một cách đơn điệu)

*/ sản phẩm của

q: các yếu tố chính

+ cộng (tức là có thêm một nơi)

2 hai

= bằng (mỗi)

q: các yếu tố chính


Tôi nghĩ bạn thấy [:kinh tởm.
Nữ tu bị rò rỉ

@LeakyNun Tôi làm, nhưng tôi không thông minh như Conor O'Brien .
Adám

2

J , 15 12 10 byte

(+2&=)&.q:

Hãy thử trực tuyến! Hoạt động tương tự như dưới đây, chỉ có logic khác liên quan đến việc thay thế 2bằng3 .

15 byte

(2&={,&3)"+&.q:

Hãy thử trực tuyến!

Giải trình

(2&={,&3)"+&.q:
           &.    "under"; applies the verb on the right, then the left,
                 then the inverse of the right
             q:  prime factors
(       )"+      apply inside on each factor
     ,&3         pair with three: [factor, 3]
 2&=             equality with two: factor == 2
    {            list selection: [factor, 3][factor == 2]
                 gives us 3 for 2 and factor for anything else
           &.q:  under prime factor

Huh, bạn đã chuyển thuật toán trong khi tôi đang viết lên của tôi. Bây giờ chúng tôi sử dụng như nhau.
Adám

@ Adám ơi, haha. Câu trả lời tốt đẹp! Tôi không thể cưỡng lại cơ hội sử dụng rollở đây. :)
Conor O'Brien

Trên thực tế tôi có thể có thể lưu thêm một số byte ... chỉnh sửa đã lưu một số: D
Conor O'Brien

Buồn cười bạn gọi nó là Roll, tôi gọi nó là Under. Hy vọng sớm đưa nó vào APL.
Adám

@ Adám Haha nó thực sự được gọi là dưới. Tôi đã nhầm lẫn các điều khoản
Conor O'Brien


2

Japt , 19 16 10 9 7 byte

k ®w3Ã×

Hãy thử trực tuyến!

Giải trình

 k ®   w3Ã ×
Uk mZ{Zw3} r*1
U              # (input)
 k m           # for every prime factor
    Z{Zw3}     # replace it by the maximum of itself and 3
           r*1 # output the product

Hah, JS được gắn với Japt. Một dấu hiệu chắc chắn có một giải pháp ngắn hơn nhiều ;-)
Sản phẩm ETH

Gợi ý: ×là lối tắt cho r@X*Y}1(hoặc chỉ r*1), có thể có ích. Ngoài ra còn XwYMath.max(X,Y).
Sản phẩm ETH

Cảm ơn, mặc dù giải pháp đệ quy thực sự là ngắn nhất.
Luke

Đẹp quá Tôi nghĩ bạn có thể làm k m_w3Ã×để tiết kiệm một byte. Ngoài ra, m_có thể được rút ngắn để ®.
Oliver


2

CJam, 10 9 byte

rimf1f|:*

Thực sự đơn giản.

Giải trình:

ri  e# Read integer:         | 28
mf  e# Prime factors:        | [2 2 7]
1   e# Push 1:               | [2 2 7] 1
f|  e# Bitwise OR with each: | [3 3 7]
:*  e# Product:              | 63

2

Lục giác , 28 27 26 byte

?'2{{(\}}>='!:@=$\%<..>)"*

Hãy thử trực tuyến!

Trả tiền:

    ? ' 2 {
   { ( \ } }
  > = ' ! : @
 = $ \ % < . .
  > ) " * . .
   . . . . .
    . . . .

Điều này về cơ bản chạy:

num = input()
while num%2 == 0:
    num = (num/2)*3
print num

Tại thời điểm này, đây là một bài tập về mức độ khó hiểu của tôi có thể có được đường dẫn vòng lặp để giảm thiểu byte.


Chết tiệt, tôi đã không nghĩ về điều đó
Manfred Radlwimmer 23/03/18

1
@ManfredRadlwimmer Đừng lo lắng, mã hóa bất cứ thứ gì trong Hexagony đều là một thành tựu
Jo King



1

R, 42 byte

Số lượng byte duy nhất đúng trong một câu trả lời.

x=gmp::factorize(scan());x[x==2]=3;prod(x)

Khá đơn giản, sử dụng gmpgói để nhân tố x, thay thế 2 giây bằng 3 giây và trả lại sản phẩm.


1

Befunge-93 , 20 byte

&>:2%!#v_.@
 ^*3/2 <

Hãy thử trực tuyến!

& - take in input and add it to the stack
> - move right
: - duplicate the top of the stack
2 - add two to the stack
% - pop 2 and the input off the stack and put input%2 on the stack
! - logical not the top of the stack
# - jump over the next command
_ - horizontal if, if the top of the stack is 0 (i.e. input%2 was non zero) go 
    right, else go left

If Zero:
. - output the top of the stack
@ - end code

If Not Zero:
v - move down
< - move left
2 - add 2 the top of the stack
/ - pop top two, add var/2 to the stack
3 - add 3 to stack
* - pop top two, add var*3 to the stack
^ - move up
> - move right (and start to loop)


1

Perl 6 , 14 byte

{1.5**.lsb*$_}

lsb trả về vị trí của bit có trọng số thấp nhất, được tính từ bên phải. Đó là, có bao nhiêu số 0 ở cuối trong biểu diễn nhị phân, tương đương với số lượng các yếu tố của 2. Vì vậy, hãy tăng 3/2 lên sức mạnh đó và chúng ta đã hoàn thành.

say {$_*1.5**.lsb}(24);
> 81


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.