A190810を計算する


27

タスクは非常に簡単で、A190810の n番目の要素を計算します。

A190810の要素は、次の規則に従って計算されます。

  1. 最初の要素は1です
  2. シーケンスは増加しています
  3. xシーケンス内で発生する場合、2x+1そして3x-1また行う

1ベースまたは0ベースのインデックスを使用できますが、0ベースのインデックスを使用する場合は、回答でそれを言ってください。

テストケース

a(1) = 1
a(2) = 2
a(3) = 3
a(4) = 5
a(5) = 7
a(10) = 17
a(20) = 50
a(30) = 95
a(55) = 255

これはコードゴルフなので、バイト単位の最短回答が勝ちです!


2
より大きなテストケースを追加する必要があります。
mbomb007

7
これをもう少し明確に説明できますか?私は英語を母国語としてますが、「... xがaの場合、2x + 1と3x-1がaの場合」とはわかりません。意味することになっています。

1
@cat x ϵ A → (2*x) + 1 ϵ Ax ϵ A → (3*x)-1 ϵ Aϵ手段「のメンバーである」と「意味」として理解することができます。
スティーブンH.

3
暗黙の条件:シーケンスには、他のルールで必要とされていない数字が含まれていません。(それ以外の場合、$ a(i)= i $は有効なシーケンスになります)
スティグヘマー

1
そして、無料のMathematicaとHaskellの回答を取得してから開始します:)
ハーミングモニカの停止

回答:


9

ゼリー、16 バイト

×3’;Ḥ‘$;
1Ç¡ṢQ³ị

非常に非効率的です。オンラインでお試しください!

使い方

1Ç¡ṢQ³ị   Main link. Argument: n (integer)

1         Set the return value to 1.
 Ç¡       Execute the helper link n times.
   Ṣ      Sort the resulting array.
    Q     Unique; deduplicate the sorted array.
     ³ị   Retrieve its n-th element.


×3’;Ḥ‘$;  Helper link. Argument: A (array)

×3        Multiply all elements of A by 3.
  ’       Decrement the resulting products.
      $   Combine the two links to the left into a monadic chain.
    Ḥ     Unhalve; multiply all elements of A by 2.
     ‘    Increment the resulting products.
   ;      Concatenate 3A-1 and 2A+1.
       ;  Concatenate the result with A.

1
それは16 文字かもしれませんが、私は30 バイト未満でそれを表すエンコーディングを知りません。
リッチリマー16

18
Jellyには、これらの文字をそれぞれ1バイトにすることができる独自のコードページがあります。

15

Python 2、88 83 72バイト

この答えのプログラムを逆順で読みたいかもしれません...

デニスのおかげで、まだゆっくりと短くなっています。

L=1,;exec'L+=2*L[0]+1,3*L[0]-1;L=sorted(set(L))[1:];'*input()
print L[0]

オンラインで試す


これは高速ではありませんが、短くなります(83バイト)。各反復ごとに重複をソートおよび削除し、最初の要素を削除することで、リストへのインデックスの必要性を取り除きます。結果は、単に後の最初の要素ですn反復ません。

デニスをゴルフアウトしたかもしれません。:D

L=[1]
n=input()
while n:L+=[2*L[0]+1,3*L[0]-1];n-=1;L=sorted(set(L))[1:]
print L[0]

オンラインで試す


以下のこのバージョン(88バイト)は非常に高速で実行され、約2秒で500000番目の要素を見つけます。

とても簡単です。リストの要素を、要素の3倍になるまで計算しますn追加されるすべての要素は最大で2個の一意の要素を追加できるため。次に、重複を削除し、nth要素を並べ替えて出力します(ゼロインデックス)。

L=[1]
i=0
n=input()
while len(L)<3*n:L+=[2*L[i]+1,3*L[i]-1];i+=1
print sorted(set(L))[n]

オンラインで試す


8

Python 2、59バイト

