構築できるキューブの数


20

仕事

あなたの仕事は、個のキューブを持つ構造を構築することです。キューブのボリュームは次のシーケンスに従います(下->上)n

n3,(n1)3,(n2)3,...,13

入力

構造の総体積()。V

出力

()の値、つまり:キューブの総数。n

V=n3+(n1)3+....+13

ノート

  • 入力は常に整数です。
  • シーケンスをたどることができない場合があります。つまり、は特定の値を表しません。その場合、-1または選択した偽の値を返します(ただし、一貫性が必要です)。nVn
  • これはので、各言語のバイト単位の最短回答が勝ちです。
  • 上記の理由により、回答は承認されません。

リクエスト

  • これはこのサイトでの私の最初の挑戦ですので、私と一緒に我慢し、私が犯した間違いを許してください(そして私に教えてください)。
  • コードをテストできるように、リンクを提供してください。
  • できれば、他の人があなたの仕事を理解して感謝できるように、あなたのコードがどのように動作するかについての説明を親切に書いてください。

input  : 4183059834009
output : 2022

input  : 2391239120391902
output : -1

input  : 40539911473216
output : 3568

これへのリンクを提供してくれた@Arnauldに感謝します。

いいじゃないですか。

オリジナルへのリンク:リンク


2
これはうまく書かれた最初の挑戦です。ただし、いくつかのテストケースを追加することを強くお勧めします。
アーナウルド

1
@ Arnauld、OK、今すぐ作業してくれてありがとう:)
Any3nymousユーザー


入力4183059834009がどのように出力を与えるか説明してください2022
DimChtz

2
@ SuperJedi224 AFAIKデフォルトのルールは、「あなたの言語の自然な整数型が持つあらゆる範囲」であり、もちろん抜け穴に小さな範囲を使用せずに-少なくともそれは私の答えで仮定したものです:o
Felix Palmen

回答:


19

JavaScript(ES7)、31バイト

直接式。0解決策がない場合に戻ります。

v=>(r=(1+8*v**.5)**.5)%1?0:r>>1

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

どうやって?

最初の個のキューブの合計は、次の式で与えられます。 nSnn

Sn=(n(n+1)2)2=(n2+n2)2

(これはA000537です。この式は帰納法によって簡単に証明できます。ここに素晴らしいグラフィック表現がます。)S5

逆に、が最初のキューブの合計である場合、次の式は正の整数解を受け入れます。xvx

(x2+x2)2=v

ので正である、このリードに:(x2+x)/2

x2+x2v=0

その肯定的な解決策は次のとおりです。

Δ=1+8vx=1+Δ2

場合整数であるので、奇数の一つであることが保証されている自体が奇数です。したがって、ソリューションは次のように表現できます。 Δr=ΔΔ

x=r2

コメント済み

v =>                    // v = input
  ( r =                 //
    (1 + 8 * v ** .5)   // delta = 1 + 8.sqrt(v)
    ** .5               // r = sqrt(delta)
  ) % 1 ?               // if r is not an integer:
    0                   //   return 0
  :                     // else:
    r >> 1              //   return floor(r / 2)

再帰バージョン、36 35バイト

NaN解決策がない場合に戻ります。

f=(v,k=1)=>v>0?1+f(v-k**3,k+1):0/!v

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

コメント済み

f = (v,                   // v = input
        k = 1) =>         // k = current value to cube
  v > 0 ?                 // if v is still positive:
    1 +                   //   add 1 to the final result
    f(                    //   do a recursive call with:
      v - k ** 3,         //     the current cube subtracted from v
      k + 1               //     the next value to cube
    )                     //   end of recursive call
  :                       // else:
    0 / !v                //   add either 0/1 = 0 if v is zero, or 0/0 = NaN if v is
                          //   non-zero (i.e. negative); NaN will propagate all the
                          //   way to the final output

こんにちは、(自分の質問に対する)回答リンクを作成しました。最初に公開したので、同じ言語で2回公開してもいいですか?
Any3nymousユーザー

@ Any3nymoususer同じ言語でいくつかの回答を投稿するのはまったく問題ありません。独自の課題に答えることは、数日前に行われるべきではありませんが、今では大丈夫だと思います。
アーナルド

ああ、その場合は私に言って
thnx

7

05AB1E、6バイト

ÝÝOnIk

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

ジョナサン港のジェリーの答え。[0 ... n]の累積和を取り、それぞれを2乗してVのインデックスを見つけます。


05AB1E、7バイト

ÝÝ3mOIk

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

使い方

ÝÝ3mOIk – Full program.
ÝÝ      – Yield [[0], [0, 1], [0, 1, 2], ... [0, 1, 2, ... V]].
  3mO   – Raise to the 3rd power.
     Ik – And find the index of the input therein. Outputs -1 if not found.

8バイトの代替:ÝÝÅΔ3mOQ


私は考え理由を両方持っていない3mOnO仕事を...おそらくも言及-1 falsy値です。
魔法のタコ


5

ゼリー 5  4 バイト

RIJi

単項リンク0。不可能な場合は降伏します。

オンラインでお試しください!テストケースには非効率的です!(O(V)スペース:p)

