这个数字是数字吗?


33

挑战

纯位数是一个非负整数,其位数都相等。

创建一个函数或完整程序,该函数或完整程序将单个整数作为输入,并且如果输入的数字是以10为底的repdigit,则输出真实值,否则输出false。

输入保证为整数。

您可以不受限制地接受并使用输入作为10进制的字符串表示形式。

测试用例

这些都是1000以下的位数。

1
2
3
4
5
6
7
8
9
11
22
33
44
55
66
77
88
99
111
222
333
444
555
666
777
888
999

可以在OEIS上找到更大的列表。

获奖

以字节为单位的最短代码获胜。这并不是说不欢迎用冗长的语言回答。



@ AidanF.Pierce输入的最大数字是多少?
stevefestl

Answers:


21

Brachylog,1个字节

=

在线尝试!

这作用于整数。

来自src/predicates.pl#L1151

brachylog_equal('integer':0, 'integer':0, 'integer':0).
brachylog_equal('integer':0, 'integer':I, 'integer':I) :-
    H #\= 0,
    integer_value('integer':_:[H|T], I),
    brachylog_equal('integer':0, [H|T], [H|T]).

我已决定接受此文件,因为它是最早的1字节提交。
艾丹·皮尔斯

19

C(gcc)33 30 29字节

f(n){n=n%100%11?9/n:f(n/10);}

在线尝试!


递归和赋值的技巧非常好,而不是return(想想我的答案会偷走后者:))。
门把手

@Doorknob继续。:)不过,您必须指定一个编译器;我希望这只是gcc / tcc。
丹尼斯,

您是否事先知道gcc与-O0n精确地将最终结果写入eax,从而使其成为返回值?您能否详细说明为什么知道它会起作用的逻辑?
Ruslan

@Ruslan我不确定gcc 为何会这样,但是函数中的最后一个变量赋值经常在eax中结束。如果我不得不猜测,那是因为它允许return nnop,并且如果您不打算返回结果,则没有理由在函数末尾分配给局部变量。
丹尼斯,

9

COBOL,139字节

我觉得COBOL在代码高尔夫方面没有得到任何热爱(可能是因为它不可能赢),但是这里有:

IF A = ALL '1' OR ALL '2' OR ALL '3' OR ALL '4' OR ALL '5' OR
ALL '6' OR ALL '7' OR ALL '8' OR ALL '9' DISPLAY "TRUE" ELSE   
DISPLAY "FALSE".

A被定义为PIC 9(4)。


2
您可以分别将,分别更改为1和0 TRUEFALSE以进行高尔夫球运动
caird coinheringaahing


6

Python 3中,25,24 19个字节。

len({*input()})>1>t

标准输入=>错误代码变体。

如果是重复数字,则返回错误代码0-或失败时返回错误。

感谢Dennis在评论中帮助我。


由于退出代码0表示成功,我认为您应该测试>1而不是<2。引发实际错误将比使用exitbtw 短。
丹尼斯,

那时候我想过那个。挑战说“真实价值”。我将其更改以引发错误。
影子

1
是的,if python3 repdigit.py; then echo truthy; else echo falsy; fi必须按照定义进行工作,所以0是真实的,其他都是虚假的。
丹尼斯

那讲得通。好的,我也会进行更改。
影子

2
@ Arc676一元*解压缩可迭代对象。例如,{*'123'}生成set {'1','2','3'}
丹尼斯,

6

Mathematica,27个字节

