Kiểm tra Isogram


13

Thử thách :

Đưa ra một từ, kiểm tra xem đó có phải là một biểu đồ hay không.


Gì :

Một isogram là một từ chỉ bao gồm các chữ cái không có trùng lặp (không phân biệt chữ hoa chữ thường). Chuỗi rỗng là một hình bình hành.


Ví dụ:

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

Đầu vào :

Bạn có thể chấp nhận đầu vào ở bất kỳ định dạng hợp lý

Đầu vào sẽ chỉ chứa các chữ cái và / hoặc số, không có dấu cách ( [a-zA-Z0-9])


Đầu ra:

  • true hoặc bất kỳ giá trị trung thực nào nếu đầu vào là một hình bình hành
  • false hoặc bất kỳ giá trị giả nào khác

Đây là để mã ngắn nhất tính theo byte trong mỗi ngôn ngữ sẽ thắng.


3
Trường hợp thử nghiệm được đề xuất:sad2
Adám

1
Định nghĩa của bạn về isogram bao gồm hai tuyên bố mâu thuẫn khác nhau. Đó là cái gì
Đăng Rock Garf Hunter

9
Tôi khuyên bạn nên bắt đầu sử dụng hộp cát để những vấn đề này có thể được bắt gặp trước khi đăng tải thử thách.
fnɛtɪk

3
@MuhammadSalman Điều này rất cẩu thả, vui lòng xóa ". Bất kỳ" từ cuối trích dẫn của bạn và đưa ra một số ví dụ khác ( sad2dassẽ thất bại ngay cả khi 2không hiển thị bất cứ điều gì).
Asone Tuhid

4
"Cái gì" và "Ghi chú" dường như mâu thuẫn với nhau: "Thực hiện chức năng xác định xem một chuỗi chỉ chứa các chữ cái có phải là một biểu đồ không" (nhấn mạnh thêm) và "Có thể có số và những số đó sẽ phải trả về sai" nói những điều ngược lại. Tôi đã bỏ phiếu để đóng là không rõ ràng vào lúc này, nhưng sẽ vui vẻ rút lại nó một khi nó đã được xóa!
Giuseppe

Câu trả lời:


9

Python 2/3 , 36 52 48 byte

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

Hãy thử trực tuyến!

Tôi tận dụng thực tế setchỉ chứa các yếu tố độc đáo. Bằng cách gọi __len__phương thức của từng phương thức, tôi có thể xác định liệu scũng chỉ chứa các phần tử duy nhất (bỏ qua trường hợp).

EDIT: Được cập nhật để đáp ứng yêu cầu bỏ qua trước đó để trả về Sai cho đầu vào số. Tập hợp tất cả các chữ số được mã hóa thành set(str(56**7)).

EDIT 2: Theo đề xuất của người dùng này , bây giờ tôi tận dụng việc giải nén các đối số để đặt mức độ hiểu. Điều này chính thức phá vỡ tính tương thích với Python 2.


3
Chào mừng đến với PPCG! Điều này cũng được cho là trở lại falsekhi schứa một ký tự chữ số.
Giuseppe

đang sử dụng `56**7`(như trong câu trả lời python khác) thay vì str()ngắn hơn? Tôi không quen thuộc với python nhưng dường như đó là sự khác biệt chính giữa hai câu trả lời của bạn.
Giuseppe

@Giuseppe python3 không có ``, phiên bản chỉ dành cho python2 sẽ tiết kiệm 4 byte (3 trên này + 1 trên phân chia thay vì bằng)
Rod

@Rod chính xác. Thật thú vị, 56**7được lấy cảm hứng từ mã hóa các chữ số 0-9 của riêng bạn dưới đây, nhưng tiết kiệm cho bạn 1 byte.
Scott Norton

Có lẽ bạn có thể thêm phiên bản Python 2? 46 Byte:lambda s:len(s)==len(set(s.lower())-{`56**7`})
Sunny Patel


4

R , 41 byte

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

Hãy thử trực tuyến!