t={1}
exec'm=min(t);t=t-{m}|{2*m+1,3*m-1};'*input()
print m

@ mbomb007のPython回答に基づきますIdeoneでテストします。


「単にデニスのアウトゴルフではありません」...セットリテラルを使用することを考えたいと思います。今ではとても明白なようです。文字列の実行から実際のコードに変更した場合、この答えは私の「高速」プログラムよりもさらに高速ですか?
mbomb007

いや。遅いです。集合演算はより高価です。
mbomb007

うん、minあるO(n)のリストのインデックス付けはあるがO(1) 、この溶液は、少なくともあるので、O(n²) ...
デニス・

8

Haskell、76 73 69バイト

a#b=mod a b<1&&t(div a b)
t x=x<2||(x-1)#2||(x+1)#3
(filter t[1..]!!)

0ベースのインデックスを使用します。使用例:(filter t[1..]!!) 54-> 255

代わりに繰り返し挿入することで、リストを構築する2x+1と、3x-1ほとんどの他の回答に見られるように、私はすべての整数を通過し、それらが軽減できるかどうか確認1を繰り返し適用することによって、(x-1) / 2あるいは(x+1) / 3割り切れる場合。


それは実際には関数や有効なコードスニペットを定義していませんか?
ゼータ

@Zeta最後の行は、名前のない関数に評価されます。
ズガルブ

@ZgarbこれはHaskellファイルのエラーであり、この種の機能をサポートしていることを私が認識しているインタープリターはありません。だから、私に教えてください、ユーザーはどのようにして上記のコード変更せずにこれを使用することになっていますか?または、この種のコードを許可するメタ投稿を教えていただけますか?
ゼータ

2
@Zgarb最後の行については、バインディングに割り当てると思います(などf=filter t[1..]!!)。これは正しいとは思わないからです。
TuxCrafting

1
@TùxCräftîñg このメタ投稿では、この状況ではデフォルトで追加のヘルパー関数が受け入れられると判断されました。これは、Haskellの回答でよく見られる形式です。もちろん、チャレンジ作成者としてのあなたには最終的な権限があります。
ズガルブ

7

ハスケル、 77 74バイト

import Data.List
i=insert
f(x:y)=x:f(i(2*x+1)$i(3*x-1)y)
a=(!!)(nub$f[1])

これはa、n番目のエントリに機能を提供します。インデックスはゼロです。または、a=nub$f[1]リスト全体を(怠lazに)作成します。

これは、ラインハルトツムケラーのSetコードのリストバリアントです。


なぜ2バイトを節約yするのではなくxs?また、私はあなたのような何かに最後の行を削減することができる可能性があると考えている(!!)$nub.f[1]
マイケル・クライン

@MichaelKlein:私は慣れすぎて(x:xs)、それを完全に忘れてしまいました、ありがとう。
ゼータ

6

Python 2、88 84バイト

g=lambda k:g(k%2*k/2)|g(k%3/2*-~k/3)if k>1else k
f=lambda n,k=1:n and-~f(n-g(k),k+1)

Ideoneでテストします。


13
あなたは、シンプルなものを読めないものに変えることに長けています。
mbomb007


5

ブラキログ、45バイト

:1-I,?:?*:1ydo:Im.
1.|:1-:1&I(:3*:1-.;I*:1+.)

N = 1000私のマシンで約6秒で計算します。

これは1から始まり、たとえば

run_from_file('code.brachylog',1000,Z).
Z = 13961 .

説明

  • 主な述語:

    :1-I,               I = Input - 1
         ?:?*           Square the Input
             :1y        Find the first Input*Input valid outputs of predicate 1
                do      Remove duplicates and order
                  :Im.  Output is the Ith element
    
  • 述語1:

    1.                  Input = Output = 1
    |                   Or
    :1-:1&I             I is the output of predicate 1 called with Input - 1 as input
           (            
             :3*:1-.      Output is 3*I-1
           ;            Or
             I*:1+.       Output is 2*I+1
           )
    

