둘을 셋으로 교체


36

양의 정수를 감안할 때 N의 소인수 분해를 가지고 자사의 모든 요소 대체하는 몇 가지 코드 작성 2과를 3.

예를 들어

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

이것은 이므로 목표는 답변의 바이트 수를 최소화하는 것입니다.

테스트 사례

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

답변:


63

Fractran , 3 바이트

3/2

Fractran은 문자 그대로 하나만 내장되어 있지만이 작업이 요구하는 것을 정확하게 수행합니다. (또한 자체적으로 Turing-complete입니다.)

언어에는 실제로 표준화 된 구문이나 인터프리터가 없습니다. 이 인터프리터 (블로그 게시물에 대한 주석 – 매우 간단한 언어)는 여기에 표시된 구문을 허용합니다. (다른 구문 다른 Fractran 통역이 있기 때문에, 예를 들어, 일부는이 프로그램을 작성합니다 3 2사용하거나 심지어 320 + 3 바이트의 점수로 이어질 것입니다 명령 줄 인수로. 나는 그것이 3보다 더 잘 할 수 의심 기존 통역사.)

설명

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

10
작업에 적합한 도구에 대한 이야기 ..
케빈 Cruijssen

23
"단순한 내장 만 사용하는 사소한 솔루션을지지하지 마십시오." 이 경우 : 이 특정 작업을 해결하는 단일 내장 언어를 가진 "Fractran"이라는 언어가 있다는 사실은 그 자체로 인상적입니다.
Stewie Griffin

3
관련 SO 코드 골프 (pre-PPCG) : Fractran 인터프리터 작성 .
hobbs

1
@AnderBiguri : 구현이 매우 간단하고 쉬운 Turing-complete 언어를 찾고있을 것입니다. Fractran은 Turing tarpits가 갈 때 정말 우아합니다. 대부분 큰 가장자리를 만들지 않고 변경 될 수있는 더 거친 가장자리, 특수한 경우 또는 세부 사항이 있습니다.

3
@AnderBiguri Collatz 추측에 대한 그의 연구에서 나온 것처럼 보인다. 그는 Collatz의 일반화가 Fractran과 동등하고 Fractran이 Turing-complete라는 것을 증명했으며, 따라서 일반화 된 Collatz는 결정할 수 없습니다.
홉스

21

파이썬 2 , 28 바이트

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

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

숫자가 짝수 인 한 재귀 적으로 숫자를 2로 나누고 결과에 3을 곱합니다. 홀수 숫자는 스스로를 반환합니다.

32 바이트 대체 :

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

온라인으로 사용해보십시오 . 플로트 오류가 있습니다. 상수는 log_2(3)-1입니다.

사용 (n&-n)의 가장 큰 전력의-2 인자 찾을 n회심을 3**k2**k의 힘에 올려서 log_2(3)-1.


좋은 내 솔루션입니다!
밀 마법사

@WheatWizard 나도 아하!
Graviton

18

05AB1E , 4 바이트

Ò1~P

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

작동 원리

Ò     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.

소수 인수 분해가 여기에서 단지 1 바이트이기 때문에 이것은 단순히 1 바이트만큼 Jelly를
이깁니다.

5
@HyperNeutrino : "Dennis가 05AB1E를 사용하는 이유는 무엇입니까? 아, 동일한 알고리즘, 더 짧은 내장 이름"입니다. 그래서 훨씬 더 적절한 내장 집합을 사용하여 더 적은 바이트로 언어를 찾을 수있는 언어를 찾아야했습니다.

14

하스켈, 24 23 바이트

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

Haskell에서 홀수 트릭까지 2를 나누고 3을 곱합니다.

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

pointfree 함수 대신 lambda를 사용하고 동일한 바이트 수를 가진 대안 :

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

편집 : @ ais523은 원본 버전에서 바이트를 저장하고 @ Ørjan Johansen은 대체 버전에서 하나를 저장하므로 두 버전의 길이는 여전히 동일합니다. 감사!


3
람다 버전을로 줄일 수 있습니다 odd`until`\x->div(x*3)2.
Ørjan Johansen 님이

2
원래 버전 $은 괄호 쌍 을 사용하여 1 바이트 단축 할 수도 있습니다 . 온라인으로 사용해보십시오!

