2を3に置き換えます


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には文字通り1つのビルトインしかありませんが、たまたまこのタスクが要求していることを正確に実行します。(それ自体もチューリング完全です。)

この言語には、標準化された構文またはインタープリターが実際にはありません。このインタープリター(ブログ投稿へのコメント-非常にシンプルな言語)は、ここに示す構文を受け入れます。(他の構文を持つ他のFractranインタープリターがあります。たとえば、このプログラムをとして3 2、またはコマンドライン引数として使用して3、さらに20 + 3バイトのスコアを作成するプログラムもあります。ただし、既存のインタプリタ。)

説明

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

10
作業に適したツールについての話...
ケビンCruijssen

23
「単純なビルトインのみを使用する単純なソリューションに賛成しないでください。」さて、この場合:この特定のタスクを解決する単一のビルトインを持つ言語「Fractran」があることを知ること自体が印象的です。
スチューウィーグリフィン

3
関連するSOコードゴルフ(PPCG以前):Fractranインタープリターを作成します。
ホッブズ

1
@AnderBiguri:実装が非常にシンプルで簡単なチューリング完全言語を探している可能性があります。チューリングターピットが進むにつれて、フラクトランは本当にエレガントです。多くの場合、大きな違いを生むことなく変更できる、より粗いエッジ、特殊なケース、または詳細があります。

3
@AnderBiguri Collat​​z予想の彼の研究から出てきたようです。彼は、Collat​​zの一般化はFractranと同等であり、Fractranはチューリング完全であるため、一般化されたCollat​​zは決定不能であることを証明しました。
ホッブズ

21

Python 2、28バイト

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

オンラインでお試しください!

数値が偶数である限り、数値を再帰的に2で除算し、結果に3を乗算します。奇数は自分自身を返します。

32バイトalt:

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

オンラインでお試しください。いくつかのフロートエラーがあります。定数はlog_2(3)-1です。

使用(n&-n)の最大電力の-2要因を見つけるためにn改宗し、3**k2**kのパワーにそれを上げることによってlog_2(3)-1


これはまさに私の解決策です!
小麦ウィザード

@WheatWizard私も、ああ!
グラビトン

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を打ちます。(
HyperNeutrino

5
@HyperNeutrino:私もそれに気付きました:「デニスが05AB1Eを使用しているのはなぜですか?ああ、同一のアルゴリズム、短い組み込み名」。そこで、より適切な組み込みのセットを使用して、さらに少ないバイトでそれを実行できる言語を見つけなければなりませんでした。

14

Haskell、24 23バイト

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

Haskellで奇妙なトリックになるまで2で除算し、3で乗算します。

オンラインでお試しください!

pointfree関数の代わりにラムダを使用し、同じバイトカウントを使用する方法:

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

編集:@ ais523は元のバージョンでバイトを保存し、@ØrjanJohansenは代替バージョンで1バイトを保存したため、両方のバージョンの長さは同じままです。ありがとう!


3
ラムダバージョンはに短縮できますodd`until`\x->div(x*3)2
Ørjanヨハンセン

2
元のバージョンは$、1組の括弧を置き換えることで1バイト短縮することもできます。オンラインで試してみてください!

@ØrjanJohansen:ああ、いいね!ありがとう。
-nimi

@ ais523:どうしてそれを見逃してしまったのでしょう、ありがとう!
-nimi

2
()ラムダバージョンからペアを削除するのを忘れたと思う
-CAD97

8

JavaScript(ES6)、19バイト

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

入力は2で割り切れますが、1.5で乗算します。これは、2で除算し、3で乗算するのと同じです。


2
x*3/2同じ:バイトあり
漏洩修道女

1
f=通常、jsには必要ありません。
クリストフ

3
おかげで@Christophが、それ自体を呼び出すためにf(x*1.5)、それは名前を持つ必要があるfので、なぜ、f=含まれています。
ETHproductions

@ETHproductionsうーん...もちろん!私は逃しました。呼び出し元のコードが正確にどのように見えるかについてのメタはありますか?
クリストフ

2
@Christoph 関連するメタ投稿はこちらです。
ETHproductions

8

Brain-Flak、76バイト

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

オンラインでお試しください!

説明

このプログラムは、数値を2で除算し、除算から1の残りを取得するまで3倍することで機能します。次に、ループを停止し、2倍して、最終番号に1を追加します。

最終的に詳細な説明...


>近日公開予定
ウィートウィザード

7

Mathematica、22 19バイト

3バイトを節約してくれたlanlock4に感謝します!

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

一度に2分の1の係数で繰り返し置換を行う純粋な機能。2 65537未満のすべての正の整数で動作します。


x_?EvenQの代わりに働きますかx_/;EvenQ@x
木ではない

1
あなたはまったく正しい、ありがとう!
グレッグマーティン



6

アリス、9バイト

2/S 3
o@i

オンラインでお試しください!

アリスには、数値の約数を別の数で置き換えるためのビルトインがあります。私は実際にすぐにそれを利用できるようになるとは思わなかった...

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
あなたの強迫観念は公式に確認されています。
リーキー修道女

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は、唯一の偶数で最小の素数です。
デニス

@デニスなるほど。はい、今入手しました。ありがとう!:)
HyperNeutrino

