이소 그램 검사기


13

도전 :

단어가 주어지면 isogram인지 확인하십시오.


뭐 :

isogram은 사본이없는 문자로만 구성된 단어입니다 (대소 문자 구분). 빈 문자열은 isogram입니다.


예 :

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

입력 :

합리적인 형식으로 입력을 수락 할 수 있습니다

입력은 공백없이 문자 및 / 또는 숫자 만 포함합니다 ( [a-zA-Z0-9])


출력 :

  • true 입력 값이 이소 그램 인 경우 진실한 값
  • false 그렇지 않으면 허위 가치

이것은 이므로 각 언어에서 가장 짧은 바이트 단위의 코드가 승리합니다.


3
권장 테스트 사례 :sad2
Adám

1
이소 그램 정의에는 서로 다른 두 가지 모순 된 진술이 포함됩니다. 무엇 이니?
Ad Hoc Garf Hunter

9
챌린지를 게시하기 전에 이러한 문제가 발생할 수 있도록 샌드 박스 사용을 시작하는 것이 좋습니다 .
fəˈnɛtɪk

3
이것은 매우 실수입니다 @MuhammadSalman ". 모든는"제거하십시오 당신의 말을 인용, 일부 더 많은 예제를 줄 ( sad2das를 빼고도 실패 2가 아무것도 표시되지 않도록).
Asone Tuhid

4
"무엇"과 "노트"는 서로 모순되는 것 같습니다. " 문자 만 포함 하는 문자열 이소 그램 인지 여부를 결정하는 함수 구현 "(강조 추가) 및 "숫자가있을 수 있으며 거짓을 반환해야합니다" 반대의 말을한다. 나는 현재 명확하지 않은 것으로 마감하기로 결정했지만, 일단 정리가되면 행복하게 철회 할 것입니다!
Giuseppe

답변:


9

파이썬 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.
Giuseppe

사용하고 `56**7`(다른 파이썬 대답으로) 대신 str()짧은? 나는 파이썬에 익숙하지 않지만 두 답변의 주요 차이점 인 것 같습니다.
Giuseppe

@Giuseppe python3에는 없습니다 ``. python2 전용 버전은 4 바이트를 절약 할 수 있습니다 (이 부분의 3 + 나누기 대신 1)
Rod

@로드 정확히 맞습니다. 재미있게도, 56**7아래의 0-9 자릿수 인코딩에서 영감을 얻었지만 1 바이트만큼 절약합니다.
스콧 노턴

아마도 파이썬 2 버전을 추가 할 수 있습니까? 46 바이트 :lambda s:len(s)==len(set(s.lower())-{`56**7`})
Sunny Patel


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}

온라인으로 사용해보십시오!


Kirill L 덕분에 -2 바이트

루비 -n , 21 19 18 16 바이트

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

온라인으로 사용해보십시오!


@ 주세페 나는 그것이 작동하지 않을 것이라고 생각했다, 감사합니다
Asone Tuhid

1
나는 두 번째 버전에서는 필요하지 않다고 생각합니다 $_. 다른 어떤 것도없이 정규식을 던지면 암시 적으로 일치합니다 $_: 16 바이트
Kirill L.

@KirillL. 고마워, 나는 !/.../전에 본 적이 없다 , 심지어 그것을 루비 -doc.org에서
Asone Tuhid

놀랍지 않게, 나는 또한 Perl 사람으로부터 조언을 얻은 후에 그것에 대해 배웠습니다. :)
Kirill L.

@KirillL. 루비 이상은 일반적으로 perl에서 상속됩니다
Asone Tuhid

3

Brachylog , 4 바이트

ḷo⊆Ạ

온라인으로 사용해보십시오!

입력이 isogram 인 경우 술어는 성공하고 그렇지 않은 경우 실패하여 성공하면 소문자 라틴 알파벳을 출력합니다. 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

apt 2.0, 12 11 바이트

Nit 덕분에 -1 바이트

v
f\l â eUq

온라인으로 테스트하십시오!


어, 왜 버전을 더 긴 버전으로 변경 했습니까? 또한, Japt의 마지막 버전은 1.4.4라고 생각합니다.
Outgolfer Erik

@EriktheOutgolfer 원본은 자동으로 거짓을 반환하는 숫자를 설명하지 않았습니다.
Oliver

아, 실제로는 알파 버전이 더 짧기 때문에 알파 버전을 사용했습니다.
Outgolfer Erik

@EriktheOutgolfer 맞습니다. 정규 표현식은 바닐라 Japt에서 +2가되었을 것입니다. ethproductions.github.io/japt/…
올리버

1
감사합니다! 잘 활용e
Oliver

2

JavaScript (Node.js) , 29 25 바이트

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

온라인으로 사용해보십시오!

@BMO , @ l4m2 , @KevinCruijssen 에 대한 답변 업데이트에 감사드립니다

@KevinCruijssen 덕분에 -4 바이트


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

@KevinCruijssen : 업데이트 된 버전을 보지 못했습니다

나는 다음 [^a-z]과 같이 대체 될 수 있다고 확신 한다\d
Kevin Cruijssen

@KevinCruijssen : 감사합니다. 업데이트

2

레티 나 , 16 바이트

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