@ ØrjanJohansen : 아, 좋아! 감사.
nimi

@ ais523 : 어떻게 그 하나를 놓칠 수 있었습니까, 감사합니다!
nimi

2
()람다 버전에서 한 쌍을 제거하는 것을 잊었다 고 생각합니다
CAD97

8

자바 스크립트 (ES6), 19 바이트

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

입력은 2로 나눌 수 있지만 1.5를 곱하면 2로 나누고 3을 곱하는 것과 같습니다.


2
x*3/2같은 bytecount가있다
새는 수녀

1
f=js에는 일반적으로 필요하지 않습니다.
Christoph

3
@Christoph 감사합니다. 그러나 자체 호출 f(x*1.5)하려면 이름이 있어야 f하므로 왜 f=포함되어 있습니까?
ETHproductions

@ETHproductions 음 ... 물론! 나는 그것을 놓쳤다. 호출 코드가 정확히 어떻게 보이는지에 대한 메타가 있습니까?
Christoph

2
@Christoph 여기 에 관련된 메타 포스트가 있습니다.
ETHproductions

8

브레인 플락 , 76 바이트

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

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

설명

이 프로그램은 숫자를 2로 나누고 나눗셈에서 1의 나머지를 얻을 때까지 3 배로 작동합니다. 그런 다음 루핑을 중지하고 두 배로 늘리고 마지막 숫자에 1을 더합니다.

더 자세한 설명은 결국 ...


> 출시 예정 ...
밀 마법사

7

수학, 22 19 바이트

3 바이트를 절약 한 lanlock4에 감사합니다!

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

한 번에 2의 요소를 반복적으로 교체하는 순수한 기능. 2 65537 미만의 모든 양의 정수에서 작동합니다 .


겠습니까 x_?EvenQ대신 일을 x_/;EvenQ@x?
나무가 아님

1
당신은 완전히 옳습니다, 감사합니다!
Greg Martin


6

05AB1E , 6 5 바이트

Adnan 덕분에 바이트를 절약했습니다 .

ÒDÈ+P

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

설명

Ò       # 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È+P바이트를 저장해야합니다
Adnan

@Adnan : 감사합니다!
Emigna

6

Alice , 9 바이트

2/S 3
o@i

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

Alice는 숫자의 제수를 다른 숫자로 대체하기 위해 내장되어 있습니다. 나는 실제로 그렇게 빨리 그것을 사용할 것이라고 생각하지 않았다 ...

I / O 용 코드 포인트를 사용하면 6 바이트가됩니다 I23SO@.

설명

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
집착은 공식적으로 확인됩니다.
Leaky Nun

4

젤리 , 8 5 바이트

Æ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

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

@Dennis의 힌트 덕분에 -3 바이트!


2
힌트 : 2 는 유일한 짝수와 가장 작은 소수입니다.
Dennis

@Dennis 알겠습니다. 예, 알겠습니다 감사! :)
HyperNeutrino

젤리 배우 신 것을 축하합니다.
Leaky Nun

@LeakyNun 감사합니다! 가르쳐 주셔서 감사합니다. :)
HyperNeutrino

이 답변을 축하합니다!
Outgolfer Erik

4

Pyth- 14 10 9 바이트

*^1.5/PQ2

소인수 분해 (/ PQ2)에서 2의 개수를 계산합니다. 입력 값에 1.5 ^ (# of 2s)를 곱합니다

시도 해봐


흥미로운 접근법-기존 Pyth 솔루션만큼 짧지는 않습니다.
Esolanging 과일

@ Challenger5 다른 Pyth 솔루션이 보이지 않습니다.
Maria

1
아, 그럼 이 도전에 대한 일반적인 접근 방법보다 더 흥미로운 접근 방법입니다.
Esolanging 과일


4

헥사 고니 , 112 91 바이트

격자 크기 6 (91 바이트)

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

컴팩트 버전

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

격자 크기 7 (112 바이트)

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

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

컴팩트 버전 :

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

가독성 향상을위한 Ungolfed Version :

언 골프

대략적인 메모리 레이아웃

여기에 이미지 설명을 입력하십시오

회색 경로 (메모리 초기화)

?     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

루프 엔트리

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

녹색 경로 (값은 여전히 ​​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"

빨간색 경로 (값을 더 이상 2로 나눌 수 없음)

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

1
PPCG에 오신 것을 환영합니다! :)
Martin Ender

@MartinEnder 감사합니다. 멋진 언어입니다. :)
Manfred Radlwimmer

