输出缺少的整数


34

您将得到一个字符串。它将包含0到9之间的9个唯一整数。您必须返回缺少的整数。该字符串将如下所示:

123456789
 > 0

134567890
 > 2

867953120
 > 4

5
@riker似乎与找到序列中缺少的数字有关。这似乎是关于查找集合中缺少的数字。
DJMcMayhem

10
@Riker我不认为这是重复的,因为链接的质询具有严格递增的序列(可能是多位数),而此处的序列是任意的。
AdmBorkBork

3
嗨,乔希!由于到目前为止还没有人提到它,因此我将带您到Sandbox,在这里您可以发布未来的挑战想法并在发布到Main之前获得有意义的反馈。这将有助于消除所有细节(例如STDIN / STDOUT),并在您收到此处的否决票之前解决了重复的难题。
AdmBorkBork

1
9-x%9除0外的任何数字都适用,真是太可惜了。也许比我聪明的人会找到一种使之工作的方法。
Bijan

2
几个答案将整数作为函数输入。可以吗
丹尼斯

Answers:


36

Python 2中18 16个字节

+美丽感谢@Sarge Borsch

`99066**2`.strip

在线尝试!

99066**2 是生成包含0〜9的字符串的较短方法


7
32043可以更改为更漂亮的数字。99066是中心对称的(如果绕中心旋转180度则不会更改),或者可能是97779(回文,两个不同的数字)
Sarge Borsch

1
如果OP允许将数字打印两次,则764**4可以节省两个字节。
泰特斯

@Titus 764**4失踪了58以及9
Rod

1
错字...我的意思是763**4=338920744561
Titus

25

Python,22字节

lambda s:-int(s,16)%15

在线尝试!

算术解决方案。将输入字符串解释为十六进制,取反,然后取结果取模15。


2
您能解释一下为什么行得通吗?
KarlKastor

1
@KarlKastor,基数16的模15与基数10的模9相似。模数基1在取数字总和时是恒定的,仅因为10≡1(基数为1)。所有可能数字的总和为常数,因此缺失的数字为该常数与输入数字(以1为底的模数)之差。
mik


12

Brain-Flak48 38 36 + 3 = 39个字节

多亏了DJMcMayhem,节省了10个字节!

((([]())[]{}){()()({}[()])}{}[{{}}])

在线尝试!

说明

Ascii中所有数字的总和为525。此程序将输入求和,然后从525中减去输入,以得到丢失的数字。

((([]())[]{}){()()({}[()])}{}      )

将推动525。这利用了一个事实,即我们知道将有9个输入元素开始。这意味着[]计算结果为9,这使我们可以快速获得525之类的大数。

接下来,我们要介绍一下:

                             [{{}}]

这将对输入求和并从总数中减去。


这是如何运作的?
帕维尔

@ГригорийПерельман添加了解释!
小麦巫师

2
如果将其negative(sum(input()))移至末尾,则可以滥用堆栈高度nilad来轻松推动525。(([][][]()()()){()()({}[()])}{}[{{}}])应该会为您节省10个字节
DJMcMayhem

减去477即可获得30个字节
Jo King

12

Haskell24 23字节

(477-).sum.map fromEnum

在线尝试!用法:(477-).sum.map fromEnum $ "123456890"。477是数字1到9的字符代码的总和,不包括0。此匿名函数计算477减去所有数字字符代码的总和,以找到丢失的数字。

将char位数转换为int的长度增加了一个字节:

(45-).sum.map(read.pure)
foldl(\a b->a-read[b])45

在线尝试!


10

果冻,3个字节

ØDḟ

只需从(0123456789)ØD)中过滤输入字符串()。

在线尝试!


3
我喜欢所有高尔夫语言(甚至是一些非高尔夫语言)都使用相同算法的方式,但是Jelly设法使所用内建函数的名称最短,而将参数反转为的样板最少

1
@ ais523 APL的字母是相同的(除了它将是APL代码段而不是函数/程序):Ø= D= D= ~,如⎕D~'867953120'
亚当

3
我在浏览答案时:“我预计果冻中有3个字符。” 答对了。:^ D
DLosc

9

红宝石,14岁

对ASCII码求和并从48 * 9 + 45中减去

->s{477-s.sum}

这样使用

f=->s{477-s.sum}

puts f["123456789"]

9

JavaScript(ES6),26

编辑 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`^`)保存一个字节。
尼尔

@Neil ...而且它也更有趣
edc65

