ตัวตรวจสอบ Isogram


13

ถาม:

ให้คำตรวจสอบว่าเป็น isogram หรือไม่


อะไร :

isogram เป็นคำที่ประกอบด้วยตัวอักษรเท่านั้นโดยไม่มีการซ้ำซ้อน สตริงว่างคือ isogram


ตัวอย่าง :

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

อินพุต:

คุณอาจยอมรับอินพุตในรูปแบบที่สมเหตุสมผล

ข้อมูลที่ป้อนจะมีเฉพาะตัวอักษรและ / หรือตัวเลขเท่านั้นไม่มีช่องว่าง ( [a-zA-Z0-9])


ผลผลิต:

  • true หรือค่าความจริงใด ๆ หากอินพุตเป็น isogram
  • false หรือค่าเท็จใด ๆ

นี่คือสั้นที่สุดในหน่วยไบต์ในแต่ละภาษาที่ชนะ


3
กรณีทดสอบที่แนะนำ:sad2
อดัม

1
นิยามของ isogram ของคุณมีสองข้อความที่ขัดแย้งกัน มันคืออะไร
Ad Hoc Garf Hunter

9
ฉันอยากจะแนะนำให้คุณเริ่มใช้กล่องทรายเพื่อให้สามารถจับปัญหาเหล่านี้ได้ก่อนโพสต์คำถาม
fəˈnɛtɪk

3
@MuhammadSalman นี่มันเลอะเทอะมากโปรดลบ ". any" ออกจากท้ายคำพูดของคุณและให้ตัวอย่างเพิ่มเติม ( sad2dasจะล้มเหลวแม้ว่า2จะไม่มีสิ่งใดก็ตาม)
Asone Tuhid

4
"อะไร" และ "หมายเหตุ" ดูเหมือนจะขัดแย้งกัน: "ใช้งานฟังก์ชั่นที่กำหนดว่าสตริงที่มีตัวอักษรเพียงอย่างเดียวคือ isogram" (เน้นเพิ่ม) และ "อาจมีตัวเลขและผู้ที่จะต้องกลับเท็จ" พูดสิ่งที่ตรงกันข้าม ฉันลงคะแนนให้ปิดไม่ชัดเจนในขณะนี้ แต่จะถอนออกอย่างมีความสุขเมื่อล้างเสร็จแล้ว!
Giuseppe

คำตอบ:


9

งูหลาม2/ 3 36 52 48 ไบต์

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

ลองออนไลน์!

ฉันใช้ประโยชน์จากความจริงที่setมีองค์ประกอบเฉพาะเท่านั้น ด้วยการเรียกใช้__len__เมธอดของแต่ละตัวฉันสามารถตรวจสอบได้ว่าsมีองค์ประกอบที่ไม่ซ้ำกันหรือไม่

แก้ไข: อัปเดตเพื่อตอบสนองความต้องการที่ถูกมองข้ามก่อนหน้านี้เพื่อส่งคืนค่าเท็จสำหรับอินพุตตัวเลข set(str(56**7))ชุดของตัวเลขทั้งหมดจะถูกเข้ารหัสเป็น

แก้ไข 2: ปฏิบัติตามคำแนะนำผู้ใช้นี้ตอนนี้ฉันใช้ประโยชน์จากการคลายข้อโต้แย้งเพื่อกำหนดความเข้าใจ นี่เป็นการหยุดความเข้ากันได้กับ Python 2 อย่างเป็นทางการ


3
ยินดีต้อนรับสู่ PPCG! นี่ก็ควรจะกลับมาfalseเมื่อsมีตัวละครหลัก
Giuseppe

ใช้`56**7`(เหมือนในคำตอบของงูหลามอื่น ๆ ) แทนที่จะstr()สั้นกว่าไหม? ฉันไม่คุ้นเคยกับงูหลาม แต่ดูเหมือนจะเป็นข้อแตกต่างที่สำคัญระหว่างสองคำตอบของคุณ
Giuseppe

@Giuseppe python3 ไม่มี``รุ่น python2 เท่านั้นที่จะบันทึก 4 ไบต์ (3 ในส่วนนี้ + 1 ในส่วนที่เท่ากับ 1)
Rod

@Rod ขวาจริง ๆ สนุกมากพอที่56**7ได้รับแรงบันดาลใจจากการเข้ารหัสตัวเลข 0-9 ด้านล่างของคุณ แต่บันทึกไว้ที่ 1 ไบต์
Scott Norton

บางทีคุณสามารถเพิ่มเวอร์ชัน Python 2 ได้หรือไม่ 46 Bytes:lambda s:len(s)==len(set(s.lower())-{`56**7`})
Sunny Patel


4

R , 41 ไบต์

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

ลองออนไลน์!

วิธีการ Regex !grepl(regex,scan(,""),F)ไม่ทำงานดังนั้นฉันเดาว่าการจับภาพไม่ตรงกับตัวพิมพ์ใหญ่ - เล็กใน R แต่ฉันไม่ดีที่ regex โดยทั่วไปดังนั้นฉันจะไม่แปลกใจถ้าฉันทำผิด ...

R , 58 ไบต์

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

ลองออนไลน์!

ต่อท้ายตัวเลข0:9ลงในรายการตัวละครและการทดสอบหากมีการซ้ำซ้อน


3

Ruby , 25 23 21 ไบต์

ทั้ง 2 ไบต์ขอบคุณ Giuseppe

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

ลองออนไลน์!


-2 ไบต์ขอบคุณ Kirill L.

Ruby -n , 21 19 18 16 ไบต์

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

ลองออนไลน์!


@Giuseppe ผมไม่ได้คิดว่าจะทำงานขอบคุณ
Asone Tuhid

