将数字分解成三角形


15

给定一个整数n,将其分解为最大三角数之和(其中T m表示第m个三角数,或从1到m的整数之和),如下所示:

  • n> 0时

    • 找到最大可能三角形数Ť 使得Ť ≤Ñ

    • m附加到n的三角分解表示中。

    • 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。

    • 第二位是3 ; 从8中减去6得到2
  • 1 <2,但1 + 2 = 3> 2。

    • 第三和第四位数字必须为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

Answers:


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 n迭代中减去 t + 1,而 t <n,则在每次迭代时增加 t。当条件不再满足时,总共从 n中减去 T t并相应地更新输出。我们重复该过程,直到 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

@Arnauld哦,哇,好多了。您应该自己发布...
ETHproductions'May

1
好的。在你的版本,这将是安全的做法f=(n,p=q=0)f(n,++q+p)
Arnauld

@Arnauld是的,谢谢!
ETHproductions's

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)答案的端口。
我自己的方法几乎是原来的两倍。

在这里尝试。

说明:

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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.