Phương pháp tiếp cận. !grepl(regex,scan(,""),F)không hoạt động nên tôi đoán việc chụp không khớp với trường hợp không nhạy cảm trong R? Mặc dù vậy, tôi rất tệ về regex nói chung, vì vậy tôi sẽ không ngạc nhiên nếu tôi làm sai ...

R , 58 byte

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

Hãy thử trực tuyến!

Nối các chữ số 0:9vào danh sách các ký tự (kiểm tra thấp hơn) nếu có bất kỳ sự trùng lặp nào.


3

Ruby , 25 23 21 byte

-2 byte trên cả hai nhờ Giuseppe

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

Hãy thử trực tuyến!


-2 byte nhờ Kirill L.

Ruby -n , 21 19 18 16 byte

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

Hãy thử trực tuyến!


@Giuseppe Tôi không nghĩ rằng nó sẽ hoạt động, cảm ơn
Asone Tuhid

1
Tôi nghĩ, trong phiên bản thứ hai, bạn thậm chí không cần $_- chỉ cần ném vào một regex mà không có gì khác hoàn toàn khớp với nó $_: 16 byte
Kirill L.

@KirillL. cảm ơn, tôi chưa bao giờ thấy !/.../trước đây, thậm chí không thể tìm thấy nó trên ruby-doc.org
Asone Tuhid

Không có gì đáng ngạc nhiên, tôi cũng đã tìm hiểu về nó ở đây sau khi nhận được lời khuyên từ một số anh chàng Perl :)
Kirill L.

@KirillL. cũng không có gì đáng ngạc nhiên, sự kỳ lạ của ruby ​​thường được thừa hưởng từ perl
Asone Tuhid

3

Brachylog , 4 byte

ḷo⊆Ạ

Hãy thử trực tuyến!

Vị ngữ sẽ thành công nếu đầu vào là một hình bình hành và thất bại nếu không, xuất ra bảng chữ cái Latinh viết thường nếu nó thành công. Vì vị từ tích hợp sẵn của Brachylog không khớp chính xác với mối quan hệ thông thường giữa tập hợp con và superset, tôi đã phải dành một byte để sắp xếp đầu vào có mức thấp hơn, nhưng đã lưu một byte để không phải kiểm tra rõ ràng các bản sao trong đó. (Nếu không cần thất bại với số, chúng ta có thể sử dụng ḷ≠.)


2

Husk , 6 byte

§=f√ü_

Hãy thử trực tuyến!

Giải trình

§=f√ü_  -- takes a string as argument, eg: "sAad2"
§       -- fork the argument..
  f√    -- | filter out non-letters: "sad"
    ü_  -- | deduplicate by lower-case: "sAd2"
 =      -- ..and compare: 0

2

Japt , 12 byte

;v
oC ‰ eUq

Giải trình:

;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

Hãy thử nó ở đây.




2

Japt 2.0, 12 11 byte

-1 byte nhờ Nit

v
f\l â eUq

Kiểm tra nó trực tuyến!


Uh, tại sao bạn thay đổi phiên bản thành một phiên bản dài hơn? Ngoài ra, tôi nghĩ rằng phiên bản cuối cùng của Japt là 1.4.4 ...
Erik the Outgolfer

@EriktheOutgolfer Bản gốc không có tài khoản cho các số tự động trả về sai.
Oliver

À, vậy là bạn đã sử dụng phiên bản alpha vì nó thực sự ngắn hơn.
Erik the Outgolfer

@EriktheOutgolfer Phải. Regex sẽ có giá +2 trong vanilla Japt. ethproductions.github.io/japt/ trộm
Oliver

1
@ Xin cảm ơn! Sử dụng tốte
Oliver

2

JavaScript (Node.js) , 29 25 byte

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

Hãy thử trực tuyến!

Cảm ơn đã cập nhật câu trả lời cho @BMO , @ l4m2 , @KevinCruijssen

-4 byte nhờ @KevinCruijssen


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

@KevinCruijssen: Tôi không thấy phiên bản cập nhật

Tôi khá chắc chắn [^a-z]có thể được thay thế bằng\d
Kevin Cruijssen

