Чи є це число повторенням?


33

Виклик

Репдігіти є невід'ємним цілим числом , чиї цифри всі рівні.

Створіть функцію або повну програму, яка приймає одне ціле число як вхідне та виводить триєдне значення, якщо число введення є повторним знаком у базі 10, а фальш-значення - в іншому випадку.

Вхід гарантовано буде позитивним цілим числом.

Ви можете брати та використовувати введення як представлення рядків у базі 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

Брахілог , 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 з -O0записуватиме остаточний результат nз точно eax, щоб зробити його зворотним значенням? Не могли б ви детальніше розглянути логіку, чому ви знали, що це буде працювати?
Руслан

@Ruslan Я не впевнений, чому gcc поводиться так, але останнє призначення змінної всередині функції виводиться в eax частіше, ніж ні. Якби мені довелося здогадуватися, я б сказав, що це дозволяє return nбути nop, і немає підстав призначати локальну змінну в кінці функції, якщо ви не збираєтеся повертати результат.
Денніс

9

КОБОЛ , 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і FALSE1 і 0 відповідно
Caird coinheringaahing


6

Python 3, 25, 24 19 байт.

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

Варіант коду помилки stdin =>

Повертає код помилки 0, якщо це повторне позначення - або помилка при відмові.

Дякую Деннісу за те, що він допомагав мені в коментарях.


Оскільки вихідний код 0 вказує на успіх, я думаю, ви повинні перевірити, >1а не <2. Підвищення фактичної помилки було б коротшим, ніж використання exitbtw.
Денніс

Мені це було цікаво. Проблема говорить про "правдиву цінність". Я зміню це, щоб викликати помилку.
Тінь

1
Так, if python3 repdigit.py; then echo truthy; else echo falsy; fiдоводиться працювати за визначенням, тому 0 - це неправда, а все інше - хибне.
Денніс

Що має сенс. Гаразд, я теж зміню.
Тінь

2
@ Arc676 Unary *розпаковує ітерабельний. Наприклад, {*'123'}створює набір {'1','2','3'}.
Денніс

6

Математика, 27 байт

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

Він не б'є Equal@@IntegerDigits@#&, але він б'є інше рішення, засноване на арифметиці Mathematica.

