Перевірка ізограми


13

Виклик:

Давши слово, перевірте, чи це ізограма.


Що :

Ізограма - це слово, що складається лише з букв без дублікатів (без регістру). Порожній рядок - ізограма.


Приклади:

"Dermatoglyphics"     ---> true
"ab"                  ---> true
"aba"                 ---> false
"moOse"               ---> false
"abc1"                ---> false
""                    ---> true

Вхід:

Ви можете прийняти вхід у будь-якому розумному форматі

Вхід буде містити лише літери та / або цифри, без пробілів ( [a-zA-Z0-9])


Вихід:

  • true або будь-яке значення truthy, якщо вхід є ізограмою
  • false або будь-яке хибне значення в іншому випадку

Це тому найкоротший код у байтах на кожній мові виграє.


3
Рекомендований тестовий випадок:sad2
Адама

1
Ваше визначення ізограми включає дві різні суперечливі твердження. Що це таке?
Ad Hoc Garf Hunter

9
Я рекомендую почати використовувати пісочницю, щоб ці проблеми могли бути вирішені до опублікування виклику.
fəˈnɛtɪk

3
@MuhammadSalman Це дуже неакуратно, будь ласка , видаліть «Будь-який» з кінця вас процитувати і дати ще кілька прикладів ( sad2dasне вдасться навіть без 2так він нічого не показує).
Асона Тухід

4
Здається, що "Що" та "Примітки" суперечать одне одному: "Реалізуйте функцію, яка визначає, чи є рядок, що містить лише літери , ізограмою" (наголос додано) та "Можуть бути числа, і вони можуть і повинні повертати помилкові" говорити протилежні речі. Я проголосував за те, щоб закрити на даний момент як незрозумілий, але з радістю віддам його, як тільки буде очищено!
Джузеппе

Відповіді:


9

Python 2/3 , 36 52 48 байт

lambda s:len(s)==len({*s.lower()}-{*str(56**7)})

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

Я скористався тим, що setмістить лише унікальні елементи. За допомогою __len__методу кожного я можу визначити, чи sмістить він також лише унікальні елементи (ігнорування випадку).

EDIT: Оновлено, щоб задовольнити раніше переглянуту вимогу повернути False для числових входів. Набір усіх цифр кодується як set(str(56**7)).

РЕДАКТІВ 2: Після цієї пропозиції користувача я зараз скористався розпакуванням аргументів для встановлення розуміння. Це формально порушує сумісність із Python 2.


3
Ласкаво просимо до PPCG! Це також повинно повертатися, falseколи sмістить символ цифри.
Джузеппе

використовує `56**7`(як і в іншій відповіді python) замість str()коротшого? Я не знайомий з python, але, здається, це головна різниця між вашими двома відповідями.
Джузеппе

@Giuseppe python3 не мають ``, версія, призначена лише для python2, зберегла б 4 байти (3 на цьому + 1 на поділ, а не на рівні)
Пд

@Rod точно так. Як не дивно, 56**7натхненний власним кодуванням цифр 0-9 нижче, але економить на вашому на 1 байт.
Скотт Нортон

Можливо, ви можете додати версію Python 2? 46 байт:lambda s:len(s)==len(set(s.lower())-{`56**7`})
Сонячний Патель


4

R , 41 байт

!grepl("(.).*\\1|\\d",tolower(scan(,"")))

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

Підхід Реджекс. !grepl(regex,scan(,""),F)не спрацювало, так що я думаю, що зйомка не відповідає невідчутковій справі в R? Я взагалі поганий у регулярному вираженні, хоча не здивуюсь, якщо просто роблю це неправильно ...

R , 58 байт

!anyDuplicated(c(el(strsplit(tolower(scan(,"")),"")),0:9))

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

Додає цифри 0:9до списку символів (нижнього регістру) та тестів, якщо є дублікати.


3

Рубі , 25 23 21 байт

-2 байти на обидва завдяки Джузеппе

->s{/(.).*\1|\d/i!~s}

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


-2 байти завдяки Кирилу Л.

Рубі -n , 21 19 18 16 байт

p !/(.).*\1|\d/i

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