@KevinCruijssen: Cảm ơn. đã cập nhật

2

Võng mạc , 16 byte

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

Trả về 1như 0giá trị Truthy và Falsey.
Cảm ơn @Neil vì đã phát hiện và sửa lỗi trong mã ban đầu của tôi.

Hãy thử trực tuyến.

Giải trình:

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

Tại sao là đối diện của bạn?
Muhammad Salman

@MuhammadSalman Hai lý do: đảo ngược các trận đấu sẽ tốn nhiều byte hơn. Và tôi không quá thành thạo với Retina nên tôi không biết làm thế nào để đảo ngược các trận đấu để bắt đầu với .. xD
Kevin Cruijssen

lý do 1). À được rồi lý do 2). LOL
Muhammad Salman

1

PowerShell , 91 byte

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

Hãy thử trực tuyến!

Giải pháp ngây thơ, nhưng tôi không thể đưa ra một thuật toán tốt hơn. Đưa đầu vào$b , chuyển đổi ToUppertrường hợp, biến nó thành một char-array. Các đường dẫn mảng Group-Objectđó xây dựng một đối tượng có các cặp tên / đếm cho mỗi chữ cái đầu vào. Chúng tôi sau sortđó dựa trên count và lấy 0thứ thứ nhất. Chúng tôi kiểm tra xem nó .Count-eqphải là.Count của [-1]cặp cuối cùng . Nếu vậy, thì tất cả các số đều bằng nhau, nếu không chúng ta có một số lượng chữ cái khác nhau.

Sau đó, chúng tôi sẽ -andkiểm tra xem -notmatches đầu vào có \dloại trừ bất kỳ chữ số nào trong đầu vào không. Kết quả Boolean đó được để lại trên đường ống và đầu ra là ẩn.



1

Python 2 , 57 56 byte

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

Hãy thử trực tuyến!

Đầu tiên, nó biến đầu vào thành một tập hợp, loại bỏ các trùng lặp, sau đó loại bỏ các chữ số (được mã hóa `763**4`), sau đó kiểm tra xem độ dài có giống với đầu vào ban đầu không


1

Java 8, 61 39 byte

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

Giải trình:

Hãy thử trực tuyến.

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

Regex giải thích:

String#matchesngầm thêm vào ^...$.

