ちょっと上へ!


26

整数Nを指定して、次の手順を実行します(例として9を使用)。

  1. 入力Nを受信します。(9
  2. Nをbase10からbase2に変換します。(1001
  3. すべてのビットを1ずつ増やします(2112
  4. 結果をbase3として扱い、それをbase10に変換します。(68
  5. 結果を返す/出力します。

入力

合理的な番号形式で受け取ることができます。
N> 0の場合のみ処理する必要があります。


出力

数値または文字列として返すか、に出力しstdoutます。


ルール

  • これはで、バイト単位の最短コードが勝ちです。
  • デフォルトの抜け穴は禁止されています。

テストケース

1 -> 2
2 -> 7
5 -> 23
9 -> 68
10 -> 70
20 -> 211
1235 -> 150623
93825 -> 114252161

回答:


15

Python 2、31バイト

f=lambda n:n and 3*f(n/2)+n%2+1

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


3
これがどのように機能するか説明してもらえますか?

+n%2+1戻り値の右端のバイナリビットに1を加え、加算n/2右シフトn1つのバイナリビットによって、3*f(n/2)再帰的にこれらの右シフトビットに3回この計算は、追加の、そしてn and場合再帰を終了n0
Noodle9

11

x>>1と同じx/2ですか?
mbomb007

@ mbomb007私はまだ同じことを考えて提案しましたが、明らかInfinityにJS になります。オンラインで試してみてください。(回答にTIOリンクを追加することをお勧めします、I4m2
ケビンクルーイッセン

2
@ mbomb007 No. 1>>1=0while1/2=0.5
l4m2

4
@ mbomb007 ... Python?
user202729

2
うん。Pythonの答えを見てください。それがその中にn/2働く理由であり、私がここで提案した理由です。
mbomb007

9

Java(JDK 10)、44バイト

long n(long x){return x<1?0:x%2+1+3*n(x/2);}

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


1
たぶん-~助けますか?
user202729

2
いいえ、優先ルール。
user202729

あなたへの同じ質問:なぜlong?:)そして、ここで私のシーケンスアプローチは賢明だと思った.. 5分未満であなたはそれを公園から吹き飛ばした..>。>: '(
ケビンクルーッセン

...あなたと公平に@KevinCruijssen
user202729


6

J、7バイト

3#.1+#:

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

Galen Ivanovに-4バイトをありがとう!私は本当にJゴルフのスキルを向上させる必要があります...


1
7バイト:3#.1+#: TIO
ガレンイワノフ

また、テンプレートのおかげで、私は何かについて学ぶ必要があります: 0
user202729

テンプレートは私のものではありません。誰がその作者かを忘れていました。
ガレンイワノフ

2
それは私だろう:)
コナーオブライエン

6

R55 43バイト

function(n)(n%/%2^(x=0:log2(n))%%2+1)%*%3^x

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

Rで標準の基本変換トリックを使用し、増分し、その後3、整数に戻すためのべき乗の内積を使用します。

12バイトをドロップしてくれた@ user2390246に感謝します!


バイナリへの変換は最終出力ではないため、数字の順序は重要ではありません。したがって、floor(log(n)):0の代わりに0:log(n)を実行して、いくつかのバイトを保存できます。43バイト
-user2390246

@ user2390246もちろん、ありがとう。
ジュゼッペ


6

Java 10、81 52バイト(基本変換)

n->n.toString(n,2).chars().reduce(0,(r,c)->r*3+c-47)

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

@Holgerのおかげで-29バイト。

説明:

n->{                         // Method with Long as both parameter and return-type
  n.toString(n,2)            //  Convert the input to a Base-2 String
  .chars().reduce(0,(r,c)->  //  Loop over its digits as bytes
    r*3+c-47)                //  Multiply the current result by 3, and add the digit + 1
                             //  (which is equal to increasing each digit by 1,
                             //  and then converting from Base-3 to Base-10)

Java 10、171 167 151 150 149バイト(シーケンス)

n->{int t=31-n.numberOfLeadingZeros(n);return a(t+1)+b(n-(1<<t));};int a(int n){return--n<1?n+2:3*a(n)+1;}int b(int n){return n<1?0:n+3*b(n/=2)+n*2;}

-16のおかげバイト@ musicman523を変更すること、(int)Math.pow(2,t)(1<<t)
-1バイト、@ Holgerのおかげで、に変更さ(int)(Math.log(n)/Math.log(2))れました31-n.numberOfLeadingZeros(n)

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

説明:

n->{                         // Method with Integer as both parameter and return-type
  int t=31-n.numberOfLeadingZeros(n);
                             //  2_log(n)
  return a(t+1)              //  Return A060816(2_log(n)+1)
         +b(n-(1<<t));}      //   + A005836(n-2^2_log(n))

// A060816: a(n) = 3*a(n-1) + 1; a(0)=1, a(1)=2
int a(int n){return--n<1?n+2:3*a(n)+1;}

// A005836: a(n+1) = 3*a(floor(n/2)) + n - 2*floor(n/2).
int b(int n){return n<1?0:n+3*b(n/=2)+n*2;}

シーケンスを見ると:

2,  7,8,  22,23,25,26,  67,68,70,71,76,77,79,80,  202,203,205,206,211,212,214,215,229,230,232,233,238,239,241,242, ...

複数のサブシーケンスを見ることができます:

A053645(n):
0,  0,1,  0,1,2,3,  0,1,2,3,4,5,6,7,  0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,  ...

A060816(A053645(n)):
2,  7,7,  22,22,22,22,  67,67,67,67,67,67,67,67,  202,202,202,202,202,202,202,202,202,202,202,202,202,202,202,  ...

A005836(A053645(n)+1)
0,  0,1,  0,1,3,4,  0,1,3,4,9,10,12,13,  0,1,3,4,9,10,12,13,27,28,30,31,36,37,39,40,  ...

したがって、要求されるシーケンスは次のとおりです。

A060816(A053645(n)) + A005836(A053645(n)+1)

私は誇りに思って、私が上に見つけたもののよので、私は、言って...、パターンを見つけることで吸うuser202729 @見つかっJavaでより良いと短いアプローチを ...数分以内: '(


n.toString(n,2).getBytes()...私手動変換が短くなると思います。
user202729

1
ところで、なぜlongありませんかint
user202729

1
私はあなたが出て変更することができ、シーケンスバージョンで考える(int)Math.pow(2,t)ために1<<t...そして、インライン表現ということと、変数i(ドロップ152バイト
musicman523

1
実際31-Integer.numberOfLeadingZeros(n)には(int)(Math.log(n)/Math.log(2))、代わりにを使用しますが、短くはありません。import staticヘッダーで使用しない限り、ルールを拡張しすぎる可能性があります。
ホルガー

1
最初の亜種のループをストリームソリューションに変換しようとしましたが、成功しましたn -> n.toString(n,2).chars().reduce(0,(r,c)->r*3+c-47)
Holger





3

アタッシュ、19バイト

FromBase&3@1&`+@Bin

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

これは、3つの機能の組み合わせです。

  • FromBase&3
  • 1&`+
  • Bin

これは、最初にバイナリ(Bin)に変換し、インクリメント(1&`+)してから、3進数(FromBase&3)に変換します。

代替案

非ポイントフリー、21バイト: {FromBase[Bin!_+1,3]}

組み込みなし、57バイト: Sum@{_*3^(#_-Iota!_-1)}@{If[_>0,$[_/2|Floor]'(1+_%2),[]]}


3

Retina 0.8.2、36バイト

.+
$*
+`^(1+)\1
$1;1
^
1
+`1;
;111
1

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

.+
$*

10進数から単項に変換します。

+`^(1+)\1
$1;1

2ずつ繰り返しdivmodし、モジュロの結果に1を加算します。

^
1

最初の桁にも1を追加します。

+`1;
;111

単項エンコードされたベース3から単項に変換します。

1

10進数に変換します。


3

Japt、6バイト

¤cÄ n3
¤      // Convert the input to a base-2 string,
 c     // then map over it as charcodes.
  Ä    // For each item, add one to its charcode
       // and when that's done,
    n3 // parse the string as a base 3 number.

入力を数値として受け取り、数値を出力します。

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


畜生!なぜ私はそれを考えなかったのですか?よくできました。
シャギー

3

MATL12 7 6バイト

BQ3_ZA

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

Giuseppeのおかげで5バイト、Luis Mendoのおかげで5バイト節約できました。

古い7バイトの回答:

YBQc3ZA

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

説明:

YB        % Convert to binary string
  Q       % Increment each element
   c      % Convert ASCII values to characters
    3     % Push 3
     ZA   % Convert from base 3 to decimal.

12バイト用の古いもの:

BQtz:q3w^!Y*

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

ああ、それは面倒だった...だからこれは: `BQ3GBn:q ^!Y *。

説明:

               % Implicit input
B              % Convert to binary vector
 Q             % Increment all numbers
  t            % Duplicate
   z           % Number of element in vector
    :          % Range from 1 to that number
     q         % Decrement to get the range from 0 instead of 1
      3        % Push 3
       w       % Swap order of stack
        ^      % Raise 3 to the power of 0, 1, ...
         !     % Transpose
          Y*   % Matrix multiplication
               % Implicit output

3

C#(Visual C#コンパイラ)、128バイト

using System;using System.Linq;i=>{int z=0;return Convert.ToString(i,2).Reverse().Select(a=>(a-47)*(int)Math.Pow(3,z++)).Sum();}

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

とをSystem使用しているためConvert、カウントしていますMath


Selectは、オプションのパラメーターとしてインデックスを提供します。したがって、z変数を取り除くことができます。また、式の本文では{}およびreturnステートメントを削除できます。このようなものn=>Convert.ToString(n,2).Reverse().Select((x,i)=>(x-47)*Math.Pow(3,i)).Sum();
-NtFreX


2

C、32 27バイト

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

user202729のJava 回答に基づきますこちらからオンラインでお試しください。5バイトのゴルフをしてくれたKevin Cruijssenに感謝します。

ゴルフされていないバージョン:

n(x) { // recursive function; both argument and return type are implicitly int
    x = // implicit return
    x ? x % 2 + 1 + 3*n(x/2) // if x != 0 return x % 2 + 1 + 3*n(x/2) (recursive call)
    : 0; // else return 0
}

あなたは置き換えることにより、5つのバイトを保存することができreturnx=ようと三元を反転させる!必要はなくなりました:n(x){x=x?x%2+1+3*n(x/2):0;}
ケビンCruijssen

@KevinCruijssenニース。ありがとう!
OOBalance


2

通信ツールボックス付きのオクターブ33 32バイト

@(x)(de2bi(x)+1)*3.^(0:log2(x))'

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

を使用しde2bi、すべての数値をインクリメントして、入力をバイナリベクトルに変換します。適切な累乗の3の垂直ベクトルで行列乗算を行います。1, 3, 9, ...したがって、を明示的に呼び出すことなく合計を取得しsumます。


これは非常に賢い方法ですが、32バイトでこれを行うこともできます。オンラインで試してください!
-Sanchises

また、MATLABを使用すると@(x)base2dec(de2bi(x)+49,3)、27 でも実行できます(MATLABがOctaveよりも寛大な場合はまれです)
18

2

PHP、84 64バイト

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

元のコード

function f($n){$b=decbin($n);echo base_convert($b+str_repeat('1',strlen($b)),3,10);}

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

Cristophのおかげで、php -Rで実行した場合のバイト数が減りました

function f($n){echo base_convert(strtr(decbin($n),10,21),3,10);}

説明

function f($n){
$b=decbin($n);                    #Convert the iteger to base 2
echo base_convert(                  #base conversion PHP function
    $b+str_repeat('1',strlen($b)),  #It adds to our base 2 number
    3,                              #a number of the same digits length
    10);                            #with purely '1's
}

私はプログラミングに行くためのloooogn方法を持って見たときにここで....の存在を全く知らなかったstrtr
フランシスコ・ハーン

1
ウィル!!、ごめんなさい<?="Will do!!"
フランシスコハーン


2

空白、117バイト

[S S S N
_Push_0][S N
S _Duplicate_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_number][T    T   T   _Retrieve][N
S S S N
_Create_Label_OUTER_LOOP][S N
S _Duplicate][S S S T   S N
_Push_2][T  S T T   _Modulo][S S S T    N
_Push_1][T  S S S _Add][S N
T   _Swap][S S S T  S N
_Push_2][T  S T S _Integer_division][S N
S _Duplicate][N
T   S N
_If_0_jump_to_Label_INNER_LOOP][N
S N
S N
_Jump_to_Label_OUTER_LOOP][N
S S N
_Create_Label_INNER_LOOP][S S S T   T   N
_Push_3][T  S S N
_Multiply][T    S S S _Add][S N
T   _Swap][S N
S _Duplicate][N
T   S T N
_If_0_jump_to_Label_PRINT_AND_EXIT][S N
T   _Swap][N
S N
N
_Jump_to_Label_INNER_LOOP][N
S S T   N
_Create_Label_PRINT_AND_EXIT][S N
T   _Swap][T    N
S T _Output_integer_to_STDOUT]

強調表示としてのみ追加される文字S(スペース)、T(タブ)、およびN(改行)。
[..._some_action]説明としてのみ追加。

オンラインで試す(未加工のスペース、タブ、改行のみ)。

擬似コードの説明:

最初に、再帰関数int f(int n){return n<1?0:n%2+1+3*f(n/2);}を反復形式(擬似コード)に変換しました。

Integer n = STDIN as integer
Add starting_value 0 to the stack
function OUTER_LOOP:
  while(true){
    Add n%2+1 to the stack
    n = n/2
    if(n == 0):
      Jump to INNER_LOOP
    Else:
      Jump to next iteration OUTER_LOOP

function INNER_LOOP:
  while(true){
    n = 3*n
    n = n + Value at the top of the stack (the ones we calculated with n%2+1)
    Swap top two items
    Check if the top is now 0 (starting value):
      Jump to PRINT_AND_EXIT
    Else:
      Swap top two items back
      Jump to next iteration INNER_LOOP

function PRINT_AND_EXIT:
  Swap top two items back
  Print top to STDOUT as integer
  Exit program with error: Exit not defined

そして、この反復アプローチをデフォルトのスタックを使用して、スタックベースの言語Whitespaceに実装しました。

実行例:

入力: 1

Command    Explanation                   Stack           Heap    STDIN   STDOUT   STDERR

SSSN       Push 0                        [0]
SNS        Duplicate top (0)             [0,0]
SNS        Duplicate top (0)             [0,0,0]
TNTT       Read STDIN as integer         [0,0]           {0:1}   1
TTT        Retrieve                      [0,1]           {0:1}
NSSSN      Create Label OUTER_LOOP       [0,1]           {0:1}
 SNS       Duplicate top (1)             [0,1,1]         {0:1}
 SSSTSN    Push 2                        [0,1,1,2]       {0:1}
 TSTT      Modulo top two (1%2)          [0,1,1]         {0:1}
 SSSTN     Push 1                        [0,1,1,1]       {0:1}
 TSSS      Add top two (1+1)             [0,1,2]         {0:1}
 SNT       Swap top two                  [0,2,1]         {0:1}
 SSSTSN    Push 2                        [0,2,1,2]       {0:1}
 TSTS      Int-divide top two (1/2)      [0,2,0]         {0:1}
 SNS       Duplicate top (0)             [0,2,0,0]       {0:1}
 NTSN      If 0: Go to Label INNER_LOOP  [0,2,0]         {0:1}
 NSSN      Create Label INNER_LOOP       [0,2,0]         {0:1}
  SSSTTN   Push 3                        [0,2,0,3]       {0:1}
  TSSN     Multiply top two (0*3)        [0,2,0]         {0:1}
  TSSS     Add top two (2+0)             [0,2]           {0:1}
  SNT      Swap top two                  [2,0]           {0:1}
  SNS      Duplicate top (0)             [2,0,0]         {0:1}
  NTSTN    If 0: Jump to Label PRINT     [2,0]           {0:1}
  NSSTN    Create Label PRINT            [2,0]           {0:1}
   SNT     Swap top two                  [0,2]           {0:1}
   TNST    Print top to STDOUT           [0]             {0:1}           2
                                                                                  error

オンラインで試してください(未加工のスペース、タブ、改行のみ)。
エラーで停止します:終了が定義されていません。

入力: 4

Command    Explanation                   Stack           Heap    STDIN   STDOUT   STDERR

SSSN       Push 0                        [0]
SNS        Duplicate top (0)             [0,0]
SNS        Duplicate top (0)             [0,0,0]
TNTT       Read STDIN as integer         [0,0]           {0:4}   4
TTT        Retrieve                      [0,4]           {0:4}
NSSSN      Create Label OUTER_LOOP       [0,4]           {0:4}
 SNS       Duplicate top (4)             [0,4,4]         {0:4}
 SSSTSN    Push 2                        [0,4,4,2]       {0:4}
 TSTT      Modulo top two (4%2)          [0,4,0]         {0:4}
 SSSTN     Push 1                        [0,4,0,1]       {0:4}
 TSSS      Add top two (0+1)             [0,4,1]         {0:4}
 SNT       Swap top two                  [0,1,4]         {0:4}
 SSSTSN    Push 2                        [0,1,4,2]       {0:4}
 TSTS      Int-divide top two (4/2)      [0,1,2]         {0:4}
 SNS       Duplicate top (2)             [0,1,2,2]       {0:4}
 NTSN      If 0: Go to Label INNER_LOOP  [0,1,2]         {0:4}
 NSNSN     Jump to Label OUTER_LOOP      [0,1,2]         {0:4}
 SNS       Duplicate top (2)             [0,1,2,2]       {0:4}
 SSSTSN    Push 2                        [0,1,2,2,2]     {0:4}
 TSTT      Modulo top two (2%2)          [0,1,2,0]       {0:4}
 SSSTN     Push 1                        [0,1,2,0,1]     {0:4}
 TSSS      Add top two (0+1)             [0,1,2,1]       {0:4}
 SNT       Swap top two                  [0,1,1,2]       {0:4}
 SSSTSN    Push 2                        [0,1,1,2,2]     {0:4}
 TSTS      Int-divide top two (2/2)      [0,1,1,1]       {0:4}
 SNS       Duplicate top (1)             [0,1,1,1,1]     {0:4}
 NTSN      If 0: Go to Label INNER_LOOP  [0,1,1,1]       {0:4}
 NSNSN     Jump to Label OUTER_LOOP      [0,1,1,1]       {0:4}
 SNS       Duplicate top (1)             [0,1,1,1,1]     {0:4}
 SSSTSN    Push 2                        [0,1,1,1,1,2]   {0:4}
 TSTT      Modulo top two (1%2)          [0,1,1,1,1]     {0:4}
 SSSTN     Push 1                        [0,1,1,1,1,1]   {0:4}
 TSSS      Add top two (1+1)             [0,1,1,1,2]     {0:4}
 SNT       Swap top two                  [0,1,1,2,1]     {0:4}
 SSSTSN    Push 2                        [0,1,1,2,1,2]   {0:4}
 TSTS      Int-divide top two (1/2)      [0,1,1,2,0]     {0:4}
 SNS       Duplicate top (0)             [0,1,1,2,0,0]   {0:4}
 NTSN      If 0: Go to Label INNER_LOOP  [0,1,1,2,0]     {0:4}
 NSSN      Create Label INNER_LOOP       [0,1,1,2,0]     {0:4}
  SSSTTN   Push 3                        [0,1,1,2,0,3]   {0:4}
  TSSN     Multiply top two (0*3)        [0,1,1,2,0]     {0:4}
  TSSS     Add top two (2+0)             [0,1,1,2]       {0:4}
  SNT      Swap top two                  [0,1,2,1]       {0:4}
  SNS      Duplicate top (1)             [0,1,2,1,1]     {0:4}
  NTSTN    If 0: Jump to Label PRINT     [0,1,2,1]       {0:4}
  SNT      Swap top two                  [0,1,1,2]       {0:4}
  NSNN     Jump to Label INNER_LOOP      [0,1,1,2]       {0:4}
  SSSTTN   Push 3                        [0,1,1,2,3]     {0:4}
  TSSN     Multiply top two (2*3)        [0,1,1,6]       {0:4}
  TSSS     Add top two (1+6)             [0,1,7]         {0:4}
  SNT      Swap top two                  [0,7,1]         {0:4}
  SNS      Duplicate top (1)             [0,7,1,1]       {0:4}
  NTSTN    If 0: Jump to Label PRINT     [0,7,1]         {0:4}
  SNT      Swap top two                  [0,1,7]         {0:4}
  NSNN     Jump to Label INNER_LOOP      [0,1,7]         {0:4}
  SSSTTN   Push 3                        [0,1,7,3]       {0:4}
  TSSN     Multiply top two (7*3)        [0,1,21]        {0:4}
  TSSS     Add top two (1+21)            [0,22]          {0:4}
  SNT      Swap top two                  [22,0]          {0:4}
  SNS      Duplicate top (0)             [22,0,0]        {0:4}
  NTSTN    If 0: Jump to Label PRINT     [22,0]          {0:4}
  NSSTN    Create Label PRINT            [22,0]          {0:4}
   SNT     Swap top two                  [0,22]          {0:4}
   TNST    Print top to STDOUT           [0]             {0:4}           22
                                                                                  error

オンラインで試してください(未加工のスペース、タブ、改行のみ)。
エラーで停止します:終了が定義されていません。


この時点で、アセンブリを作成してみませんか?また、私は私の答えの中に少し単純反復法持つcodegolf.stackexchange.com/a/161833/17360
QWR

python擬似コードをさらに簡略化しました。
-qwr

1
@qwr Pythonコードは、表示されたJavaコードとほぼ同じです。Javaは、より冗長でエラーが発生しやすくなっています。唯一の違いは、私のJavaコードはネストされたwhileループであり、ユーザーのコードは分離されていることです。Javaでも同様に行うことができますが、Wh​​itespaceにネストされているため、Java疑似コードにもそのように記述することを選択しました。また、ホワイトスペースにはスタックに残っているアイテムの数を知る方法がありません。そのため、最初に0をプッシュします。コードのINNER_LOOP部分では、スワップ、0のチェック、スワップバックを行います。しかし、素晴らしいアセンブリの答え。だから私はそれを+1した。:)
ケビンクルイッセン

私はまだn < 1、nが0になるまで値をプッシュし、境界値(0)になるまでそれらをポップすることでチェックを取り除くことができると思います。スタックの深さを明示的に保存する必要はなく、スワップする必要さえありません(lispのように上位2つの値をスワップすることを意味する場合)
-qwr

@qwr " nが0になるまで値をプッシュすることで、n <1チェックを取り除くことができるとまだ思っています。Umm .. 0になるまで値をプッシュするn < 1(またはn == 0)かどうかをチェックしnます。 「スタックの深さを明示的に保存する必要はありません」Javaではそうです。そうしないと、配列を作成できません。java.util.Stack代わりにaを使用することもできますが、配列を使用して冗長性を減らしました。ホワイトスペースでは、スタックのサイズは未定義です。
ケビンCruijssen






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