1
사용해 주셔서 감사합니다! :) 계산 %2하고 :2"모듈로"에지로 메모리 레이아웃을 단순화 할 수 없습니까 (따라서 필요한 이동량) ? (따라서 상단 두 모서리를 제거 할 수 있습니다.) 그런 다음 "승수"모서리 대신 "승수"분기를 "모듈러스"모서리에 연결할 수 있으므로 각 분기 후 이동이 덜 필요합니까? ( "결과"또는 "임시 2"가 "모듈로"에 닿도록 해당 섹션을 회전시킬 수도 있습니다. 즉, 제품을 계산하기 전에 최종 결과를 한 번만 복사하면됩니다.)
Martin Ender

아마 @MartinEnder Uhhhm. 나는 여전히 언어의 "Agony"부분을 돌아 다니기 때문에 논리를 건드리지 않고 그리드를 더 작게 만드는 것을 계속 할 것입니다 ^^
Manfred Radlwimmer


3

Brachylog , 7 바이트

~×₂×₃↰|

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

작동 원리

~×₂×₃↰|      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 , 15 12 10 바이트

(+2&=)&.q:

온라인으로 사용해보십시오! 아래와 유사하게 작동하며로 대체하는 것과 다른 논리를 갖 2습니다 3.

15 바이트

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

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

설명

(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

내가 글을 쓰는 동안 알고리즘을 바꿨어 이제 우리는 같은 것을 사용합니다.
Adám

@ Adám 오, 하하. 좋은 대답입니다! 나는 roll여기서 사용할 기회에 저항 할 수 없었다 . :)
코너 오브라이언

사실은 내가 좀 더 바이트를 저장할 수 있습니다 ... 편집 D : 일부 저장
코너 오브라이언

재미 있다면 롤이라고 부르지 곧 APL에 들어가기를 바랍니다.
Adám

@ Adám Haha 실제로 호출됩니다. 혼란스러워하는 용어
Conor O'Brien


2

Japt , 19 16 10 9 7 바이트

k ®w3Ã×

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

설명

 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

아, JS는 Japt와 묶여 있습니다. 확실한 해결책은 훨씬 더 짧은 해결책이 있다는 것입니다. ;-)
ETHproductions

힌트 : (또는 그냥 )에 ×대한 바로 가기입니다 . 도 있습니다 이다 . r@X*Y}1r*1XwYMath.max(X,Y)
ETHproductions

감사하지만 재귀 솔루션은 실제로 가장 짧습니다.
Luke

좋은 것! k m_w3Ã×바이트를 절약하기 위해 할 수 있다고 생각합니다 . 또한 m_로 단축 될 수 있습니다 ®.
Oliver


2

CJam, 10 9 바이트

rimf1f|:*

정말 간단합니다.

설명:

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

헥사 고니 , 28 27 26 바이트

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

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

배치 :

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

이것은 기본적으로 다음을 실행합니다.

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

이 시점에서 바이트를 최소화하기 위해 루프 경로를 얻을 수있는 방법에 대한 연습입니다.


글쎄, 난 생각하지 않았다
Manfred Radlwimmer

1
@ManfredRadlwimmer 걱정하지 마십시오. Hexagony로 코딩하는 것은 그 자체로 성취됩니다
Jo King



1

R, 42 바이트

답변에서 유일하게 올바른 바이트 수.

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

매우 간단하고 gmp패키지를 사용하여 인수 분해 x하고 2를 3으로 바꾸고 제품을 반환합니다.


1

Befunge-93 , 20 바이트

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

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

& - 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

펄 6 , 14 바이트

{1.5**.lsb*$_}

lsb 는 오른쪽에서 카운트 된 최하위 비트의 위치를 ​​반환합니다. 즉, 이진 표현에서 후행 0의 수는 2의 요소 수와 같습니다. 따라서 3/2를 그 거듭 제곱으로 올립니다.

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.