Репдигіти мають вигляд n = d (10 м -1) / 9, де m - кількість цифр, а d - повторна цифра. Ми можемо відновити d з n , взявши його за модулем 10 (адже якщо це цифра повтору, то останньою цифрою буде 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іншому випадку.

Це робиться, використовуючи strspnфункцію, яка займає два рядки і повертає довжину найдовшого префікса першого рядка, що складається лише з символів з другого рядка. Тут перший рядок - це вхід, а другий рядок - остання цифра введення, отримана шляхом передачі покажчика на останній символ вхідного рядка.

Якщо вхід - це повторне позначення, то результатом виклику strspnбуде strlen(s). Тоді індексація у sповерне нульовий байт, якщо це так ( str[strlen(str)]є завжди \0) або перша цифра, яка не відповідає останній цифрі інакше. Якщо це заперечується, це !призводить до того, чи sпредставляє редігіт.

Спробуйте в Інтернеті!

Дякую @Dennis за те, що він опосередковано нагадав мені про присвоєння замість повернення через його шалено вражаючу відповідь , заощадивши 4 байти!


Ви можете скоротити це трохи далі, уникаючи strlenта створивши нову рядок із *s: c;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

28 байт шляхом переходу від функції (x) до використання scan (, '') tio.run/##K/r/P70otSBHQylOQ08zJsZQS0VJpzg5MU9DR11dU/O/paXlfwA
Sumner18

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

Спробуйте в Інтернеті!

Мова /// не має жодного поняття truthy та falsey, тому це виводить "T", якщо вхід є репдигітом, і не виводить жодних символів, якщо вхід не є репдигітом.



4

Октава , 11 байт

@(s)s==s(1)

Спробуйте в Інтернеті!

Приймає дані як рядок.

Він перевіряє всі символи на рівність з першими символами. Якщо всі рівні, результатом буде вектор з лише 1(вірно в Octave), інакше буде принаймні один 0(false в Octave). Ось доказ .


Чи не потрібно вам all(...)обробляти його, щоб отримати вихідний результат?
Том Карпентер

Ви перевіряли доказ? Цей фрагмент коду - це визначення (мета-консенсус) істинного / хибного на ppcg.
Стюі Гріффін

4

grep, 17 байт

grep -xP '(.)\1*'

Відповідає будь-якій рядку, що є повтором її першого символу.


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

Спробуйте в Інтернеті!

На жаль, неявне введення Брайнгольфа з аргументів командного рядка не може прийняти введення цілого розряду як рядок, він завжди передаватиме його до числа, тому замість цього рішення - передати його через 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якщо і тільки якщо існує рівно один унікальний характер на вході, 0є єдиною falsey числа в Python, так nбуде замінити 0з 1, і все інше с 0.



3

JavaScript (ES6), 23 21 байт

Збережено 2 байти завдяки Нілу

Приймає введення як ціле число, так і рядок. Повертається булева.

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

Демо


Не використовує testзамість того, щоб !!execзберегти 2 байти?
Ніл

(Хоча, для введення лише рядка, передача відповіді PHP ще коротша.)
Ніл

@Neil Я не знаю, про що я думав. Спасибі!
Арнольд

3

Ом , 4 байти

Ul2<

Спробуйте в Інтернеті!

Пояснення

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

Я думаю, що Ul≤має працювати.
Крістоф

@Christoph Yee У мене це було, але я не був впевнений, чи 0 вважається правдоподібним значенням. (Досить нове в цій речі про кодовий гольф ^^)
Датбой

Ах чорт 0- це фальси, і кожен інший номер є правдою. Я щойно помітив, що для цього виклику нам потрібно прямо навпаки (часто нам дозволяють проводити обмін, доки ми оголошуємо, який випадок є правдою, а який - фальси). Truthy визначається як "взяв би".
Крістоф

Ul1Eтакож повинен працювати (хоча я не знаю Ома), тому що йому не потрібно впоратися з 0.
Esolanging Fruit

3

APL, 5 байт

2 байти збережено завдяки @KritixiLithos

⍕≡1⌽⍕

Спробуйте в Інтернеті!


Ви можете розіграти 7-байтне рішення на 5 байт за допомогою потяга ⊢≡1⌽⊢.
Kritixi Lithos

@KritixiLithos дякую!
Уріель

Замінити з обробляти як рядки і числа.
Адам

@ Adám дякую! Я не вважав форматування способом отримання масиву цифр.
Уріель

3

Java, 21 байт:

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

l- це MutableList<Character>колекція із затемнень.


1
lтакож може бути CharAdapter.
Дональд Рааб

@DonaldRaab oooh, я ніколи не бачив цього класу. Приємна знахідка.
Натан Меррілл

Також є CodePointAdapter і CodePointList.
Дональд Рааб

1
@DonaldRaab Я досить багато використовую колекції затемнення, але завжди намагаюся знайти що-небудь поза стандартними колекціями List / Map / Set. Чи ваші знання базуються на розвитку бібліотек, чи є десь (крім javadoc), я можу знайти кращу довідку для всього, що надає ЕК?
Натан Меррілл

Радий це чути. Я прихильник рамки ... Я писав ці конкретні класи, пов’язані зі струною рік або близько того. Є довідник, про який багато людей не знають. Нещодавно я зібрав мапу розуму, щоб допомогти людям навчатися та орієнтуватися в безлічі особливостей бібліотеки. Це остання посилання в ТОЦ Реф. Посібник. github.com/eclipse/eclipse-collections/blob/master/docs/…
Donald Raab

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, ви можете мати один , який приймає Intна 24 байт .

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

3

Regex (ECMAScript), 31 байт

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

Спробуйте в Інтернеті!

Здійснює введення уніар, як зазвичай для математичних регексів (зауважте, що проблема є тривіальною з десятковим введенням: просто ^(.)\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 Whoops Я забув поставити це, дякую!
Grimmy


2

Нейм , 1 байт

𝐐

Просто перевірте, чи всі елементи рівні.

Без вбудованого 2 байти:

𝐮𝐥

Пояснення:

𝐮     Calculate unique digits
 𝐥    Get the length

Це працює тому, що 1в Неймі вважається лише правдою, а все інше - хибним.

Або 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*")

nце String, природно.

Зауважте, що ^...$в регулярному вираженні немає необхідності, оскільки він автоматично використовується для точного узгодження (наприклад, matchметоду), порівняно з знаходженням у рядку.

Спробуй це!

Економить

  • -5 байт: б / в String з "Ви можете безкарно брати та використовувати введення як рядок."
  • -10 байт: регулярно виражене виразне вміння.

Збирався опублікувати це точне рішення, включаючи пояснення про matchesне потрібне, ^$оскільки воно відповідає всій рядку. Тож певний +1 від мене. ;)
Кевін Круїйсен


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.

Спробуйте в Інтернеті! Зауважте, що онлайн-перекладач трохи химерний, і мені довелося виписати пару тверджень про те, що на базі DOS QBasic IDE розгортається автоматично.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.