1Truthy 및 0Falsey 값으로 반환 합니다. 초기 코드에서 버그를 발견하고 수정 해 주신 @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

왜 당신의 반대입니까?
Muhammad Salman

@MuhammadSalman 두 가지 이유 : 일치를 바꾸려면 더 많은 바이트가 필요합니다. 그리고 레티 나에 익숙하지 않아서 경기를 역전시키는 방법을 잘 모르겠습니다. xD
Kevin Cruijssen

이유 1). 그래. 이유 2). LOL
Muhammad Salman

1

PowerShell , 91 바이트

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

온라인으로 사용해보십시오!

순진한 솔루션이지만 더 나은 알고리즘을 만들 수는 없습니다. input을 가져 $b와서 대 / ToUpper소문자를 변환 한 후이를 char배열 로 캐스팅합니다 . Group-Object각 입력 문자에 대한 이름 / 카운트 쌍을 가진 오브젝트를 구성하는 배열을 파이프합니다 . 그런 다음 우리는 그 ount sort를 바탕으로 그 중 하나를 c취합니다 0. 우리는 그것의 확인 .Count이다 -eq받는 연간 .Count마지막의 [-1]쌍. 그렇다면 카운트가 모두 같고 그렇지 않으면 글자 수가 다릅니다.

그런 다음 -and입력의 숫자를 배제하기 위해 입력이 -notmatches 인지 여부를 확인합니다 \d. 해당 부울 결과는 파이프 라인에 남아 있으며 출력은 암시 적입니다.




1

자바 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

정규식 설명 :

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

펄 6 , 22 바이트

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

온라인으로 사용해보십시오!

일부 문자와 일치하지 않으며 나중에 동일한 문자와 일치하지 않습니다. 코드 블록으로서의 암시 적 함수 !. |\d(아담 아담)이 추가 되었지만 .uc~~괄호가 필요했습니다 ...

Bags, 23 바이트를 대체

{.uc.ords.Bag65..97}

온라인으로 사용해보십시오!

이것은 케이스를 정규화 한 다음 가방을 만듭니다 (발생 횟수로 설정). 부분 집합 또는 같음 모든 구성원이 비교 백의 구성원이고 모든 발생 횟수가 비교 백의 수보다 작거나 같은 경우에만 true입니다. 따라서 반복이나 숫자가 있으면 비교가 잘못됩니다.


에 실패합니다 abc1.
Adám

아, 숫자 사양이 추가되기 전에이 답변을 썼습니다.
Phil H

추가 할 수 없습니까 |\d?
Adám

@ Adám : 종류. 또한 해당 문자의 대소 문자가 다른 경우 반복 문자를 감지하지 못하므로 대소 문자를 정규화하고 괄호를 추가해야합니다.
Phil H



1

Visual Basic for Applications (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^xx가 0이면 1을 산출하고 그렇지 않으면 0을 산출 한다는 사실을 사용했습니다 . 즉시 (디버그) 창에서 실행하십시오.

편집 : 주석에서 Taylor가 지적한대로 이것은 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 비트 사무실 설치로 제한되어 있다는 점은 주목할 가치가 있습니다.
Taylor Scott

또한 적절한 대문자 (위 참조)를 사용하고 <!-- language-all: lang-vb -->답변에 플래그를 추가하여 구문 강조 표시를 추가하여 답변을 더 좋고 읽기 쉽게 만들 수 있습니다.
Taylor Scott

1
@TaylorScott 감사합니다! 구문 강조 및 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

" 이소 그램은 중복이없는 문자 로만 구성된 단어입니다."즉, 숫자를 포함하는 "단어"는 잘못된 값을 반환해야합니다. 예제는 다섯 번째 테스트 사례를 참조하십시오.
얽히고 설킨

내 잘못이야. 올바른 05AB1E 코드는 @Enigma의 답변을 참조하십시오.
LordColus



0

CJam , 11 바이트

qelA,s+_L|=

온라인으로 사용해보십시오!

설명

기본 아이디어는 각 숫자를 추가 한 다음 중복을 확인하는 것입니다. 추가하면 각 숫자가 이미 한 번 존재하므로 숫자가 더 있으면 중복되어 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

스몰 토크, 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
파이썬 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))));

편집 : char 테스트 추가

편집 : GroupBy를 사용하여 5 바이트 단축


1
PPCG에 오신 것을 환영합니다! 입력에 숫자가 포함되어 있지 않은지 확인 해야하는 요구 사항이 누락되었다고 생각합니다.
Martin Ender

0

APL (Dyalog Unicode) , 25 20 22 바이트

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

온라인으로 사용해보십시오!

true이면 1을, 그렇지 않으면 0을 반환합니다.

@ H.PWiz 덕분에 5 바이트 절약

@ 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.
Adám

\w.유효 하지 않습니까?
Adám

당신이 의미한다면 (.).*\1, 아닙니다. 또한 실패 abc1/ :
J. SALLE

이해가 안 돼요 "도 실패"는 무슨 뜻입니까?
Adám

다음과 같은 경우 를 온라인으로보십시오! abc10을 반환해야 할 때에 대해 1을 반환하는 것을 볼 수 있습니다.
J. Sallé

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.