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


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.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]. Кроме того, стоит отметить, что из-за того, что 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.