@Giuseppe Я не думав, що це спрацює, дякую
Асона Тухід

1
Я думаю, що у другій версії вам навіть не потрібно $_- просто кидання в регулярний вираз без нічого іншого неявно відповідає йому проти $_: 16 байт
Кирилл Л.

@KirillL. дякую, я ніколи не бачив !/.../, навіть не можу знайти його на ruby-doc.org
Asone Tuhid

Не дивно, що я також дізнався про це тут, отримавши поради від якогось хлопця з Perl :)
Кирилл Л.

@KirillL. не дивно, що
дикі

3

Брахілог , 4 байти

ḷo⊆Ạ

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

Присудок матиме успіх, якщо вхідний файл є ізограмою, а якщо він відсутній, виводиться з малої літери алфавіту, якщо він вдається. Оскільки вбудований предикат Brachylog точно не відповідає звичайному співвідношенню між підмножиною та супернабором, мені довелося витратити байт на сортування вхідних ліній нижнього регістру, але врятував байт на тому, щоб не потрібно чітко перевіряти наявність у ньому дублікатів. (Якщо не потрібно провалюватися з цифрами, ми можемо просто скористатися ḷ≠.)



2

Japt , 12 байт

;v
oC ‰ eUq

Пояснення:

;v
;         // Set alternative default vars, where C is the lowercase alphabet
 v        // Make the implicit input lowercase and reassign it
oC ‰ eUq
oC        // Remove all items from the input that are not in the alphabet
   ‰     // Split into chars and select unique array items
      eUq // Check if the result is equal to the input split into chars

Спробуйте тут.




2

Japt 2.0, 12 11 байт

-1 байт завдяки Nit

v
f\l â eUq

Перевірте це в Інтернеті!


Ага, чому ви змінили версію на більш довгу? Крім того, я думаю, що остання версія Japt - 1.4.4 ...
Ерік Атголфер

@EriktheOutgolfer Оригінал не враховував числа, автоматично повертаючи помилки.
Олівер

Ах, значить, ви використовували альфа-версію, оскільки вона насправді коротша.
Ерік Аутгольфер

@EriktheOutgolfer Справа. Регекс коштував би +2 у ванільному джапті. ethproductions.github.io/japt/…
Олівер

1
@Nit Дякую! Гарне використанняe
Олівер

2

JavaScript (Node.js) , 29 25 байт

s=>!/(.).*\1|\d/i.test(s)

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

Дякуємо за оновлення щодо відповіді на @BMO , @ l4m2 , @KevinCruijssen

-4 байти завдяки @KevinCruijssen


s=>!/(.).*\1|[^a-z]/i.test(s)?
l4m2

@KevinCruijssen: Оновлену версію я не побачив

Я впевнений, що [^a-z]його можна замінити\d
Кевін Круїссен

@KevinCruijssen: Дякую оновлено

2

Сітківка , 16 байт

Ci`(.).*\1|\d
^0

Повертається 1як Truthy і 0як значення Falsey.
Дякую @Neil за те, що виявив і виправив помилку в своєму початковому коді.

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

Пояснення:

C             Check if the input matches part of the following regex:
 i`            Case insensitivity enabled
               Check if part of the input matches either:
  (.)           A character `C`
     .*         followed by zero or more characters
       \1       followed by the same character `C` again
         |     Or
          \d    A digit
^0             Invert Truthy/Falsey, basically replacing every 0 with a 1,
               and every other value with a 1

Чому у вас навпаки?
Мухаммад Салман

@MuhammadSalman Дві причини: скасування матчів коштуватиме більше байтів. І я не надто вмілий з Retina, тому я не впевнений, як змінити матчі, щоб почати .. xD
Kevin Cruijssen

причина 1). Добренько. причина 2). LOL
Мухаммад Салман

1

PowerShell , 91 байт

param($b)($a=[char[]]$b.ToUpper()|group|sort c*)[0].Count-eq$a[-1].count-and$b-notmatch'\d'

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