を呼び出すときに、述部1に入力を渡さないことに注意してくださいy - Yield。制約の伝播のため1.、正しい入力値を伝播する句に到達すると、正しい入力を見つけます。


4

MATL、19、18の 17バイト

1w:"tEQy3*qvSu]G)

これは非常に非効率的なアルゴリズムです。オンラインインタープリターは、13を超える入力に対してメモリを使い果たします。

Luis Mendoのおかげで1バイト節約できました!

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

このバージョンはより長いですが、より効率的です(21バイト)

1`tEQy3*qvSutnG3*<]G)

オンラインで試す

説明:

論理的な方法は、i番目の要素を取得するのに十分な長さになるまで要素を配列に追加することです。これが効率的な方法です。のゴルフの(そして非効率な)方法は、配列サイズをi回だけ増やすことです。

そのため、最初に開始配列を定義します1。次に、入力が上になるように、上の2つの要素を入れ替えます。w。ここで、入力をループし:"ます。そう私は回:

t             %Duplicate our starting (or current) array.
 EQ           %Double it and increment
   y          %Push our starting array again
    3*q       %Multiply by 3 and decrement
       v      %Concatenate these two arrays and the starting array
        Su    %Sort them and remove all duplicate elements.

これで、シーケンスの巨大な配列ができました。(計算に必要な以上の方法)したがって、ループを停止し、、(1-indexed)で]この配列からi番目の番号を取得しG)ます


@LuisMendoヒントをありがとう!forループの代わりにwhileループでこれをどのように書き換えますか?(たぶん、MATLチャットルームの方が良い質問でしょう)
DJMcMayhem

これは次の方法で実行できます1`tEQy3*qvuStnG<]G)。ループ条件はtnG<(配列に必要なサイズが既にある場合は終了)
ルイスメンド

わからないどのくらいの不正行為、それはですが、中にfor-loopバージョンあなたができる単項で入力を取る文字列としておよび削除:
ルイス・Mendo

4

JavaScript(ES6)、63バイト

 f=(n,a=[1],i=0)=>a[i++]?--n?f(n,a,a[i*2]=a[i*3-2]=1):i:f(n,a,i)

おそらく再帰のためにすぐにgivesめます。


4

網膜、57

^.+
$*¶¶1
¶¶(1(1*))
¶1$1$1¶$2$1$1
O`
}`(¶1+)\1\b
$1
G2`
1

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

0インデックス。頻繁に使用されるアルゴリズムに従います。現在のセットから最小値を削除し、それを呼び出しx、追加2x+1して3x-1入力に等しい回数をセットに、先頭の数字が結果になります。Retinaの「セット」は、繰り返しソートされ、一意の要素のみが含まれるように作成された単なるリストです。ゴルフのアルゴリズムにいくつかの卑劣なビットが追加されています。これについては、もう少し時間ができたら説明します。

約20バイトのゴルフをしてくれたMartinに感謝します!


4

Clojureは、114の 108バイト

#(loop[a(sorted-set 1)n 1](let[x(first a)](if(= n %)x(recur(conj(disj a x)(+(* 2 x)1)(-(* 3 x)1))(inc n)))))

これがかなりの量でゴルフ/削減されても驚くことはありませんが、setn番目をサポートしていないと本当に思考の流れが損なわれます。

オンラインで試す

スペースを含むバージョン:

#(loop [a (sorted-set 1)
        n 1]
  (let [x (first a)]
    (if (= n %)
      x
      (recur (conj (disj a x) (+ (* 2 x) 1) (- (* 3 x) 1)) (inc n))
      )))

4

05AB1E、18 17バイト

CP-1252エンコードを使用します。

$Fз>s3*<)˜Ù}ï{¹è

説明

$                  # initialize with 1
 F          }      # input number of times do
  Ð                # triplicate current list/number
   ·>              # double one copy and add 1
     s3*<          # multiply one copy by 3 and subtract 1
         )˜Ù       # combine the 3 lists to 1 list and remove duplicates
             ï{    # convert list to int and sort
               ¹è  # take the element from the list at index input

少数の場合はオンラインでお試しください

非常に遅い。
0ベースのインデックスを使用します。


3

C ++、102バイト

[](int i){int t;map<int,int>k;for(k[1];i--;k.erase(t))t=k.begin()->first,k[t*2+1],k[t*3-1];return t;};

このラムダ関数が必要とする#include <map>using std::map

mapここでは、キーの単なるコレクションです。それらの値は無視されます。私mapは挿入のための簡潔なコードから利益を得るために使用します:

k[1]; // inserts the key 1 into the map

の並べ替え順序のおかげでmap、によって最小の要素が抽出されk.begin()->firstます。


1
(97)を使用して、わずかに短いsetとリスト初期化子:[](int i){int t;set<int>k{1};for(;i--;k.erase(t))t=*k.begin(),k.insert({t*2+1,t*3-1});return t;};
nwn

3

実際には、27バイト

╗1#╜`;;2*1+)3*1@-#++╔S`n╜@E

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

