数値を三角形に分解します


15

整数所与N、(ここで、最大の三角数の和へと分解のT mが表すMを三角数、または1からの整数の和第M次のように)。

  • 一方、N> 0

    • 最大可能三角番号検索のT mは、そのようなことのT M ≤N

    • nの三角分解表現にmを追加します。

    • nからT mを引きます。

たとえば、44の入力は8311の出力を生成します:

  • 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 = 36 <44ですが、1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45> 44です。

    • 最初の桁は8です。44から36を引くと、残り8になります。
  • 1 + 2 + 3 = 6 <8、ただし1 + 2 + 3 + 4 = 10> 8。

    • 2桁目は3です。8から6を引くと、残り2になります。
  • 1 <2、ただし1 + 2 = 3> 2。

    • 3桁目と4桁目は11でなければなりません。

1〜9の数字を使用して最初の9個の三角番号を表し、a〜zの文字(大文字または小文字)を使用して10〜35番目の三角番号を表します。より大きな「数字」の使用を必要とする入力は決して与えられません。

入力の境界は1≤n <666であり、常に整数になります。

可能なすべての入力と出力、および選択されたいくつかのテストケース(入力としてリストされ、次に出力):

1 1
2 11
3 2
4 21
5 211
6 3
100 d32
230 k5211
435 t
665 z731

-1/12の入力に対しての出力は必要ありません。:)


しかし、∞の入力にはの出力が必要ですか?
user75200

回答:


8

JavaScript(ES6)、52バイト

f=(n,t=0)=>t<n?f(n-++t,t):t.toString(36)+(n?f(n):'')

どうやって?

むしろ明示的に計算するよりもTをiは  1 + 2 + 3 + ... + I =、我々が開始T = 0と反復減算T + 1からNながらT <N 、増分Tの各反復で。条件が満たされない場合、合計T tnから差し引かれ、それに応じて出力が更新されます。n = 0になるまでこのプロセスを繰り返します

以下は、n = 100の場合のすべての操作の要約です。

 n  |  t | t < n | output
----+----+-------+--------
100 |  0 | yes   | ""
 99 |  1 | yes   | ""
 97 |  2 | yes   | ""
 94 |  3 | yes   | ""
 90 |  4 | yes   | ""
 85 |  5 | yes   | ""
 79 |  6 | yes   | ""
 72 |  7 | yes   | ""
 64 |  8 | yes   | ""
 55 |  9 | yes   | ""
 45 | 10 | yes   | ""
 34 | 11 | yes   | ""
 22 | 12 | yes   | ""
  9 | 13 | no    | "d"
----+----+-------+--------
  9 |  0 | yes   | "d"
  8 |  1 | yes   | "d"
  6 |  2 | yes   | "d"
  3 |  3 | no    | "d3"
----+----+-------+--------
  3 |  0 | yes   | "d3"
  2 |  1 | yes   | "d3"
  0 |  2 | no    | "d32"

テストケース



4

dc、74バイト

?sa[2k_1K/1 4/la2*+v+0k1/dlardd*+2/-sadd10<t9>ula0<s]ss[87+P]st[48+P]sulsx

これはひどいです。

?sa             stores the input
[2k             sets precision to 2 so dc doesn't truncate 1/4
_1K/1 4/la2*+v+ uses the quadratic formula to find k, the next value to print
0k1/d           truncates k to an integer
lardd*+2/-sa    subtracts kth triangular number from the input 
dd10<t9>u       determines whether to print k as a letter or a digit         
la0<s]ss        loops when a is greater than 0
[87+P]st        prints k as a letter
[48+P]su        prints k as a digit (not p, as that leaves a trailing newline)
lsx             starts the main loop

3

JavaScript(ES6)、61 57バイト

@Arnauldのおかげで4バイト節約

f=(n,p=q=0)=>n?p-~q>n?q.toString(36)+f(n-p):f(n,++q+p):''

1
私が持っていたf=(n,t=0)=>n?t+1>n?t.toString(36)+f(n):f(n-++t,t):1
アーナルド

@Arnauldああ、すごいよ。自分で投稿する必要があります
...-ETHproductions

1
わかった。お使いのバージョンでは、それを行うのは安全だろうf=(n,p=q=0)f(n,++q+p)
アーナルド

@Arnauldはい、ありがとう!
ETHproductions

2

Java 7、81バイト

int i=0;String c(int n){return i<n?c(n-++i):Long.toString(i,36)+(n>(i=0)?c(n):"");}

@ArnauldのすばらしいJavaScript(ES6)回答からの移植
私自身のアプローチはほぼ2倍でした。

ここで試してみてください。

説明:

int i=0;                  // Temp integer `i` (on class level)
String c(int n){          // Method with integer parameter and String return-type
  return i<n?             //  If `i` is smaller than the input integer
    c(n-++i)              //   Return a recursive call with input minus `i+1` (and raise `i` by 1 in the process)
   :                      //  Else:
    Long.toString(i,36)+  //   Return `i` as Base-36 +
     (n>(i=0)?            //   (If the input integer is larger than 0 (and reset `i` to 0 in the process)
      c(n)                //    Recursive call with the input integer
     :                    //   Else:
      "");                //    an empty String)
}                         // End of method

2

網膜115の 108 38 34バイト

.+
$*¶
(\G¶|¶\1)+
0$1
+T`_w¶`w_`.¶

[オンラインで試してください!](テストスイートを含む)大文字を使用します。編集:@MartinEnderの答えを恥知らずに適応させることで70 74バイトを保存しました。この数字は三角形ですか?説明:数値は単項に変換され、可能な限り最大の三角形の数値は、数値がなくなるまで繰り返し照合されます。次に、各一致は基数36に変換されます。



0

R、87バイト

もともと、私は可能な三角形の数をプリセットしようとしました。これにより、105バイトのこのコードが作成されました。

pryr::f(n,{l=cumsum(1:35)
k=''
while(n){y=tail(which(l<=n),1)
n=n-l[y]
k=paste0(k,c(1:9,letters)[y])}
k})

これにはより多くのインデックスが必要であるため、@ Arnauldの方法論を試してバイト数を87に減らしました。

pryr::f(n,{k='';while(n){t=0;while(t<n){t=t+1;n=n-t};k=paste0(k,c(1:9,letters)[t])};k})

両方のコードは、ベース36に変換する短い方法を見つけることができなかったため、プリセット文字を使用しました。

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