Изограмма проверки


13

Вызов :

По заданному слову проверьте, является ли это изограммой.


Какая :

Изограмма - это слово, состоящее только из букв без дубликатов (без учета регистра). Пустая строка является изограммой.


Примеры :

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

Вход:

Вы можете принять ввод в любом разумном формате

Ввод будет содержать только буквы и / или цифры, без пробелов ( [a-zA-Z0-9])


Выход :

  • true или любое истинное значение, если вход является изограммой
  • false или любое ложное значение в противном случае

Это поэтому выигрывает самый короткий код в байтах на каждом языке.


3
Предлагаемый тестовый пример:sad2
— Adám

1
Ваше определение изограммы включает в себя два разных противоречивых утверждения. Что он?
— Пост Рок Гарф Хантер

9
Я бы порекомендовал вам начать пользоваться песочницей, чтобы эти проблемы могли быть обнаружены до публикации заявки.
— fəˈnɛtɪk

3
@MuhammadSalman Это очень небрежно, пожалуйста, удалите «. Любой» из конца вашей цитаты и приведите еще несколько примеров (не sad2dasполучится даже без, 2так что ничего не показывает).
— Asone Tuhid

4
«Что» и «Примечания», кажется, противоречат друг другу: «Реализуйте функцию, которая определяет, является ли строка , содержащая только буквы, изограммой» (выделение добавлено) и «Могут быть числа, и те будут и должны возвращать false» говорите противоположные вещи. Я проголосовал за то, чтобы закрыться как неясный на данный момент, но с удовольствием отзову его, как только это прояснится!
— Джузеппе

Ответы:


9

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

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

Попробуйте онлайн!

Я пользуюсь тем, что setсодержит только уникальные элементы. Вызывая __len__метод каждого из них, я могу определить, sсодержит ли он также только уникальные элементы (без учета регистра).

РЕДАКТИРОВАТЬ: Обновлено, чтобы удовлетворить ранее пропущенное требование возвращать False для числовых входов. Набор всех цифр кодируется как set(str(56**7)).

РЕДАКТИРОВАТЬ 2: После этого предложения пользователя , я теперь пользуюсь распаковкой аргументов, чтобы установить понимание. Это формально нарушает совместимость с Python 2.


3
Добро пожаловать в PPCG! Это также должно возвращаться, falseкогда sсодержит символ цифры.
— Джузеппе

Использует `56**7`(как в другом ответе Python) вместо str()короче? Я не знаком с Python, но это, кажется, главное различие между вашими двумя ответами.
— Джузеппе

@Giuseppe python3 не имеет ``, версия только для python2 сэкономила бы 4 байта (3 при этом + 1 при делении вместо равных)
— Род

@ Род абсолютно прав. Как ни странно, он 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(,"")))

Попробуйте онлайн!

Подход Regex. !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 Я не думал, что это сработает, спасибо
— Asone Tuhid

1
Я думаю, что во второй версии вам даже не нужно $_- просто добавление регулярного выражения без чего-либо еще неявно сопоставляет его с $_: 16 байтов
— Кирилл Л.

@KirillL. спасибо, я никогда !/.../раньше не видел , даже не могу найти его на ruby-doc.org
— Asone Tuhid

Не удивительно, я также узнал об этом здесь после получения совета от какого-то парня из Perl :)
— Кирилл Л.

@KirillL. неудивительно, что рубиновая странность обычно наследуется от perl
— Asone Tuhid

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

MATL, 9 bytes

kt2Y2X&X=

Try it online!

k   % Lowercase implicit input
t   % Duplicate that
2Y2 % Push lowercase alphabet
X&  % Intersection of alphabet and duplicate lowercase input
X=  % Check for exact equality.


2

Japt 2.0, 12 11 bytes

-1 byte thanks to Nit

v
f\l â eUq

Test it online!


Uh, why did you change the version to a longer one? Also, I think the last version of Japt is 1.4.4...
— Erik the Outgolfer

@EriktheOutgolfer The original didn't account for numbers automatically returning false.
— Oliver

Ah, so you used an alpha version because it's actually shorter.
— Erik the Outgolfer

@EriktheOutgolfer Right. The regex would've cost +2 in vanilla Japt. ethproductions.github.io/japt/…
— Oliver

1
@Nit Thanks! Good use of e
— Oliver

2

JavaScript (Node.js), 29 25 bytes

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

Try it online!

Thanks for the update on answer to @BMO , @l4m2 , @KevinCruijssen

-4 bytes thanks to @KevinCruijssen


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

@KevinCruijssen : I didn't see the updated version

I'm pretty sure [^a-z] can be replaced with \d
— Kevin Cruijssen

@KevinCruijssen : Thanks. updated

2

Retina, 16 bytes

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

Returns 1 as Truthy and 0 as Falsey values.
Thanks @Neil for discovering and fixing a bug in my initial code.

Try it online.

Explanation:

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

Why is yours opposite ?
— Muhammad Salman

@MuhammadSalman Two reasons: reversing the matches would cost more bytes. And I'm not too skilled with Retina so I'm not sure how to reverse the matches to begin with.. xD
— Kevin Cruijssen

reason 1). Ah ok. reason 2). LOL
— Muhammad Salman

1

PowerShell, 91 bytes

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

Try it online!

Naive solution, but I can't come up with a better algorithm. Takes input $b, converts it ToUppercase, casts it as a char-array. Pipes that array into Group-Object which constructs a object that has name/count pairs for each input letter. We then sort that based on the count and take the 0th one thereof. We check that its .Count is -equal to the .Count of the last [-1] pair. If so, then the counts are all equal, otherwise we have a different amount of letters.

We then -and that with checking whether the input -notmatches against \d to rule out any digits in the input. That Boolean result is left on the pipeline and output is implicit.



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.Bag⊆65..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]. Кроме того, стоит отметить, что из-за того, что Exponentiation в VBA странно , это решение ограничено 32-разрядной установкой Office.
— Тейлор Скотт

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

1
@ ТейлорСкотт спасибо! Добавлена ​​подсветка синтаксиса и отмечено ограничение на 32 бита. Что касается ввода в Excel, я бы предпочел, чтобы решение всегда оставалось неизменным для приложения.
— dnep

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

"An isogram is a word consisting only of letters with no duplicates" - i.e., "words" containing numbers should return a falsey value. See the 5th test case for an example.
— Shaggy

My bad. See @Enigma's answer for the correct 05AB1E code.
— LordColus



0

CJam , 11 байт

qelA,s+_L|=

Try it online!

Explanation

Основная идея состоит в том, чтобы добавить каждую цифру, а затем проверить на наличие дубликатов. Поскольку добавление гарантирует, что каждая цифра уже присутствует один раз, любое дальнейшее присутствие цифр будет дубликатом, в результате чего он будет возвращать false.

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

Smalltalk, 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: /
— J. Sallé

Я не понимаю Что вы подразумеваете под "это также не удается"?
— Адам

Если вы попробуете это онлайн! вы можете видеть, что он возвращает 1 для abc1, когда он должен возвращать 0.
— J. Sallé

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.