このプログラムは、0ベースのインデックスを使用します。このアプローチは非常にブルートフォースであるため、より大きな入力に対してオンラインインタープリターで機能するとは思わないでください。

説明:

╗1#╜`;;2*1+)3*1@-#++╔S`n╜@E
╗                            save input (n) in register 0
 1#                          push [1]
   ╜                         push n
    `;;2*1+)3*1@-#++╔S`n     do the following n times:
     ;;                        make two copies of the list
       2*1+                    apply 2x+1 to each element in one copy
           )3*1@-              and 3x-1 to each element in the other copy
                 #             workaround for a weird list bug
                  ++           append those two lists to the original list
                    ╔S         uniquify and sort
                        ╜@E  get the nth element (0-indexed)

2

CJam(25バイト)

ri1a1${{_2*)1$3*(}%_&}*$=

オンラインデモ。これはゼロベースのインデックスを使用することに注意してください。

これは、ほとんどの場合と同様のアプローチを使用します。変換n時間を適用してから、nthアイテムをソートおよび抽出します。効率化のために、重複排除はループ内で適用され、ソートはループ外で適用されます。


2
22:(1ari{(_2*)\3*(@||$}*0=また、はるかに効率的です。)
マーティンエンダー

2

網膜、48バイト

.+
$*
+1`^(((!*)!(!|\3)(?=\3!1))*!)1|\b
!$1
-2`.

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

ニミの答えに触発に、Retinaに別のアプローチを試して、正規表現エンジンのバックトラッキングを使用して、指定された(単項)番号がシーケンスにあるかどうかを判断しようと思いました。これは27バイトの正規表現で決定できることがわかりますが、それを利用するにはさらにいくつかのコストがかかりますが、それでも生成アプローチよりも短くなります。

代替の48バイトソリューションを次に示します。

.+
$*
{`1\b
1!
}T`1``1((!*)!(!|\2)(?=!\2$))*!$
!

そして、単項I / Oを使用すると42バイトできますが、それを回避しようとしています。他のRetinaの回答でも10進数を使用しています。

1\b
1!
}T`1``1((!*)!(!|\2)(?=!\2$))*!$
!
1

2

ルビー、70バイト

->n{a=*1
n.times{a<<a.map{|i|([2*i+1,3*i-1]-a).min||1.0/0}.min}
a[-2]}

説明

->n{
    # Magical, golfy way of initializing an array. Equivalent to a = [1].
    a=*1
    n.times{
        # Generate the next element in the sequence, by...
        a<<
            # ... finding the minimal term that will appear at some point.
            a.map{|i|
                ([2*i+1,3*i-1]-a).min||1.0/0
            }.min
    }
    # We generated n+1 elements, so we'll take the *second* to last one.
    a[-2]
}

1
その*1トリックはきちんとしています
TuxCrafting

1

J、31バイト

{1(]]/:~@~.@,3&*,&:<:2*>:)^:[~]

ゼロベースのインデックスを使用します。非常にメモリ効率が悪い。

説明

{1(]]/:~@~.@,3&*,&:<:2*>:)^:[~]  Input: n
                              ]  Identity function, gets n
 1                               The constant 1
  (                      )^:[~   Repeat n times with an initial array a = [1]
                       >:          Increment each in a
                     2*            Multiply by 2 to get 2a+2
             3&*                   Multiply each in a by 3 to get 3a
                 &:<:              Decrement both x and y to get 2a+1 and 3a-1
                ,                  Join them
    ]                              Identity function, gets a
            ,                      Join a with 2a+1 and 3a-1
         ~.@                       Take the distinct values
     /:~@                          Sort up
   ]                               Return the sorted list
{                                Select the value from the list at index n and return it

1

オクターブ、68バイト

function r=a(n)s=1;for(i=1:n)r=s(i);s=union(s,[r*2+1 r*3-1]);end;end

最終を削除できます;end
ルイスメンドー

使用しているバージョンでは、少なくとも(4.0.0)はできません
...-dcsohl

1

Perl、173 132バイト+1 -n = 133の場合

sub c{my$a=pop;return($a==1||($a%2&&c(($a-1)/2))?1:$a%3!=2?0:$a%3==2?c(($a+1)/3):1)}while($#b<$_){$i++;@b=(@b,$i)if c$i}say$b[$_-1];

ゴルフをしていない:

my @array = ();
my $n = <>;
sub chk {
    my $a = shift;
    return 1 if ($a == 1);
    if ($a % 2 == 0) {
        if ($a % 3 != 2) {
            return 0;
        } else {
            return chk(($a + 1) / 3);
        }
    } else {
        if (chk(($a - 1) / 2) == 0) {
            if ($a % 3 != 2) {
                return 0;
            } else {
                return chk(($a + 1) / 3);
            }
        } else {
            return 1
        }
    }
}
my $i = 1;
while ($#array < $n-1) {
    push(@array,$i) if (chk($i) == 1);
    $i++;
}
print $array[$n];

もっと考えればもっとうまくできるかもしれませんが、これは数分後に思いついたものです。初めてのゴルフなので、これはとても楽しかったです!

-40バイトの@Dadaと@TùxCräftîñg(および多数のマイナーバイト最適化)に感謝します。


1
mys、the return、the の後にスペースをドロップできると思いますprint(テストできません、perlがありません)
-TuxCrafting

1
@TùxCräftîñgはについて正しいreturnです。printで置き換えることができますsay。ほとんどのmyあなたは前に一つだけを必要とする(必要ではない$aと思う機能インチドゥ初期化も宣言しないで@b。あなたは、おそらくの初期化ドロップすることができ$iますがしなければ$i++しばらくの開始時に代わりの終わりに。popさより短いshift。はるかにperlのゴルフにちょうど空白や改行を削除するよりもがあるよりも、心に留めておいてください...
ダダ

0

JavaScript(ES6)、58

n=>(a=>{for(;n;)a[++i]?a[i-~i]=a[3*i-1]=--n:0})([i=0,1])|i

少ないゴルフ

n=>{
  a=[];
  a[1] = 1;
  for(i = 0; n;)
  {
    ++i
    if (a[i])
    {
      a[2*i+1] = 1;
      a[3*i-1] = 1;
      --n;
    }
  }
  return i
}

テスト

時間とメモリについて:FireFox 64ビットアルファで使用される要素20分以内の要素500000および300MB

F=
n=>(a=>{for(;n;)a[++i]?a[i-~i]=a[3*i-1]=--n:0})([i=0,1])|i

function test() {
  var n=+I.value, t0=+new Date
  O.textContent = F(n)
  console.log((+new Date-t0)/1000,'sec')
}  

test()
#I { width:5em}
<input id=I type=number value=10 oninput="test()"> 
<span id=O></span>

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