Answers:
@u+Gfq2l@GcLTGheGQhB2
0索引。
@u+Gfq2l@GcLTGheGQhB2Q Implicitly append Q and read+eval input to it.
hB2 Take the list [2, 2 + 1].
u Q Put the list in G and apply this Q times:
eG Get last number in G.
h Add one.
f Starting from that, find the first T such that:
cLTG Divide T by each of the numbers in G.
@G Find the quotients that are also in G.
l Get the number of such quotients.
q2 Check that it equals 2.
+G Append that T to G.
@ Q Get the Q'th number in G.
@
最后一行的符号未对齐。我无法进行建议的修改,因为这是2个字符的更改。
l#(a:b)|[x]<-[a|i<-l,j<-l,i<j,i*j==a]=a:(a:l)#b|1<2=l#b
((2:3:[2,3]#[4..])!!)
怎么运行的
2:3: -- start the list with 2 and 3 and append a call to # with
[2,3] -- the list so far and
#[4..] -- list of candidate elements
l # (a:b) -- l -> list so far, a -> next candidate element, b -> rest c.el.
| [x]<-[...] -- if the list [...] is a singleton list
=a:(a:l#b) -- the result is a followed by a recursive call with l extended
by a and b
| 1<2=l#b -- if it's not a singleton list, drop a and retry with b
-- the [...] list is
[ i<-l,j<-l, -- loop i through l and j through l and whenever
i<j, -- i<j and
i*j==a] -- i*j==a
a| -- add a to the list
ŒcP€ḟ⁸ṢŒgLÞḢḢṭ
2,3Ç¡ị@
单索引链接,索引为1。
ŒcP€ḟ⁸ṢŒgLÞḢḢṭ - Link 1, add the next number: list, a e.g. [2,3,6,12,18,24]
Œc - unordered pairs [[2,3],[2,6],[2,12],[2,18],[2,24],[3,6],[3,12],[3,18],[3,24],[6,12],[6,18],[6,24],[12,18],[12,24],[18,24]]
P€ - product of €ach [6,12,24,36,48,18,36,54,72,72,108,144,216,288,432]
⁸ - chain's left argument, a [2,3,6,12,18,24]
ḟ - filter discard [36,48,36,54,72,72,108,144,216,288,432]
Ṣ - sort [36,36,48,54,72,72,108,144,216,288,432]
Œg - group runs of equal elements [[36,36],[48],[54],[72,72],[108],[144],[216],[288],[432]]
Þ - sort by:
L - length [[48],[54],[108],[144],[216],[288],[432],[36,36],[72,72]]
Ḣ - head [48]
Ḣ - head 48
ṭ - tack to a [2,3,6,12,18,24,48]
2,3Ç¡ị@ - Link: number, i e.g. 7
2,3 - literal [2,3] [2,3]
¡ - repeat i times:
Ç - call last link (1) as a monad [2,3,6,12,18,24,48,54,96]
ị@ - index into with swapped @rguments (with i) 48
感谢Giuseppe提供了8个字节。
r=3:2;for(i in 1:scan())r=c(min((g=(r%o%r)[i:-1<i])[colSums(g%o%g==g*g)+g%in%r<3]),r);r[3]
<
优先级比以前低,+
所以我不知道到底+g%in%r<3
在做什么,而在我这样做的时候,你却打败了我要建议的两个部分……+1
0
0索引
for($r=[2,3];!$r[$argn];$r[]=$l=min($m)/2){$m=[];foreach($r as$x)foreach($r as$y)($p=$x*$y)<=$l|$y==$x?:$m[$p]+=$p;}echo$r[$argn];
展开式
for($r=[2,3];!$r[$argn]; #set the first to items and loop till search item exists
$r[]=$l=min($m)/2){ # add the half of the minimum of found values to the result array
$m=[]; # start with empty array
foreach($r as$x) # loop through result array
foreach($r as$y) # loop through result array
($p=$x*$y)<=$l|$y==$x? # if product is greater as last value and we do multiple two distinct values
:$m[$p]+=$p; # add 2 times or more the product to array so we drop 36 cause it will be 144
}
echo$r[$argn]; # Output
0索引
for($r=[2,3];!$r[$argn];$r[]=$l=min(array_diff_key($m,$d))){$d=$m=[];foreach($r as$x)foreach($r as$y)$x<$y?${dm[$m[$p=$x*$y]<1&$p>$l]}[$p]=$p:0;}echo$r[$argn];
0索引
for($r=[2,3];!$r[$argn];$r[]=$l=min(array_diff($m,$d))){$d=$m=[];foreach($r as$x)foreach($r as$y)$x<$y?${dm[!in_array($p=$x*$y,$m)&$p>$l]}[]=$p:0;}echo$r[$argn];
3:i:"t&*9B#u2=)yX-X<h]2_)
3: % Push [1 2 3]. Initial array of MU numbers, to be extended with more numbers
i: % Input n. Push [1 2 ... n]
" % Do this n times
t % Duplicate array of MU numbers so far
&* % Matrix of pair-wise products
9B % Push 9 in binary, that is, [1 0 0 1]
# % Specify that next function will produce its first and fourth ouputs
u % Unique: pushes unique entries (first output) and their counts (fourth)
2= % True for counts that equal 2
) % Keep only unique entries with count 2
y % Duplicate (from below) array of MU numbers so far
X- % Set difference
X< % Minimum. This is the new MU number
h % Concatenate vertically horizontally to extend the array
] % End
2_ % Push 2 negated, that is, -2
) % Get entry at position -2, that is, third-last. Implicitly display
{(2,3,{first *∉@_,@_.combinations(2).classify({[*]
$_}).grep(*.value==1)».key.sort}...*)[$_]}
2, 3, { ... } ... *
是无限序列,其中从第三个元素开始的每个元素都是由大括号分隔的代码块计算的。由于代码块通过Slurpy接受参数@_
数组,因此它将接收该数组中的整个当前序列。@_.combinations(2)
是的所有2元素组合的序列 @_
。.classify({ [*] $_ })
将每个2元组按其乘积分类,产生一个哈希,其中乘积是键,值是具有该乘积的2元组的列表。.grep(*.value == 1)
从散列中选择值(即,具有该键作为乘积的对的列表)的大小为1的那些键-值对。».key
仅选择每对密钥。这是仅由当前序列的一种因素组合产生的产品的列表。.sort
对产品进行数字排序。first * ∉ @_, ...
查找序列中尚未出现的那些产品中的第一个。一个基于0的索引的递归函数。
f=(n,a=[2,m=3])=>a[n]||a.map(c=>a.map(d=>c<d&(d*=c)>m?b[d]=b[d]/0||d:0),b=[])|f(n,a.push(m=b.sort((a,b)=>a-b)[0])&&a)
在f()的每次迭代中,我们使用序列的最后一项m和最初为空的数组b来识别下一项。对于两个较早的不同MU编号的每个乘积d> m,我们执行:
b[d] = b[d] / 0 || d
然后保持b的最小值。
上面的表达式评估如下:
b[d] | b[d] / 0 | b[d] / 0 || d
-------------------+-----------+--------------
undefined | NaN | d
already equal to d | +Infinity | +Infinity
+Infinity | +Infinity | +Infinity
这样可以保证不会选择以多种方式表示的乘积。
f = (n, a = [2, m = 3]) => // given: n = input, a[] = MU array, m = last term
a[n] || // if a[n] is defined, return it
a.map(c => // else for each value c in a[]:
a.map(d => // and for each value d in a[]:
c < d & // if c is less than d and
(d *= c) > m ? // d = d * c is greater than m:
b[d] = b[d] / 0 || d // b[d] = either d or +Infinity (see 'How?')
: // else:
0 // do nothing
), // end of inner map()
b = [] // initialization of b[]
) | // end of outer map()
f( // do a recursive call:
n, // - with n
a.push( // - push in a[]:
m = b.sort((a, b) => a - b)[0] // m = minimum value of b[]
) && a // and use a[] as the 2nd parameter
) // end of recursive call
a=[2,3];exec'p=[x*y for x in a for y in a if x-y];a+=min(q for q in p if p.count(q)+(q in a)<3),;'*input();print a[-2]
感谢@ Mr.Xcoder和@LeakyNun的改进!
p.count(q)==1
改为p.count(q)>0
有效,因为那是确保挑战以“完全一种方式”出现的代码。
p.count(q)-~(q in a)<=3
等效于p.count(q)+(q in a)<3