มีตัวตรวจสอบ tautogram ขนาดเล็กกว่าหรือไม่ [ปิด]


10

เมื่อไม่นานมานี้ฉันได้เข้าสู่การเขียนโค้ดกอล์ฟและพยายามเขียนตัวตรวจสอบสัญลักษณ์ขนาดเล็กที่สุด

tautogramเป็นประโยคที่ทุกคำที่เริ่มต้นด้วยตัวอักษรเดียวกันตัวอย่างเช่น: ดอกไม้อวดจากฝรั่งเศส

ให้ประโยคเป็นอินพุตให้พิจารณาว่าเป็น tautogram หรือไม่

กรณีทดสอบ

Flowers flourish from France
    True

This is not a Tautogram
    False

ฉันใช้รหัสหลามนี้ (เพราะเป็นภาษาหลักของฉัน):

print(True if len(list(set([x.upper()[0] for x in __import__('sys').argv[1:]]))) == 1 else False)

การใช้งาน:

python3 tautogram.py Flowers flourish from France
# True
python3 tautogram.py This is not a Tautogram
# False

ประโยคอาจมีเครื่องหมายจุลภาคและระยะเวลา แต่ไม่มีอักขระพิเศษอื่น ๆ มีเพียงตัวอักษรและตัวพิมพ์เล็กและตัวพิมพ์ใหญ่

ขนาดของมันคือ 98 ไบต์ มีวิธีแก้ปัญหาเล็กน้อยในภาษาใด ๆ หรือไม่?


1
เป็นtipsคำถามที่ จำกัดPythonหรือไม่? หากเป็นเช่นนั้นควรเพิ่มแท็กทั้งสองนี้
Arnauld

2
เฮ้เพื่อน! ไซต์นี้มักจะสงวนไว้สำหรับปัญหาที่กำหนดไว้อย่างชัดเจน สิ่งที่ "ควรมีเครื่องหมายวรรคตอน" ควรตอบก่อนที่จะโพสต์ แต่นอกเหนือจากนี้เป็นคำถามแรกที่ดีเมื่อเทียบกับคำถามผู้ใช้ใหม่อื่น ๆ ที่เรามักจะเห็น ตัดสินจากตัวอย่างของคุณฉันแค่ชี้แจงว่าตัวละครในอินพุตจะเป็น "[A-Za-z]" และคำถามของคุณจะมีวัตถุประสงค์อย่างแท้จริง ฉันขอฝากคำถามอื่นไว้รอบ ๆ ที่นี่อีกอย่างนี้อาจดีกว่าแบบล้น
Magic Octopus Urn

1
เครื่องหมายวรรคตอนหมายถึงอะไร ตัวละครใดรวมอยู่ด้วย?
ศูนย์รวมแห่งความไม่รู้

1
@MagicOctopusUrn บางครั้งเมื่อคุณขอคำตอบสั้น ๆ ใน stackOverflow อ้างถึงเว็บไซต์นี้ :)
Luis felipe De jesus Munoz

6
ยินดีต้อนรับสู่ PPCG! อีกสองสามกรณีทดสอบ (รวมถึงเครื่องหมายวรรคตอน) จะเป็นส่วนเสริมที่ดีสำหรับความท้าทายนี้
AdmBorkBork

คำตอบ:




3

Clojure , 80 ไบต์

ลองออนไลน์! . TIO ไม่สนับสนุนไลบรารี String มาตรฐานของ Clojure ดังนั้นเวอร์ชันแรกจะแสดงข้อผิดพลาด "ไม่พบตัวพิมพ์เล็ก"