ゼリーの学習おめでとうございます。
リーキー修道女

@LeakyNunありがとう!そして教えてくれてありがとう。:)
HyperNeutrino

この回答おめでとうございます!
エリックアウトゴルファー

4

パイス-14 10 9バイト

*^1.5/PQ2

素因数分解(/ PQ2)の2の数をカウントします。入力に1.5 ^(#of 2s)を乗算します

それを試してみてください


興味深いアプローチ-残念ながら、既存のPythソリューションほど短くはありません。
エソランジングフルーツ

@ Challenger5ここには他のPythソリューションは見当たりません。
マリア

1
あ、ならいいですよ。このチャレンジの典型的なアプローチよりも興味深いアプローチです。
エソランジングフルーツ


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

読みやすくするためのゴルフバージョン:

非ゴルフ

おおよそのメモリレイアウト

ここに画像の説明を入力してください

グレーパス(メモリの初期化)

?     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へようこそ!:)
マーティンエンダー

@MartinEnderありがとう、素晴らしい言語です。:)
マンフレッドラドルウィマー

1
使ってくれてありがとう!:)計算し%2:2両方を「モジュロ」エッジに入れた場合、メモリレイアウト(およびそのために必要な移動量)を単純化できませんか?(したがって、上の2つのエッジを取り除くことができます。)それから、「乗算器」ブランチを「除数」エッジの代わりに「モジュロ」エッジにアタッチして、各ブランチ後の移動を少なくすることができますか?(場合によってはそのセクションを回転させて、「結果」または「一時2」が「モジュロ」に触れるようにすることもできます。つまり、製品を計算する前に最終結果を1回コピーするだけです。)
Martin Ender

おそらく@MartinEnder Uhhhm。私はまだ言語の「
苦g


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

J15 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ああ、ハハ。いい答えだ!rollここで使用する機会に抵抗できませんでした。:)
コナーオブライエン

実際には、さらにいくつかのバイトを保存できるかもしれません... いくつかの保存された編集:D
コナーオブライエン

おかしいあなたはそれをロールと呼びます、私はそれをアンダーと呼びます。すぐにそれをAPLに入れることを望みます。
アダム

@AdámHahaそれは実際に呼ばれています。用語が混同された
コナーオブライエン


2

Japt19 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と結びついています。確かな兆候ははるかに短い解決策です
;

ヒント:(または単に)の×ショートカットで、便利な場合があります。もあります。r@X*Y}1r*1XwYMath.max(X,Y)
ETHproductions

再帰的な解決策は本当に最短ですが、ありがとうございます。
ルーク

良いですね!k m_w3Ã×バイトを節約するためにできると思います。また、m_に短縮できます®
オリバー


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

この時点では、バイトを最小化するためにループパスを取得する方法についての課題です。


まあ、私はそれを考えていませんでした
マンフレッドラドルウィマー

1
@ManfredRadlwimmerない心配は、Hexagonyでコーディングものはそれ自体が成果である
ジョー・キング



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

Perl 6、14バイト

{1.5**.lsb*$_}

lsbは、右から数えて最下位ビットの位置を返します。つまり、バイナリ表現の末尾のゼロの数です。これは、2の因数の数と同じです。したがって、3/2を累乗し、これで完了です。

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.