1
ฉันคิดว่าในรุ่นที่สองคุณไม่จำเป็นต้อง$_- เพียงแค่โยนใน regex โดยไม่มีสิ่งใดตรงกับมันโดยปริยาย$_: 16 ไบต์
Kirill L.

@KirillL ขอบคุณฉันไม่เคยเห็นมา!/.../ก่อนไม่สามารถแม้แต่หาได้จากruby-doc.org
Asone Tuhid

ไม่น่าแปลกใจที่ผมยังได้เรียนรู้เกี่ยวกับเรื่องนี้ที่นี่หลังจากที่ได้รับการแนะนำจากบางคนที่แต่งตัวประหลาด Perl :)
คิริลล์ลิตร

@KirillL ไม่น่าประหลาดใจเช่นกันความแปลกประหลาดของทับทิมมักสืบทอดมาจาก Perl
Asone Tuhid

3

Brachylogขนาด 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 ...
Erik the Outgolfer

@EriktheOutgolfer ต้นฉบับไม่ได้คิดค่าใช้จ่ายสำหรับหมายเลขที่ส่งคืนเท็จโดยอัตโนมัติ
โอลิเวอร์

อ่าคุณใช้เวอร์ชันอัลฟ่าเพราะมันสั้นกว่าจริง
Erik the Outgolfer

@EriktheOutgolfer ใช่มั้ย regex จะมีราคา +2 ในวานิลลา Japt ethproductions.github.io/japt/…
โอลิเวอร์

1
@ ขอบคุณมาก! ใช้งานได้ดี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
Muhammad Salman

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-array ไพพ์นั้นอาร์เรย์Group-Objectที่สร้างวัตถุที่มีคู่ชื่อ / นับสำหรับจดหมายอินพุตแต่ละตัว จากนั้นเราก็sortขึ้นอยู่กับcจำนวนและนำ0สิ่งนั้นมา เราตรวจสอบว่ามัน.Countเป็น-equal .Countของ[-1]คู่สุดท้าย หากเป็นเช่นนั้นการนับมีค่าเท่ากันมิฉะนั้นเราจะมีจำนวนตัวอักษรต่างกัน

จากนั้นเรา-andด้วยการตรวจสอบว่าอินพุต-notmatches ต่อต้าน\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⌶ ตัวพิมพ์เล็ก

(... ) ใช้ฟังก์ชัน tacit ต่อไปนี้กับสิ่งนั้น:

~∘⎕D ลบD igits ออกจากอาร์กิวเมนต์

∪≡ องค์ประกอบที่เป็นเอกลักษณ์ของการโต้แย้งนั้นเหมือนกันหรือไม่


1

Perl 6 , 22 ไบต์

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

ลองออนไลน์!

ไม่มีการแข่งขันสำหรับตัวละครบางตัวต่อมาตัวละครเดียวกัน ฟังก์ชั่นโดยปริยายเป็นบล็อกรหัสตรงโดยปริยายเมื่อ $ _, !สลับหนังสือด้วย เพิ่ม|\d(ta Adam) แต่ยังต้องการ.uc~~ซึ่งต้องการวงเล็บ ...

ทางเลือกที่มีถุง 23 ไบต์

{.uc.ords.Bag65..97}

ลองออนไลน์!

กรณีนี้ปกติแล้วทำให้กระเป๋า (ตั้งค่าด้วยการนับเหตุการณ์) การจัดกลุ่มหรือเท่ากับความจริงก็ต่อเมื่อสมาชิกทุกคนเป็นสมาชิกของกระเป๋าเปรียบเทียบและจำนวนอุบัติการณ์ทั้งหมดจะน้อยกว่าหรือเท่ากับในกระเป๋าเปรียบเทียบ ดังนั้นการทำซ้ำหรือตัวเลขใด ๆ จะทำให้การเปรียบเทียบเท็จ


abc1ล้มเหลวใน
อดัม

อ่าเขียนคำตอบนี้ก่อนเพิ่มตัวเลขสเป็ค
Phil H

คุณเพิ่มได้|\dไหม
อดัม

@ Adám: เรียงจาก ตระหนักว่ามันไม่ได้ตรวจจับตัวอักษรซ้ำ ๆ กันถ้ากรณีของตัวอักษรเหล่านั้นแตกต่างกันดังนั้นจำเป็นต้องทำให้เคสเป็นปกติและเพิ่ม parens ด้วย
Phil H



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 เป็นอย่างอื่น ทำงานในหน้าต่างทันที (ดีบัก)

แก้ไข: เทย์เลอร์ชี้ให้เห็นในความคิดเห็นนี้ใช้งานได้ในการติดตั้ง MS Office 32 บิต


หากคุณ จำกัด ภาษาของคุณไปยัง 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<>095 [A1]ไบต์โดยการป้อนข้อมูลจาก นอกจากนี้ยังเป็นที่น่าสังเกตว่าเนื่องจากการยกกำลังใน VBA เป็นเรื่องแปลกที่โซลูชันนี้ถูก จำกัด การติดตั้ง office 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

สิ่งนี้จะล้มเหลวหากอินพุตมีอักขระที่ไม่ใช่ตัวอักษร
Shaggy


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

" ไอโซแกรมคือคำที่ประกอบด้วยตัวอักษรเท่านั้นโดยไม่มีการซ้ำซ้อน " - กล่าวคือ "คำ" ที่มีตัวเลขควรส่งคืนค่าเท็จ ดูตัวอย่างการทดสอบที่ 5 สำหรับตัวอย่าง
Shaggy

ความผิดฉันเอง. ดูคำตอบของ @ 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

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! ฉันคิดว่าคุณไม่มีข้อกำหนดที่ต้องตรวจสอบว่าข้อมูลนั้นไม่มีตัวเลข
Martin Ender

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
เจSallé

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.