^(?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 byte

Chức năng ngầm ẩn danh.

(∪≡~∘⎕D)819

Hãy thử trực tuyến!

819⌶ chữ thường

(... ) áp dụng các chức năng ngầm sau trên rằng:

~∘⎕D xóa D igits khỏi đối số

∪≡ các yếu tố duy nhất của đối số là giống hệt nhau?


1

Perl 6 , 22 byte

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

Hãy thử trực tuyến!

Không có trận đấu cho một số nhân vật sau đó cùng một nhân vật. Hàm ẩn dưới dạng một khối mã, khớp hoàn toàn trên $ _, đảo ngược sách với! . Đã thêm |\d(ta Adam) nhưng cũng cần.uc~~ , cần dấu ngoặc đơn ...

Thay thế bằng Túi, 23 byte

{.uc.ords.Bag65..97}

Hãy thử trực tuyến!

Trường hợp này bình thường hóa sau đó làm cho một túi (thiết lập với số lượng mắc). Tập hợp con hoặc bằng nhau chỉ đúng nếu tất cả các thành viên là thành viên của Túi so sánh và tất cả các tỷ lệ mắc đều nhỏ hơn hoặc bằng với các nhóm trong Túi so sánh. Vì vậy, bất kỳ sự lặp lại hoặc chữ số sẽ làm cho sự so sánh sai.


Thất bại trên abc1.
Adám

Ah, đã viết câu trả lời này trước khi số spec được thêm vào.
Phil H

Bạn có thể thêm |\dkhông?
Adám

@ Adám: Sắp xếp. Nhận ra nó cũng không phát hiện ra các chữ cái lặp đi lặp lại nếu trường hợp của các chữ cái đó khác nhau, do đó cần phải bình thường hóa trường hợp và thêm parens.
Phil H



1

Visual Basic cho Ứng dụng (32 bit), 102 byte

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

Sử dụng thực tế là trong VBA 0^x mang lại 1 nếu x bằng 0 và 0 khác. Chạy trong cửa sổ (gỡ lỗi) ngay lập tức.

Chỉnh sửa: như được Taylor chỉ ra trong các nhận xét, điều này chỉ hoạt động trong các bản cài đặt 32 bit của MS Office.


Nếu bạn giới hạn ngôn ngữ của mình với Excel VBA, thì bạn có thể trao đổi ngôn ngữ này thành 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<>095 byte bằng cách lấy đầu vào từ [A1]. Ngoài ra, điều đáng chú ý là vì Exponentiation trong VBA thật kỳ lạ khi giải pháp này bị giới hạn trong các bản cài đặt 32 bit của văn phòng.
Taylor Scott

Ngoài ra, bạn có thể làm cho câu trả lời của mình trông đẹp hơn và dễ đọc hơn bằng cách sử dụng viết hoa đúng (xem ở trên) và thêm <!-- language-all: lang-vb -->cờ vào câu trả lời của bạn để thêm đánh dấu cú pháp
Taylor Scott

1
@TaylorScott cảm ơn! Đã thêm tô sáng cú pháp và hạn chế ghi chú de 32 bit. Về đầu vào Excel, tôi muốn giữ ứng dụng giải pháp bất biến bất cứ khi nào có thể.
dnep

1

05AB1E , 4 byte

lDÔQ

Hãy thử trực tuyến!

Giải trình

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

Điều này không thành công nếu đầu vào chứa các ký tự không phải chữ cái.
Xù xì


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

" Một biểu đồ là một từ chỉ bao gồm các chữ cái không có sự trùng lặp " - tức là "từ" chứa các số sẽ trả về giá trị falsey. Xem trường hợp thử nghiệm thứ 5 cho một ví dụ.
Xù xì

Lỗi của tôi. Xem câu trả lời của @ Enigma để biết mã 05AB1E chính xác.
LordColus



0

CJam , 11 byte

qelA,s+_L|=

Hãy thử trực tuyến!

Giải trình

Ý tưởng cơ bản là nối từng chữ số sau đó kiểm tra các bản sao. Vì phần bổ sung đảm bảo rằng mỗi chữ số đã xuất hiện một lần, bất kỳ sự hiện diện nào nữa của chữ số sẽ là một bản sao, khiến nó trả về sai.

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 byte

Phương thức được định nghĩa trong Chuỗi lớp:

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

Điều này rất có thể là tự giải thích.


0

Bình thường , 17 byte

.Am&!t/rz0d}dGrz0

Bộ kiểm tra

Giải trình:
.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
Dịch thuật Python 3:
z=input()
print(all(map(lambda d:not z.lower().count(d)-1and d in "abcdefghijklmnopqrstuvwxyz",z.lower())))

0

C #, 82 byte

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

chỉnh sửa: thêm kiểm tra cho char

chỉnh sửa: sử dụng GroupBy để rút ngắn 5 byte


1
Chào mừng đến với PPCG! Tôi nghĩ rằng bạn đang thiếu yêu cầu mà bạn cũng cần kiểm tra xem đầu vào không chứa chữ số.
Martin Ender

0

APL (Dyalog Unicode) , 25 20 22 byte

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

Hãy thử trực tuyến!

Trả về 1 cho đúng, khác 0.

Đã lưu 5 byte nhờ @ H.PWiz

Đã sửa lỗi và lưu một byte khác nhờ @ Adám

Làm sao?

'''(.).*\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

Thất bại trên abc1.
Adám

Không \w.hợp lệ?
Adám

Nếu bạn có ý nghĩa (.).*\1, không. Nó cũng thất bại cho abc1: /
J. Sallé

Tôi không hiểu Bạn có ý gì bởi "nó cũng thất bại"?
Adám

Nếu bạn thử trực tuyến! bạn có thể thấy nó trả về 1 cho abc1khi nào nó sẽ trả về 0.
J. Sallé

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.