您将得到一个字符串。它将包含0到9之间的9个唯一整数。您必须返回缺少的整数。该字符串将如下所示:
123456789
> 0
134567890
> 2
867953120
> 4
您将得到一个字符串。它将包含0到9之间的9个唯一整数。您必须返回缺少的整数。该字符串将如下所示:
123456789
> 0
134567890
> 2
867953120
> 4
Answers:
多亏了DJMcMayhem,节省了10个字节!
((([]())[]{}){()()({}[()])}{}[{{}}])
Ascii中所有数字的总和为525。此程序将输入求和,然后从525中减去输入,以得到丢失的数字。
((([]())[]{}){()()({}[()])}{} )
将推动525。这利用了一个事实,即我们知道将有9个输入元素开始。这意味着[]
计算结果为9,这使我们可以快速获得525之类的大数。
接下来,我们要介绍一下:
[{{}}]
这将对输入求和并从总数中减去。
negative(sum(input()))
移至末尾,则可以滥用堆栈高度nilad来轻松推动525。(([][][]()()()){()()({}[()])}{}[{{}}])
应该会为您节省10个字节
对ASCII码求和并从48 * 9 + 45中减去
->s{477-s.sum}
这样使用
f=->s{477-s.sum}
puts f["123456789"]
编辑 1个字节,以更聪明的技巧保存@Neil。
将所有值从1到9进行异或运算得到1。再将1或1异或一次,结果为0。因此,如果缺少任何单个值,则结果将为缺失值。
s=>eval([1,...s].join`^`)
测试
f=s=>eval([1,...s].join`^`)
function go() {
var i=I.value;
O.textContent = f(i)
}
go()
<input oninput='go()' value='012987653' id=I>
<pre id=O></pre>
s=>eval([1,...s].join`^`)
保存一个字节。
-6感谢Basic Sunset
-2感谢Martin Ender
.
$*_5$*
+`_1|1_
1
将每个数字替换为多个_
s和5 1
s:
.
$*_5$*
删除所有的_
s和a 1
:
+`_1|1_
计算1
剩余的s 数:
1
.
。
^
5
^.
$*9¶
.
$*_
+`_¶_
¶
_
_
更改1
为保存字节。)
s=>(15-`0x${s}`%15)%15
@xnor的Python答案的端口,除了JavaScript仅具有余数运算符而不是模运算符之外,因此我无法一步完成。编辑:由于@Arnauld,节省了6个字节。
s=>[...s].map(c=>r-=c,r=45)|r
;-)
reduce
。无论如何+1
s[0]!='0'
,但是已经有了使用的答案eval
。
s=>(15-`0x${s}`%15)%15
吗?
-[-[->-<],]>++.
在这里尝试。 该解决方案仅依赖于标准包装,因此仅适用于标准Brainfuck(8位单元)。
这是Brainfuck真正可以竞争的难得的一天,但是这个挑战恰好与BF规范保持一致!
我不想直接分解这个答案,而是想逐步介绍一下我所做的迭代,因为我认为它会更易于理解(也更有趣)。
注意:此解决方案的主要灵感来自Wheat Wizard的Brain-Flak答案。
Wheat Wizard在回答中指出,ASCII值的总和从0-9到525。并且由于标准Brainfuck仅具有[0,255]的概念,因此使525%256 = 13。也就是说,从13中减去输入的ASCII值就可以得到缺失的数字。
该程序的第一个版本是:
1.在第一个单元格中放入13。2.将
输入放入第二个单元格中
。3.从第一个单元格中减去第二个单元格
。4.如果还有剩余输入,则跳至2。5
.打印第一个单元格。
这是简单解决方案的代码:
+++++++++++++ #Set the first cell to 13
>, #Take inputs into the second cell
[[<->-],] #Subtract the second cell from the first cell and repeat until inputs are over
<. #Print the first cell
正如他在回答中所指出的那样,由于我们知道输入将恰好是长度9,因此我们可以将该值用作常量,并从一开始就消除长的+字符串。
添加到13点(谢谢,可交换属性!)也无关紧要,因此我们将其与减法和打印步骤混合在一起。
, #Take input to enter the loop
[[->-<], #Subtract the first cell from the second cell
>+<] #Add 1 for each input; totaling 9
>++++ #Add the missing 4 to make 13
. #And print
这是我对这个问题的最初答案,但我们可以做得更好。
有趣的是,即使我们以+开头,也可以使用前面的答案,
+[[->-<],>+<]>++++.
Brainfuck需要一个单元格中的东西才能开始循环。我们天真地在最后可能会在其他地方添加了额外的4个。
-[[->-<],>+<]>++.
出于一些完全有意的(请阅读:反复试验)循环的诡计,以-开头的程序会导致两个有趣的结果:
1 + 10 + 2 = 13,我们得到的是原始答案。
回顾一下,对于这样一个简单的Brainfuck程序,这可能是过多的编写。
在考虑了此解决方案后,我可以减少2个字节。
我想澄清有关上一步的内容:
进入循环的减号有效地加了1,但实际上是从第二个单元格中减去255(结果为1)。
回想起来很明显,但是从第一个单元格减去1等于向第二个单元格加1(因为第一个单元格中的所有内容都从第二个单元格中减去)。
-[-[->-<],]>++.
通过在第一个循环的开头添加“-”,我可以删除“> + <”。它必须去那里,而不是“> + <”所在的地方,因为否则程序将无限循环。
477-Tr@ToCharacterCode@#&
将字符串作为输入并返回整数的纯函数。Mathematica具有很长的命令名称,并且不愿意在字符串和整数之间进行转换,这使得它在应对这一挑战方面尤其糟糕。我能找到的最好的算法是Level River St的Ruby答案中的算法,该算法基于输入字符串的ASCII码的总数进行计算。在Mathematica中,它仅使用一个长命令名。
<?=trim(32043**2,$argv[1]);
使用Rod答案中的技巧生成一个包含所有数字的字符串,然后删除所有数字,除了缺少的数字。
PHP,41岁
for($b=1;$i<9;$b^=$argv[1][$i++]);echo$b;
这个使用xor是因为我还没有看到它。
32043,32286,33144,35172,35337,35757,35853,37176,37905,38772,39147,39336,40545,42744,43902,44016,45567,45624,46587,48852,49314,49353,50706,53976,54918,55446,55524,55581,55626,56532,57321,58413,58455,58554,59403,60984,61575,61866,62679,62961,63051,63129,65634,65637,66105,66276,67677,68763,68781,69513,71433,72621,75759,76047,76182,77346,78072,78453,80361,80445,81222,81945,83919,84648,85353,85743,85803,86073,87639,88623,89079,89145,89355,89523,90144,90153,90198,91248,91605,92214,94695,95154,96702,97779,98055,98802,99066
我找到了一个较短的 bash解决方案,它使用了一种有趣的校验和方法:
sum -s|dc -e524?--P
说明:
该sum
命令显示校验和和块计数。我不知道很多细节,但是使用选项-s
(系统V算法)将使校验和等于每个输入字符代码的ASCII和。这样,当相同输入字符的顺序更改时,校验和保持恒定。
鉴于867953120
作为测试用例(最后一个例子),这里是脚本如何工作的:
sum -s
输出473 1
。如果没有整数丢失,则校验和应为525。dc -e524?
按下524,然后按下管道输入。堆栈为:1 473 524
。这个想法是从525中减去校验和,但是由于总和输出也为1,因此我需要使用它。--P
。应用两个减法(524-(473-1))之后,堆栈为:52
。使用“ P”时,我将使用该ASCII码4
(即缺少的数字)来打印字符。function m(s)
character(len=10)::s,t
t='0123456789'
do j=1,10
k=0
do i=1,9
if(s(i:i)==t(j:j))k=1
end do
if(k==0)m=j-1
end do
end
恐怕不是很短。
取消高尔夫:
integer function m(s)
implicit none
character(len=9)::s
character(len=10)::t
integer:: i, j, k
t='0123456789'
do j=1,10
k=0
do i=1,9
if (s(i:i) == t(j:j)) k=1
end do
if (k==0) m=j-1
end do
end function m
ẹ:Ị↔x
可以说应该更短一些(我仍然对为什么ẹ
必须这样做感到困惑),但这是我能做的最好的。
ẹ:Ị↔x
ẹ Split the input into a list of characters
:Ị Pair that list with the string "0123456789"
↔x Remove all elements of the list from the string
x
实现是古老的,有很多错误,这就是为什么需要ẹ
。
¬∋ℕ
这样的工作,甚至是不可能的序言中,除非特别节目您没有意思not in
。¬
在Brachylog中等于\+
,Prolog与在Prolog中相同,其含义是“在封闭世界假设下不可证明”,而不是“为所有不能证明这一点的事物提供选择点”(几乎总是无数个事物) )
我通过将程序移至1行节省了1个字节,并通过做一些更好的数学节省了1个字节
~+;@.%a--7;#
ASCII值的总和范围从477到468,具体取决于缺少的数字。通过从7中减去此值,我们得到-470到-461的范围。通过将此数字修改为10,我们得到范围0-9,然后可以打印。
~+; ;# Sums the ASCII values of all characters to stdIn
~ # The # doesn't skip over the ~ because it's on the end of a line
~ Once EOF is hit, the ~ reverses the IP's direction
;# Jump the ; that was used before
--7 Subtract the sum from 7 (really just 0 - (sum - 7))
%a Mod it by 10
@. Print and exit
我使用ASCII值而不是采用整数输入的原因是因为“ &
在线尝试”中的命令在EOF上暂停(即使它应该反转IP)。虽然~
可以正常工作。
#v~+
@>'i5*--,
所有10位数字的ASCII值的总和为525。通过从525中减去给定数字的总和,我们得到丢失字符的ASCII值。
#v~+ Sums the ASCII values of all characters on stdIn
Moves to the next line when this is done
>'i5* Pushes 525 (105 * 5)
-- Subtracts the sum from 525
@ , Prints and exits
param($n)0..9|?{$n-notmatch$_}
接受输入$n
,构造一个范围0..9
(即0, 1, 2 ... 9
),然后使用Where-Object
子句(|?{...}
)提取执行regex的数字-notmatch
。剩下的就在管道上,输出是隐式的。