Наївне рішення, але я не можу придумати кращий алгоритм. Бере введення $b, перетворює його ToUpperрегістр, charпередає його як- масив. Труби, Group-Objectщо створюють масив, в який будується об'єкт, що має пари імен / рахувати для кожної літери введення. Тоді ми, sortщо cгрунтуємося на унті, і беремо 0її. Ми перевіряємо, .Countчи -eqне відповідає .Countцій останній [-1]парі. Якщо так, то всі рахунки рівні, інакше у нас букви різної кількості.

Потім ми -andперевіримо, чи вхід -notmatchпроти, \dщоб виключити будь-які цифри вхідних даних. Цей булевий результат залишається на конвеєрі, а вихід неявний.



1

Python 2 , 57 56 байт

x=input().lower()
print len(set(x)-set(`763**4`))/len(x)

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

Спочатку він перетворюється, потім вводиться в набір, виймаючи дублікати, потім видаляючи цифри (закодовані `763**4`), а потім перевіряє, чи довжина така, як і вихідний вхід


1

Java 8, 61 39 байт

s->!s.matches("(?i).*((.).*\\2|\\d).*")

Пояснення:

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

s->  // Method with String parameter and boolean return-type
  !s.matches("(?i).*((.).*\\2|\\d).*")
     //  Return whether the input does not match the regex

Пояснення Regex:

String#matchesнеявно додає ^...$.

^(?i).*((.).*\2|\d).*$
 (?i)                      Enable case insensitivity
^    .*                    Zero or more leading characters
       (       |  )        Followed by either:
        (.)                 Any character `C`
           .*               with zero or more characters in between
             \2             followed by that same character `C` again
               |           Or:
                \d          Any digit
                   .*$     Followed by zero or more trailing characters

1

APL (Dyalog Unicode) , 12 байт

Анонімна негласна функція.

(∪≡~∘⎕D)819

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

819⌶ малі літери

() Застосувати до цього наступну мовчазну функцію:

~∘⎕D вилучити D igits з аргументу

∪≡ чи ідентичні елементи аргументу ідентичні цьому?


1

Perl 6 , 22 байти

{!(.uc~~/(.).*$0|\d/)}

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

Немає відповідностей для якогось персонажа, потім пізніше того ж персонажа. Неявна функція як блок коду, імпліцитно збігається з $ _, інвертувати книгу !. Додано |\d(та Адам), але також потрібно .uc~~, для чого потрібні дужки ...

Альтернатива з мішками, 23 байти

{.uc.ords.Bag65..97}

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

У цьому випадку нормалізується випадок, коли виготовляється мішок (встановлений з кількістю випадків захворюваності). Підмножина або рівна лише тоді, якщо всі члени є членами Мішка порівняння, і всі показники захворюваності менші або рівні, ніж у Мішці порівняння. Отже, будь-яке повторення чи цифри зробить порівняння помилковим.


Не вдається abc1.
Адам

Ах, написав цю відповідь до того, як додано специфікацію номерів.
Філ Х

Не можете ви просто додати |\d?
Адам

@ Adám: Сортування. Зрозуміло, він також не виявляв повторних літер, якщо регістри цих листів були різними, тому потрібно було нормалізувати регістр та додавати паролі.
Філ Х



1

Visual Basic для додатків (32 біт), 102 байти

s=LCase(InputBox(u)):j=1:For i=1To Len(s):k=Mid(s,i,1):j=j*0^Instr(i+1,s,k)*(k Like"[a-z]"):Next:?j<>0

Використовували той факт, що в VBA 0^xвиходить 1, якщо x дорівнює нулю, а 0 - в іншому випадку. Запустити в негайному (налагодженому) вікні.

Редагувати: як вказував Тейлор у коментарях, це працює лише у 32-бітових установках MS Office.


Якщо ви обмежите свою мову Excel VBA, ви можете змінити її s=LCase([A1]):j=1:For i=1To Len(s):k=Mid(s,i,1):j=j*0^InStr(i+1,s,k)*(k Like"[a-z]"):Next:?j<>0на 95 байт, взявши введення з [A1]. Крім того, варто зазначити, що, оскільки Експонентація в VBA дивна, що це рішення обмежується 32-бітовими встановленнями офісу.
Тейлор Скотт