AtomQ@Log10[9#/#~Mod~10+1]&

它没有击败Equal@@IntegerDigits@#&,但超过了其他基于算术的Mathematica解决方案。

代表位数的形式为n = d(10 m -1)/ 9,其中m是位数,而d是重复位数。我们可以恢复dň通过服用模10(因为如果它是一个代表数字,它的最后一位数字将是d)。因此我们可以将其重新排列为m = log 10(9 n /(n%10)+1),然后检查m是否为整数。


5

Haskell,15个字节

all=<<(==).head

在线尝试!接受字符串输入。

等同于\s->all(==head s)s。狭beat地击败替代品:

f s=all(==s!!0)s
f s=s==(s!!0<$s)
f(h:t)=all(==h)t
f(h:t)=(h<$t)==t
f s=(s<*s)==(s*>s)
f(h:t)=h:t==t++[h]

f s=(s<*s)==(s*>s)这是一个非常有趣的想法,以前我还没有意识到<*
Laikoni

5

C(gcc),41个字节

f(char*s){s=!s[strspn(s,s+strlen(s)-1)];}

此函数将输入作为字符串,1如果是repdigit 0则返回,否则返回。

它通过使用该strspn函数来实现此目的,该函数接受两个字符串,并返回第一个字符串的最长前缀的长度,该长度仅由第二个字符串中的字符组成。在这里,第一个字符串是输入,第二个字符串是输入的最后一位,这是通过将指针传递到输入字符串的最后一个字符而获得的。

如果输入是repdigit,则对的调用结果strspn将为strlen(s)。然后,s如果是这种情况(str[strlen(str)]始终为\0),则索引入将返回一个空字节,否则将返回与最后一位不匹配的第一个数字。否定该!结果是否s代表repdigit。

在线尝试!

感谢@Dennis通过他令人印象深刻的答案间接地使我想起了分配而不是返回的技巧,节省了4个字节!


您可以通过避免缩短这个远一点strlen,由创建一个新的字符串*sc;f(char*s){c=*s;c=!s[strspn(s,&c)];}对于37
HVD

5

PHP,25 28 25

<?=!chop($argn,$argn[0]);

从右侧删除与第一个相同的1所有字符,如果所有字符都被删除,则打印。


5

R,31个字节

function(x)grepl("^(.)\\1*$",x)

此函数适用于字符串输入,并使用正则表达式确定输入是否为repdigit。

> f <- function(x)grepl("^(.)\\1*$",x)
> x <- c("1", "2", "11", "12", "100", "121", "333")
> f(x)
[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE

从函数(x)切换为使用scan(,'')28个字节tio.run/##K/r/P70otSBHQylOQ08zJsZQS0VJpzg5MU9DR11dU/O/paXlfwA
Sumner18 '18

5

///,110字节

/11/1//22/2//33/3//44/4//55/5//66/6//77/7//88/8//99/9//1/.//2/.//3/.//4/.//5/.//6/.//7/.//8/.//9/.//T..///.//T

在线尝试!

///语言没有任何关于真假的概念,因此如果输入是数字位数,则输出“ T”,如果输入不是数字位数,则不会输出任何字符。



4

八度,11字节

@(s)s==s(1)

在线尝试!

将输入作为字符串。

它检查所有字符是否与第一个字符相等。如果全部相等,则结果将是一个仅包含矢量1(八度为true),否则将至少有一个矢量(八度为0false)。这是一个证明


您不需要将其包装起来all(...)以获取真实/虚假值输出吗?
汤姆·卡彭特

你测试过证明了吗?这是一段代码,是ppcg上true / false的定义(元共识)。
Stewie Griffin


4

C#,42 33 28字节

i=>i.Replace(i[0]+"","")==""

i 必须是一个字符串。

@LethalCoder大大减少了


2
i[0].ToString()可以缩短到i[0]+""<1比短==0
TheLethalCoder

1
.Length<1可以是==""
TheLethalCoder

3

Braingolf,6个字节

iul1-n

在线尝试!

不幸的是,Braingolf从命令行args的隐式输入不能接受全数字输入作为字符串,它将始终将其强制转换为数字,因此解决方案是通过STDIN传递它,该方法会添加1个字节以读取STDIN(i

说明:

iul1-n
i       Read from STDIN as string, push each codepoint to stack
 u      Remove duplicates from stack
  l     Push length of stack
   1-   Subtract 1
     n  Boolean negate, replace each item on stack with 1 if it is a python falsey value
        replace each item on stack with 0 if it is a python truthy value
        Implicit output of last item on stack

在之后u,堆栈的长度等于输入中唯一字符的数量,减去1表示0当且仅当输入中恰好有1个唯一字符时,0它才是Python中唯一的假数字,因此n将替换01,还有其他一切0



3

JavaScript(ES6),23 21字节

感谢Neil,节省了2个字节

将输入作为整数或字符串。返回一个布尔值。

n=>/^(.)\1*$/.test(n)

演示版


不使用test而不是!!exec保存2个字节吗?
尼尔

(尽管对于纯字符串输入,移植PHP答案甚至更短。)
Neil

@尼尔,我不知道我在想什么。谢谢!
Arnauld

3

欧姆,4个字节

Ul2<

在线尝试!

说明

 Ul2<
 U    # Push uniquified input
  l   # Length
   2< # Is it smaller than 2?

我认为Ul≤应该可以。
克里斯多夫(Christoph)

@Christoph Yee我有这个,但我不确定0是否可作为真实值。(对于此代码高尔夫问题而言,这是很新的事^^)
Datboi

该死的0是假的,其他数字都是假的。我刚刚注意到,对于此挑战,我们需要相反的操作(通常,只要声明哪种情况是对的,哪些情况是假的,我们就可以互换)。Truthy的定义是“会抽烟”。
克里斯多夫(Christoph)

Ul1E也应努力(虽然我不知道欧姆),因为它并不需要处理0
Esolanging水果

3

APL,5个字节

@KritixiLithos节省了2个字节

⍕≡1⌽⍕

在线尝试!


您可以通过使用火车将7字节的解决方案压缩为5字节⊢≡1⌽⊢
Kritixi Lithos

@KritixiLithos谢谢!
Uriel

替换可同时处理字符串和数字。
亚当

@Adám谢谢!我不认为格式化是获取数字数组的一种方式。
Uriel

3

Java,21个字节:

l->l.toSet().size()<2

lMutableList<Character>来自eclipse的集合。


1
l也可以是CharAdapter。
唐纳德·拉布

@DonaldRaab哦,我从未见过那堂课。好发现。
内森·梅里尔

还有CodePointAdapter和CodePointList。
唐纳德·拉布

1
@DonaldRaab我经常使用eclipse集合,但是我总是很难在标准List / Map / Set集合之外找到任何东西。您的知识是基于库的开发,还是在某个地方(除了Javadoc之外)可以找到EC提供的所有内容的更好参考?
内森·梅里尔

听到那个消息很开心。我是框架的提交者……大约一年前,我写了这些与String相关的类。有很多人不知道的参考指南。我最近整理了一个思维导图,以帮助人们学习和浏览图书馆的众多功能。这是参考文献目录中的最后一个链接。指南。 github.com/eclipse/eclipse-collections/blob/master/docs/…–
唐纳德·拉布

3

科特林28 19字节

{it.toSet().size<2}

在线尝试!

将输入作为String原因

您可以不受限制地接受并使用输入作为10进制的字符串表示形式。

说明

{
    it.toSet()     // create a Set (collection with only unique entries)
                   // out of the characters of this string
        .size < 2  // not a repdigit if the set only has one entry
}

如果你不喜欢它需要一个这样的事实String,你可以有一个接受一个Int24个字节

{(""+it).toSet().size<2}

3

正则表达式(ECMAScript),31个字节

^(x{0,9})((x+)\3{8}(?=\3$)\1)*$

在线尝试!

与通常的数学正则表达式一样,以一元形式输入(请注意,使用十进制输入时,这个问题很简单:just ^(.)\1*$)。

说明:

^(x{0,9})           # \1 = candidate digit, N -= \1
(                   # Loop the following:
  (x+)\3{8}(?=\3$)  # N /= 10 (fails and backtracks if N isn’t a multiple of 10)
  \1                # N -= \1
)* $                # End loop, assert N = 0


@Deadcode糟糕,我忘了输入了,谢谢!
死死的


2

Neim,1个字节

𝐐

只需检查所有元素是否相等。

没有内置,2个字节:

𝐮𝐥

说明:

𝐮     Calculate unique digits
 𝐥    Get the length

这行得通,因为仅 1是在Neim中认为是真实的,而其他所有东西都是虚假的。

另外,对于4个字节:

𝐮𝐣μ𝕃

说明:

𝐮      Calculate unique digits
 𝐣      Join list into an integer
   𝕃   Check that is is less than
  μ    Ten.

试试吧!


2

C,38个字节

f(char*s){return*s^s[1]?!s[1]:f(s+1);}

递归地走一个字符串。如果前两个字符不同(*s^s[1]),那么只有在字符串(!s[1])的末尾,我们才能成功,否则在下一个位置(f(s+1))重复测试。

测试程序

#include <stdio.h>
int main(int argc, char **argv)
{
    while (*++argv)
        printf("%s: %s\n", *argv, f(*argv)?"yes":"no");
}

2

Java,38 33 23字节

n->n.matches("(.)\\1*")

nString自然的。

请注意,与在字符串中查找相比,^...$正则表达式中无需使用正则表达式,因为它会自动用于精确匹配(例如match方法)。

试试吧!

节省

  • -5字节:String自“您可以接受并使用输入作为不受惩罚的字符串”以来使用。
  • -10个字节:正则表达式显然很合适。

即将发布此确切的解决方案,包括有关matches不需要的说明,^$因为它与整个String匹配。所以我肯定是+1。;)
Kevin Cruijssen

2

R,25个字节

grepl("^(.)\\1*$",scan())

在线尝试

我能想到的最佳非正则表达式解决方案是36个字节:

is.na(unique(el(strsplit(x,"")))[2])

1
非正则表达式的另一个选择rle(charToRaw(scan(,'')))$v[2]<1
MickyT

2

Cubix,15个字节

uOn@ii?-?;.$@<_

在线尝试!

    u O
    n @
i i ? - ? ; . $
@ < _ . . . . .
    . .
    . .

观看运行

输出1为真,否为假

非常简单的读取一次读取输入中的一个字符。它使当前字符脱离前一个字符。如果结果非零,则立即停止。否则,它将继续输入和比较直到EOI。在EOI(-1)上,取反并退出


2

QBasic 4.5,55字节

INPUT a
FOR x=1TO LEN(STR$(a))
c=c*10+1
NEXT
?a MOD c=0

我算了!FOR循环检查输入中的位数,然后创建c,它是一系列等于输入的1。如果数字对单字符串== 0取模,则该数字就是repdigit。

在线尝试!请注意,在线解释器有点古怪,我不得不写出几条基于DOS的QBasic IDE会自动扩展的语句。

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.