この番号はレプディジットですか?


33

チャレンジ

ぞろ目には、その数字全て等しい正の整数です。

入力として単一の整数を取り、入力数が10進数のrepdigitである場合は真理値を出力し、それ以外の場合は偽値を出力する関数または完全なプログラムを作成します。

入力は正の整数であることが保証されています。

入力を基本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

回答:


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バイトの提出であるため、これを受け入れることにしました。
エイダンF.ピアース

19

C(gcc)33 30 29バイト

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

オンラインでお試しください!


代わりに再帰と代入を使用した非常に素晴らしいトリックreturn(答えを得るために後者を盗もうと考えています:))。
ドアノブ

@Doorknobどうぞ。:)ただし、コンパイラを指定する必要があります。これはほぼgcc / tccのみになると予想しています。
デニス

gcc with -O0は最終結果をnfromに正確に書き込みeax、それを戻り値にすることを事前に知っていましたか?なぜそれが機能するとわかっているのか、論理について詳しく説明していただけますか
ルスラン

@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
変更してすることができますが、このゴルフをTRUEし、FALSEそれぞれ1と0に
coinheringaahing caird


6

Pythonの3、25、24 19バイト。

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

stdin =>エラーコードのバリアント。

repdigitの場合はエラーコード0を返し、失敗した場合はエラーを返します。

コメントで助けてくれたデニスに感謝します。


終了コード0は成功を示しているため、>1ではなくテストする必要があると思います<2。実際のエラーの発生は、exitbtw を使用するよりも短くなります。
デニス

私はそれについて疑問に思っていました。課題は「真実の価値」と言います。エラーが発生するように変更します。
シャドウ

1
はい、if python3 repdigit.py; then echo truthy; else echo falsy; fiアウト定義に従って動作する必要があるため、0は真実であり、他のすべては偽物です。
デニス

それは理にかなっている。OK、私もその変更を行います。
シャドウ

2
@ Arc676単項*は反復可能をアンパックします。たとえば{*'123'}、setを生成します{'1','2','3'}
デニス

6

Mathematica、27バイト

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

に勝るものはありませんがEqual@@IntegerDigits@#&、他の算術ベースのMathematicaソリューションに勝っています。

Repdigitsの形式は、n = d(10 m -1)/ 9です。ここで、mは桁数、dは繰り返し桁です。10を法とすることで、nからdを復元できます(rep桁の場合、最後の桁はdになるため)。したがって、これをm = log 10(9 n /(n%10)+ 1)として再配置し、mが整数かどうかを確認できます。


5

Haskell、15バイト

all=<<(==).head

オンラインでお試しください!文字列を入力します。

と同等\s->all(==head s)sです。選択肢をわずかに上回る:

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)は非常に興味深いアイデアであり、私は<*以前のこの動作を認識していませんでした。
ライコニ

5

C(gcc)、41バイト

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

これは、文字列として入力を1受け取り、0それがrepdigitであるかどうかを返す関数です。

これはstrspn、2つの文字列を受け取り、2番目の文字列の文字のみで構成される最初の文字列の最も長いプレフィックスの長さを返す関数を使用してこれを行います。ここで、最初の文字列は入力であり、2番目の文字列は入力文字列の最後の文字へのポインタを渡すことによって取得される入力の最後の数字です。

入力がレプディジットの場合、呼び出し結果はにstrspnなりますstrlen(s)。次に、インデックスが作成されたs場合、nullバイトが返されます(そうでない場合str[strlen(str)]は常に\0)、そうでない場合は最後の数字と一致しない最初の数字。これを否定すると、repdigitを表す!かどうかsが決まります。

オンラインでお試しください!

@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)

この関数は文字列入力で機能し、正規表現を使用して入力がレプディジットかどうかを判断します。

> 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

スキャンを使用して(「」)tio.run/##K/r/P70otSBHQylOQ08zJsZQS0VJpzg5MU9DR11dU/O/paXlfwAに機能(X)の切り替えによって28バイト
Sumner18



4

オクターブ、11バイト

@(s)s==s(1)

オンラインでお試しください!

入力を文字列として受け取ります。

すべての文字が最初の文字と等しいかどうかをチェックします。すべてが等しい場合、結果はベクトルのみ1(Octaveではtrue)、そうでない場合は少なくとも1つ0(Octaveではfalse)になります。ここに証拠があります。


all(...)真実/偽の値を出力するためにラップする必要はありませんか?
トムカーペンター

証明をテストしましたか?これが、ppcgのtrue / falseの定義(メタコンセンサス)のコードです。
スティーヴィーグリフィン


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の暗黙的な入力は、文字列として全桁の入力を受け入れることができず、常に数値にキャストされるため、代わりに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を引くと、入力に一意の文字が1つ0だけ存在する場合にのみ0Pythonで唯一の偽の数字にnなるため01に置き換えられますとで他のすべて0