Крім того, ви можете зробити свою відповідь кращою та зрозумілішою, скориставшись правильним написом з великої літери (див. Вище) та додавши <!-- language-all: lang-vb -->прапор до своєї відповіді, щоб додати підсвічування синтаксису
Тейлор Скотт

1
@TaylorScott дякую! Додано підсвічування синтаксису та відмічено 32-бітове обмеження. Щодо вводу Excel, я б краще, коли це можливо, тримати інваріантний додаток рішення.
день

1

05AB1E , 4 байти

lDÔQ

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

Пояснення

l      # convert input to lowercase
 D     # duplicate and push to stack
  Ô    # uniquify the list of characters
   Q   # check for equality

Це не вдається, якщо вхід містить небуквені символи.
Кудлатий


The input will only contain letters and/or numbers, no spaces ([a-zA-Z0-9])
LordColus

" Ізограма - це слово, що складається тільки з букв без дублікатів " - тобто "слова", що містять цифри, повинні повертати значення фальси. Для прикладу дивіться 5 тестовий випадок.
Кудлатий

Моє ліжко. Дивіться відповідь @ Enigma для правильного коду 05AB1E.
LordColus



0

CJam , 11 байт

qelA,s+_L|=

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

Пояснення

Основна ідея - додавати кожну цифру, а потім перевірити наявність дублікатів. Оскільки додаток гарантує, що кожна цифра вже присутня один раз, будь-яка подальша наявність цифр буде дублікатом, що призведе до повернення помилковим.

q      e# read the input:            | "MOoSE1"
el     e# convert to lowercase:      | "moose1"
A      e# push 10:                   | "moose1" 10
,      e# range [0,N):               | "moose1" [0 1 2 3 4 5 6 7 8 9]
s      e# string representation:     | "moose1" "0123456789"
+      e# concatenate:               | "moose10123456789"
_      e# duplicate:                 | "moose10123456789" "moose10123456789"
L|     e# union with the empty list: | "moose10123456789" "mose1023456789"
       e# (this gets rid of duplicates)
=      e# Equal to original:         | 0


0

Маленький розмов, 57 байт

Метод, який слід визначити у класі String:

s^(self select:#isLetter)asUppercase asSet size=self size

Це, швидше за все, само собою зрозуміле.


0

Pyth , 17 байт

.Am&!t/rz0d}dGrz0

Тестовий набір

Пояснення:
.Am&!t/rz0d}dGrz0 # Code
  m           rz0 # Map the following over the lowercase input:
      /rz0d       #  Count occurrences of d in lowercase input
     t            #   minus 1
    !             #    inverted (0 -> True)
   &              #     and
           }dG    #      d is in the lowercase alphabet
.A                # Print whether all values are truthy
Переклад Python 3:
z=input()
print(all(map(lambda d:not z.lower().count(d)-1and d in "abcdefghijklmnopqrstuvwxyz",z.lower())))

0

C #, 82 байти

bool f(string s)=>!!(s.GroupBy(c=>c).Any(c=>c.Count()>1|(!Char.IsLetter(c.Key))));

редагувати: додано тест на шар

редагувати: використовуючи GroupBy, щоб скоротити його на 5 байт


1
Ласкаво просимо до PPCG! Думаю, вам не вистачає вимоги, що вам також потрібно перевірити, чи вхід не містить цифр.
Мартін Ендер

0

APL (Dyalog Unicode) , 25 20 22 байт

'''(.).*\1|\d'S'&'1

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

Повертає 1 для істинного, інакше 0.

Збережено 5 байт завдяки @ H.PWiz

Виправлено та збережено ще один байт завдяки @ Adám

Як?

'''(.).*\1|\d'S'&'1  Tacit fn
                    1  Ignore case
               S'&'    Search and return the match(es)
   '(.).*\1|\d'         For this regex
''                     And compare to the empty string

Не вдається abc1.
Адам

Чи не \w.діє?
Адам

Якщо ви маєте на увазі (.).*\1, ні. Це також не вдається abc1: /
Дж. Салле

Я не розумію. Що ви маєте на увазі під "він також не вдається"?
Адам

Якщо ви спробуєте це в Інтернеті! ви можете бачити, що він повертає 1 за abc1, коли він повинен повернутися 0.
Дж. Салле

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