これは、最初にVの立方根を実行して、代わりにO(V ^(1/3))にする8バイトバージョンです。ここでその8バイトバージョンを使用するのはテストスイートです

どうやって?

i=1i=ni3=(i=1i=ni)2
RIJi - Link: integer, V
R    - range of v -> [1,2,3,...,V]
 Ä   - cumulative sums -> [1,3,6,...,(1+2+3+...+V)]
  ²  - square -> [1,9,36,...,(1+2+3++...+V)²] ( =[1³,1³+2³,1³+2³+3³,...,(1³+2³+3³+...+V³)] )
   i - first 1-based index of v? (0 if not found)

これは有効ですか?テストケースに表示される入力を処理できないのですか?(私は何のアイデアも持っていません)
Any3nymousユーザー

1
これは有効です。テストケースでメモリエラーが発生する範囲です。以下のような小さな値を試してみてください36
氏Xcoder

1
@ FiveCrayFish973はい、code-golfのバイトカウントの使いやすさや効率などを犠牲にすることは非常に普通です(仕様が制限を強制しない限り)。テストケースで機能するバージョンについては、9バイトバージョンを参照してください。
ジョナサンアラン

@JonathanAllanクール、私はこのコミュニティのルールが何を示唆しているのか知らなかった。有効であれば、有効です。乾杯
Any3nymousユーザー

あまりにも悪いIJi振る舞い²⁼、言い換えると)。
エリックアウトゴルファー



3

Cubix、27バイト(またはボリューム27?)

この言語に適した場所のようです。

I@.1OW30pWpP<s)s;;q\.>s-.?/

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

これは、次のように3x3x3キューブにラップします。

      I @ .
      1 O W
      3 0 p
W p P < s ) s ; ; q \ .
> s - . ? / . . . . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

実行を見る

増加するキューブを入力から取り除くことにより、基本的なブルートフォースを実現します。結果がゼロのn場合、負の結果がある場合は出力し、0を出力して終了します。


2

Perl 6の30の 29 26バイト

ジョー・キングのおかげで-4バイト

{first :k,.sqrt,[\+] ^1e4}

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

n <10000のブルートフォースソリューション。ジョナサンアランの答えからの方程式を使用します。37より大きいnの36バイトソリューション(Jo Kingのおかげで-1バイト):

{!.[*-1]&&$_-2}o{{$_,*-$++³...1>*}}

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

False解決策がない場合に戻ります。

説明

               o  # Combination of two anonymous Blocks
                {                 }  # 1st Block
                 {               }   # Reset anonymous state variable $
                  $_,*-$++³...1>*    # Sequence n,n,n-1³,n-1³-2³,... while positive
{             }  # 2nd Block
 !.[*-1]&&       # Return False if last element is non-zero
          $_-2   # Return length of sequence minus two otherwise

ブルートフォースの0..$_場合、より大きな数字でタイムアウトになる場合でも、すべての数字に対して有効にすることができます。通常のゴルフで.は、最初のものを削除し、2番目のもの0>=*をから1>*
ジョーキングに




1

Matlab、27バイト

@(v)find(cumsum(1:v).^2==v)

n存在する場合は空のマトリックスを返し、存在しない場合は空のマトリックスを返します。

使い方

            1:v            % Creates a 1xV matrix with values [1..V]
     cumsum(   )           % Cumulative sum
                .^2        % Power of 2 for each matrix element
                   ==v     % Returns a 1xV matrix with ones where equal to V
find(                 )    % Returns a base-1 index of the first non-zero element

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

vメモリの制限により、大規模に失敗します。




1

dc、19バイト

4*dvvdddk*+d*-0r^K*

入力と出力はスタックからのもので、解決策がない場合は0を返します。

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

説明

解nがある場合、入力は((n^2+n)^2)/4です。そのn=sqrt(sqrt(4*input))ため、平方根のdcのデフォルトの小数点以下0桁の精度を使用して、試行解をとして計算し、それが実際に解であるかどうかを比較(n^2+n)^24*inputます。

4*dvv         Calculate a trial solution n (making a copy of 4*input for later use)
dddk          Store the trial solution in the precision and make a couple copies of it
*+d*          Calculate (n^2+n)^2
-             Subtract from our saved copy of 4*input - now we have 0 iff n is a solution
0r^           Raise 0 to that power - we now have 1 if n is a solution, 0 if not
K*            Multiply by our saved trial solution

最後から二番目の行は、そのDCに非自明な事実に依存している0^x=0すべての非ゼロのためにx(さえ否定x!)けど0^0=1


1

Pythonの353の、48バイト

f=lambda V,n=1:V>0and f(V-n**3,n+1)or(not V)*n-1

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

ジョー・キングから-3バイト

戻り値-1がない答えを。

n=997デフォルトの再帰制限でのみ機能します。

ボリュームからゼロ(成功、削除されたキューブの数を返す)、または負の数(応答なし)になるまで、ボリュームからますます大きなキューブを繰り返し取得します。

説明:

f=lambda V,n=1: # f is a recursive lambda taking the volume and the cube size (defaulting to 1)

               V>0and               # if the volume is positive
                      f(V-n**3,n+1) # then we are not to the right cube size yet, try again with n+1, removing the volume of the nth cube

                                   or # if V is not positive
                                     (not V)*n-1
                         # case V == 0:
                         # (not V)*n == n; return n-1, the number of cubes
                         # case V < 0:
                         # (not V)*n == 0; return -1, no answer

and/orまたはリストは通常​​よりも短いですif/else50バイト
ジョーキング

@JoKingありがとう!私はさらに2バイトも取得しました。
pizzapants184

not V=> V==0またはV>-1
ジョーキング

0

gvm(コミット2612106)バイトコード、70 59バイト

(2回乗算するコードを記述する代わりに、ループで乗算することにより、-11バイト)

Hexdump:

> hexdump -C cubes.bin
00000000  e1 0a 00 10 00 1a 03 d3  8a 00 f6 2a fe 25 c8 d3  |...........*.%..|
00000010  20 02 2a 04 0a 01 1a 02  00 00 20 08 4a 01 fc 03  | .*....... .J...|
00000020  d1 6a 02 52 02 cb f8 f4  82 04 f4 e8 d1 6a 03 0a  |.j.R.........j..|
00000030  03 fc d5 a8 ff c0 1a 00  a2 00 c0                 |...........|
0000003b

テスト実行:

> echo 0 | ./gvm cubes.bin
0
> echo 1 | ./gvm cubes.bin
1
> echo 2 | ./gvm cubes.bin
-1
> echo 8 | ./gvm cubes.bin
-1
> echo 9 | ./gvm cubes.bin
2
> echo 224 | ./gvm cubes.bin
-1
> echo 225 | ./gvm cubes.bin
5

本当に低得点ではなく、gvmここでのテストにこの素晴らしい質問を使用しているだけです;)コミットはもちろん質問よりも古いです。なお、この8ビットの仮想マシンで、これだけの自然符号なし数値範囲を扱ういくつかのコードを使用して0-255、質問に与えられたテストケースはなりません仕事を。

これから手動で組み立てられます:

0100  e1         rud                     ; read unsigned decimal
0101  0a 00      sta     $00             ; store to $00 (target sum to reach)
0103  10 00      ldx     #$00            ; start searching with n = #0
0105  1a 03      stx     $03             ; store to $03 (current cube sum)
0107  d3         txa                     ; X to A
                   loop:
0108  8a 00      cmp     $00             ; compare with target sum
010a  f6 2a      beq     result          ; equal -> print result
010c  fe 25      bcs     error           ; larger -> no solution, print -1
010e  c8         inx                     ; increment n
010f  d3         txa                     ; as first factor for power
0110  20 02      ldy     #$02            ; multiply #02 times for ...
0112  2a 04      sty     $04             ; ... power (count in $04)
                   ploop:
0114  0a 01      sta     $01             ; store first factor to $01 ...
0116  1a 02      stx     $02             ; ... and second to $02 for multiplying
0118  00 00      lda     #$00            ; init product to #0
011a  20 08      ldy     #$08            ; loop over 8 bits
                   mloop1:
011c  4a 01      lsr     $01             ; shift right first factor
011e  fc 03      bcc     noadd1          ; shifted bit 0 -> skip adding
0120  d1         clc                     ; 
0121  6a 02      adc     $02             ; add second factor to product
                   noadd1:
0123  52 02      asl     $02             ; shift left second factor
0125  cb         dey                     ; next bit
0126  f8 f4      bpl     mloop1          ; more bits -> repeat
0128  82 04      dec     $04             ; dec "multiply counter" for power
012a  f4 e8      bne     ploop           ; not 0 yet -> multiply again
012c  d1         clc
012d  6a 03      adc     $03             ; add power to ...
012f  0a 03      sta     $03             ; ... current cube sum
0131  fc d5      bcc     loop            ; repeat unless adding overflowed
                   error:
0133  a8 ff      wsd     #$ff            ; write signed #$ff (-1)
0135  c0         hlt                     ; 
                   result:
0136  1a 00      stx     $00             ; store current n to $00
0138  a2 00      wud     $00             ; write $00 as unsigned decimal
013a  c0         hlt

編集:私はちょうどバグを修正しましたgvm。この修正なしで、壊れる可能性のあるテキストモードgvmバイナリプログラムを読み取ろうとしました(上記のコードにはバイトが含まれていないため、この修正なしでWindowsで壊れることはありません)。0xd


0

K(oK)、21バイト

{(,_r%2)@1!r:%1+8*%x}

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

アルノーのJSの答え

どうやって:

{(,_r%2)@1!r:%1+8*%x} # Main function, argument x
             %1+8*%x  # sqrt(1+(8*(sqrt(x)))
           r:         # Assign to r
         1!           # r modulo 1
        @             # index the list:
 (,_r%2)              # enlist (,) the floor (_) of r modulo 2.

関数は(_r%2)iff を返し1!r == 0、そうでない場合はnull(0N)を返します。これは、リスト内の単一の要素がインデックス0であり、そのリストに0以外の番号をインデックス付けしようとするとnullが返されるためです。

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