3

JavaScript(ES6)、23 21バイト

ニールのおかげで2バイト節約

入力を整数または文字列として受け取ります。ブール値を返します。

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

デモ


Doesn't usingtest instead of !!exec save 2 bytes?
Neil

(Although, for a string-only input, porting the PHP answer is even shorter.)
Neil

@Neil I don't know what I was thinking. Thanks!
Arnauld

3

Ohm, 4 bytes

Ul2<

Try it online!

Explanation

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

I think Ul≤should work.
Christoph

@Christoph Yee I had that but I wasn't sure if 0 counts as a truthy value. (Quite new to this codegolf thing ^^)
Datboi

Ah damn 0 is falsey and every other number is truthy. I just noticed that we need exactly the opposite for this challenge (often we're allowed to swap as long as we declare which case is truthy and which is falsey). Truthy is defined by "would take a brench".
Christoph

Ul1E should also work (though I don't know Ohm) because it doesn't need to handle 0.
Esolanging Fruit

3

APL, 5 bytes

2 bytes saved thanks to @KritixiLithos

⍕≡1⌽⍕

Try it online!


You can golf the 7-byte solution to 5 bytes by using a train ⊢≡1⌽⊢.
Kritixi Lithos

@KritixiLithos thanks!
Uriel

Replace with to handle both strings and numbers.
Adám

@Adám thanks! I didn't think of formatting as a way of getting array of digits.
Uriel

3

Java, 21 bytes:

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

l is a MutableList<Character> from eclipse collections.


1
l could also be a CharAdapter.
Donald Raab

@DonaldRaab oooh, I've never seen that class. Nice find.
Nathan Merrill

There is CodePointAdapter and CodePointList as well.
Donald Raab

1
@DonaldRaab I use eclipse collections quite a bit, but I always struggle to find anything outside of the standard List/Map/Set collections. Is your knowledge based off of development of the libraries, or is there somewhere (other than the javadoc) I can find a better reference for everything EC provides?
Nathan Merrill

Glad to hear it. I am a committer for the framework... I wrote these particular String related classes a year or so ago. There is a Reference Guide which many folks don't know about. There is a mind-map I recently put together to help folks learn and navigate through the the plethora of features in the library. It's the last link in the TOC of the Ref. Guide. github.com/eclipse/eclipse-collections/blob/master/docs/…
Donald Raab

3

Kotlin, 28 19 bytes

{it.toSet().size<2}

Try it online!

Takes input as a String because

You may take and use input as a string representation in base 10 with impunity.

Explanation

{
    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
}

If you don't like the fact it takes a String, you can have one that takes an Int for 24 bytes.

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

3

Regex (ECMAScript), 31 bytes

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

Try it online!

Takes input in unary, as usual for math regexes (note that the problem is trivial with decimal input: just ^(.)\1*$).

Explanation:

^(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 Whoops I forgot to put that in, thanks!
Grimmy


2

Neim, 1 byte

𝐐

Simply checks that all elements are equal.

Without builtin, 2 bytes:

𝐮𝐥

Explanation:

𝐮     Calculate unique digits
 𝐥    Get the length

This works because only 1 is considered truthy in Neim, and everything else is falsy.

Alternatively, for 4 bytes:

𝐮𝐣μ𝕃

Explanation:

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

Try it!


2

C, 38 bytes

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

Recursively walks a string. If the first two characters differ (*s^s[1]) then we succeed only if we're at the end of the string (!s[1]) otherwise we repeat the test at the next position (f(s+1)).

Test program

#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 bytes

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

n is a String, naturally.

Note that there is no need for ^...$ in the regex since it's automatically used for exact matching (such as the match method), compared to finding in the string.

Try it!

Saves

  • -5 bytes: used String since "You may take and use input as a string with impunity."
  • -10 bytes: regex is apparently a good fit.

Was about to post this exact solution, including the explanation about the matches not requiring ^$ because it matches the entire String. So a definite +1 from me. ;)
Kevin Cruijssen

2

R, 25 bytes

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

Try it online

Best non-regex solution I could come up with was 36 bytes:

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

1
for another option on the non-regex rle(charToRaw(scan(,'')))$v[2]<1
MickyT

2

Cubix, 15 bytes

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

Try it online!

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

Watch It Run

Outputs 1 for truthy and nothing for falsey

Very simply read reads in the input one character at a time. It takes the current character away from the previous. If a non zero result then it halts immediately. Otherwise it continues inputting and comparing until the EOI. On EOI (-1), negate and exit


2

QBasic 4.5, 55 bytes

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

I've mathed it! The FOR-loop checks the number of digits in the input, then creates c, which is a series of 1's of length equal to the input. A number then is repdigit if it modulo the one-string == 0.

Try it online! Note that the online interpreter is a bit quirky and I had to write out a couple of statements that the DOS-based QBasic IDE would expand automatically.

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.