(fn[s](use '[clojure.string])(apply =(map first(map lower-case(split s #" ")))))

Ungolfed:

(defn tautogram? [s]
  (use '[clojure.string])
  (->> (split s #" ") ; Get words
       (map lower-case)
       (map first) ; Get first letter of each word
       (apply =))) ; And make sure they're all the same

ฉันสร้างเวอร์ชันที่หลีกเลี่ยงการนำเข้า:

(fn [s](apply =(map #(if(<(-(int %)32)65)(int %)(-(int %) 32))(map first(take-nth 2(partition-by #(= %\ )s))))))

 ; -----

(defn tautogram? [s]
  (->> s
       (partition-by #(= % \ )) ; Split into words
       (take-nth 2) ; Remove spaces
       (map first) ; Get first letter
       ; Convert to uppercased letter code
       (map #(if (< (- (int %) 32) 65) ; If attempting to uppercase puts the letter out of range,
               (int %) ; Go with the current code
               (- (int %) 32))) ; Else go with the uppercased  code
       (apply =))) ; And check if they're all equal

แต่มันเป็น112 Bytes


นี่คือวิธีแร็คเก็ตของฉัน:(define(f s)(apply char=?(map(λ(x)(char-upcase(car(string->list x))))(string-split s))))
Galen Ivanov

สั้นกว่ามากใน PicoLisp:(de f(s)(apply =(mapcar car(split(chop(lowc s))" "))))
Galen Ivanov

3

PowerShell , 57 50 41 ไบต์

(-split$args|% s*g 0 1|sort -u).count-eq1

ลองออนไลน์!

ใช้อินพุตและวางsplitไว้บนช่องว่าง วนลูปแต่ละคำและคว้าตัวอักษรตัวแรกโดยจับsubstrin gเริ่มต้นที่ตำแหน่ง0และไปสำหรับ1ตัวละคร แล้วsorts ตัวอักษร (กรณีตายตามค่าเริ่มต้น) กับ-uธง nique จะดึงออกมาเพียงหนึ่งสำเนาของแต่ละตัวอักษรและสามารถตรวจสอบcountรายชื่อผู้ที่มี-eqUAL 1ไป เอาท์พุทเป็นนัย

-9 bytes เพื่อ mazzy




1
@mazzy แก้ไขการพยายามเข้าใจเจตนา
Nahuel Fouilleul

@mazzy ฉันจะให้คุณโพสต์เวอร์ชัน regex เมื่อคำถามถูกเปิดใหม่ มันแตกต่างมากพอที่จะรับประกันคำตอบของตัวเอง
AdmBorkBork

ผมเห็นด้วย. แต่คำถามนี้ถูกพักไว้ดังนั้นฉันไม่สามารถสร้างคำตอบใหม่ได้
mazzy


2

Brachylogขนาด 5 ไบต์

ḷṇ₁hᵛ

ลองออนไลน์!

         The input
ḷ        lowercased
 ṇ₁      and split on spaces
   hᵛ    is a list of elements which all start with the same thing.

ตอนนี้ฉันเพิ่งสังเกตเห็นว่าสิ่งนี้จะต้องสามารถจัดการกับเครื่องหมายวรรคตอน แต่ไม่มีกรณีทดสอบที่คั่นด้วยเครื่องหมายวรรคตอนฉันไม่สามารถบอกได้ว่าสิ่งนี้ทำหรือไม่ยังคงใช้งานได้ ...
String


2

Perl 5 ( -p), 20 ไบต์

$_=!/^(.).* (?!\1)/i

TIO

ติดตามความคิดเห็นในกรณีที่เครื่องหมายวรรคตอนไม่ถูกต้อง (31 ไบต์)

$_=!/^\W*+(.).*(?=\b\w)(?!\1)/i

31 ไบต์

มิฉะนั้นจะมีวิธีการอื่นเช่นเดียวกันกับ 31 ไบต์:

$h{ord()%32}++for/\w+/g;$_=2>%h

อื่น ๆ 31 ไบต์


เครื่องหมายวรรคตอนล่ะ สิ่งที่เกี่ยวกับช่องว่างหรือเครื่องหมายวรรคตอนที่ strart ของสตริง?
mazzy

คำตอบนี้ใช้ได้กับกรณีทดสอบที่ได้รับอาจได้รับการปรับปรุงให้ดีขึ้นตามข้อกำหนด$_=!/^\W*+(.).*(?=\b\w)(?!\1)/i
Nahuel Fouilleul

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

1

JavaScript (Node.js) , 54 ไบต์

s=>!s.match(/\b\w+/g).some(p=s=>p-(p=Buffer(s)[0]&31))

ลองออนไลน์!

หรือ47 ไบต์หากแต่ละคำ (แต่คำแรก) รับประกันว่าจะนำหน้าด้วยช่องว่าง


หรือในหนึ่ง regexหรือมีช่องว่างแทน\W
Nahuel Fouilleul

@NahuelFouilleul ใช้การtestบันทึกไบต์อื่น
Shaggy

1
@NahuelFouilleul คุณควรโพสต์แยกกัน
Arnauld

โพสต์ในเวอร์ชัน perl แล้ว, ฉันไม่เชี่ยวชาญเช่น javascript, ฉันยินดีที่จะให้คำแนะนำแก่คุณ
Nahuel Fouilleul




1

Java, (36 ไบต์)

s->!s.matches("(?i)(.).* (?!\\1).*")

TIO


1
ผมคิดว่าการป้อนข้อมูลที่ได้รับอนุญาตให้เริ่มต้นด้วยพื้นที่และนี้ไม่ทำงานสำหรับการป้อนข้อมูลที่ต้องการที่
ซาร่า J

อันที่จริงมันไม่ใช่กรณีทดสอบ แต่สามารถจัดการเพิ่ม(?> *)ได้โดยใช้กลุ่มอะตอมเพื่อจับคู่พื้นที่ที่จุดเริ่มต้นและเพื่อหยุดการโจมตี เพียง `* 'ไม่ทำงานเพราะหลังจากล้มเหลวการแข่งขันจะย้อนกลับ` *' เพื่อจับคู่สตริงว่าง
Nahuel Fouilleul

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