我觉得在我回答之后不久,这个技巧就令人怀疑了:D还是不错的+1。
克里斯多夫(Christoph)

1
@Christoph好吧,听起来好像您想传播这个词……
Neil

@Neil绝对:)很高兴看到它有所帮助!
克里斯多夫(Christoph)

8

视网膜27 21 19字节

-6感谢Basic Sunset
-2感谢Martin Ender

.
$*_5$*
+`_1|1_

1

在线尝试!

将每个数字替换为多个_s和5 1s:

.
$*_5$*

删除所有的_s和a 1

+`_1|1_ 


计算1剩余的s 数:

1

第二个答案的第一行可以是just .
尼尔

您可以使用重复数据删除而不是替换来节省一些字节:在线试用
Business Cat

哦,对了,这就是我刚刚得到的第二个答案,一直到第一个答案的旧字节数……^ 5 ^. $*9¶ . $*_ +`_¶_ _
尼尔

@Neil我比原来少了一个。
莱利

(呵呵,这看起来与我的回答很相似,唯一的区别是您从_更改1为保存字节。)
Neil


6

JavaScript(ES6),31 29 28 22字节

s=>(15-`0x${s}`%15)%15

@xnor的Python答案的端口,除了JavaScript仅具有余数运算符而不是模运算符之外,因此我无法一步完成。编辑:由于@Arnauld,节省了6个字节。


s=>[...s].map(c=>r-=c,r=45)|r;-)
ETHproductions 2017年

3
你太爱上了reduce。无论如何+1
edc65

@Arnauld什么时候看不到s[0]!='0',但是已经有了使用的答案eval
尼尔

你可以s=>(15-`0x${s}`%15)%15吗?
Arnauld

@Arnauld Bah,我也已经为Batch端口做到了……
尼尔(Neil)

6

Brainfuck,17个 15字节

-[-[->-<],]>++.

在这里尝试该解决方案仅依赖于标准包装,因此仅适用于标准Brainfuck(8位单元)。

这是Brainfuck真正可以竞争的难得的一天,但是这个挑战恰好与BF规范保持一致!

我不想直接分解这个答案,而是想逐步介绍一下我所做的迭代,因为我认为它会更易于理解(也更有趣)。
注意:此解决方案的主要灵感来自Wheat Wizard的Brain-Flak答案

说明

步骤1,26个字节

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  

步骤2,19个字节

正如他在回答中所指出的那样,由于我们知道输入将恰好是长度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

这是我对这个问题的最初答案,但我们可以做得更好。

步骤3,17个字节

有趣的是,即使我们以+开头,也可以使用前面的答案,

+[[->-<],>+<]>++++.

Brainfuck需要一个单元格中的东西才能开始循环。我们天真地在最后可能会在其他地方添加了额外的4个。

-[[->-<],>+<]>++.

出于一些完全有意的(请阅读:反复试验)循环的诡计,以-开头的程序会导致两个有趣的结果:

  1. 一个添加到第二个单元格中(末尾节省1个字节)。
  2. 循环额外运行一次,总共10次而不是9次(节省了另外1个字节)。

1 + 10 + 2 = 13,我们得到的是原始答案。

回顾一下,对于这样一个简单的Brainfuck程序,这可能是过多的编写。

步骤4,15个字节

在考虑了此解决方案后,我可以减少2个字节。

我想澄清有关上一步的内容:
进入循环的减号有效地加了1,但实际上是从第二个单元格中减去255(结果为1)。

回想起来很明显,但是从第一个单元格减去1等于向第二个单元格加1(因为第一个单元格中的所有内容都从第二个单元格中减去)。

-[-[->-<],]>++.

通过在第一个循环的开头添加“-”,我可以删除“> + <”。它必须去那里,而不是“> + <”所在的地方,因为否则程序将无限循环。



5

Mathematica,25个字节

477-Tr@ToCharacterCode@#&

将字符串作为输入并返回整数的纯函数。Mathematica具有很长的命令名称,并且不愿意在字符串和整数之间进行转换,这使得它在应对这一挑战方面尤其糟糕。我能找到的最好的算法是Level River St的Ruby答案中的算法,该算法基于输入字符串的ASCII码的总数进行计算。在Mathematica中,它仅使用一个长命令名。


5

PHP,27岁

<?=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
约尔格Hülsermann

5

Bash + coreutils,19个字节

我找到了一个较短的 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(即缺少的数字)来打印字符。

4

的Fortran 95,146个 128字节

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

3

CJam,5个字节

A,sq-

在线尝试!

A,     e# The range from 0 to 9: [0 1 2 3 4 5 6 7 8 9]
  s    e# Cast to a string: "0123456789"
   q   e# The input
    -  e# Remove all characters from the range that are in the input
       e# Implicit output

3

GNU sed,36个字节

包括+1的 -r

s/$/0123456789/
:
s/(.)(.*)\1/\2/
t

在线尝试!

s/$/0123456789/ # Append 0123456789
:               # Start loop
s/(.)(.*)\1/\2/ # remove a duplicate character
t               # loop if something changed

3

Brachylog(2),5个字节

ẹ:Ị↔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实现是古老的,有很多错误,这就是为什么需要
致命

实际上,您可以提出这样的论点,即类似的¬∋ℕ字符只能用3个字符起作用-这是我首先尝试的-但有很多原因导致它不能起作用,而且我认为没有任何可行的方式来更改Brachylog以使其可行。

有了¬∋ℕ这样的工作,甚至是不可能的序言中,除非特别节目您没有意思not in¬在Brachylog中等于\+,Prolog与在Prolog中相同,其含义是“在封闭世界假设下不可证明”,而不是“为所有不能证明这一点的事物提供选择点”(几乎总是无数个事物) )
致命杀伤

在Prolog中执行此操作的唯一方法是预先“标记” ,但这意味着根据谓词的内容修改Brachylog的评估顺序。不过,这只是它的问题之一;还有很多其他的。

3

Common Lisp,47个字节

(lambda(s)(- 45(reduce'+ s :key'digit-char-p)))

取消高尔夫:

(lambda (s) (- 45 (reduce '+ s :key 'digit-char-p)))

说明:

(reduce '+ s :key 'digit-char-p)

这将遍历char中的字符s,将其转换为数字,然后将其相加。Digit-char-p方便地返回char的数字作为其“ true”值,因此可以将其用作测试或转换。

(- 45 ...)

减去45将返回输入中缺少的数字。


3

库比克斯,18字节

5v&;52/ni?@.>!&oW+

展开式

    5 v
    & ;
5 2 / n i ? @ .
> ! & o W + . .
    . .
    . .

在这里尝试

使用与此相同的方法 大脑攻击回答。

通过压入5、2,串联,压入5,串联和取反,在堆栈上创建值-525。
然后重复获取输入并添加,直到命中输入结束为止。
删除最后一个输入,否定(使正数)最后一个加法结果,输出字符并暂停。

从-525开始工作的原因是每次输入迭代都会命中字符输出。由于该值为负,因此在退出循环并将该负值设置为正之前,不会输出任何内容。




3

Google表格,39 33字节

输入已输入到cell中A1

码:

=REGEXEXTRACT(4&2^29,"[^"&A1&"]")

由于Steve Kass节省了6个字节。

先前的代码:

=REGEXEXTRACT("0123456789","[^"&A1&"]")

结果:

enter image description here


数字2 ^ 29的所有数字都为4,所以只有33个字节:= REGEXEXTRACT(4&2 ^ 29,“ [^”&A4&“]”)
史蒂夫·卡斯

@SteveKass尼斯。=REGEXEXTRACT(0&49^9,"[^"&A1&"]")同样的逻辑,也是一种有效的解决方案。更新的答案。
格兰特·米勒

3

Befunge 98,14 12个字节

我通过将程序移至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)。虽然~可以正常工作。

旧程序,14字节

#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

2

PowerShell,30字节

param($n)0..9|?{$n-notmatch$_}

在线尝试!

接受输入$n,构造一个范围0..9(即0, 1, 2 ... 9),然后使用Where-Object子句(|?{...})提取执行regex的数字-notmatch。剩下的就在管道上,输出是隐式的。



2

Pyth,5个字节

-jkUT

试试吧!

说明

-jkUT
    T   # 10
   U    # The unary range of ten: [0,1,..,9]
 jk     # join that on the empty string
-       # set minus

“ -jUT”也可以工作,但是会为每个int产生换行符。


2

05AB1E,5个字节

žhISK

在线尝试!

说明

žh     # from the string "0123456789"
    K  # remove
  IS   # each digit of the input

6
我喜欢它,因为您可以大声说出来。“”“ hISK”,他哭了,当他用魔杖挥动高顶礼帽时,一只白色的小兔子冒出了浓烟。
Penguino
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.