เอ่อมันเป็นไฮกุหรือเปล่า?


19

ดังนั้นคุณต้องการสร้างไฮกุ แต่คุณไม่แน่ใจว่าเป็นไปตามกฎของพยางค์สำหรับไฮกุหรือไม่

ฉันไม่อยากจะเขียนสิ่งที่ไม่เหมาะสมเหมือนปกติดังนั้นคุณต้องทำสิ่งนี้ มาติดอยู่ที่นั่น

ค้นหาไฮกุออกมาในป่า

สำหรับจุดประสงค์ของการท้าทายนี้เราจะทำการตรวจสอบว่าบทกวีที่กำหนดตรงตามเกณฑ์เหล่านี้หรือไม่:

  • มีสามบรรทัด
  • บรรทัดแรกมี 5 พยางค์
  • บรรทัดที่สองมี 7 พยางค์
  • บรรทัดที่สามมี 5 พยางค์

แต่ละบรรทัดประกอบด้วยคำอย่างน้อยหนึ่งคำคั่นด้วยกลุ่มของช่องว่าง คำเหล่านี้ไม่จำเป็นต้องเป็นคำภาษาอังกฤษที่ถูกต้อง

แต่ละคำจะถูกแบ่งออกเป็นพยางค์และจากนั้นจะนับพยางค์เหล่านั้นเพื่อนับจำนวนพยางค์ทั้งหมดของบรรทัด

พยางค์มี 2 หรือ 3 ส่วน: จุดเริ่มต้นจุดสิ้นสุดและอาจอยู่ตรงกลาง แต่ละส่วนจะมีทั้งกลุ่มของ consonsants (ยังเป็นที่รู้จักพยัญชนะกลุ่มเช่นs, skหรือspl) หรือกลุ่มของสระ (เช่นi, eaหรือoui)

หากจุดเริ่มต้นเป็นกลุ่มของพยัญชนะตรงกลางจะเป็นกลุ่มของเสียงสระและท้ายที่สุดจะเป็นกลุ่มของพยัญชนะ หากการเริ่มต้นเป็นกลุ่มของเสียงสระปลายจะเป็นกลุ่มของพยัญชนะและจะไม่มีตรงกลาง

ยกตัวอย่างเช่นคำว่าexampleถูกสร้างขึ้นจากสามพยางค์ex, และam ไม่สิ้นสุดในขณะที่มันถูกตัดสั้นในตอนท้ายของคำpleple

เป็นอีกหนึ่งตัวอย่างคำว่าsyllableยังมีสามพยางค์syll, ablและeซึ่งยังไม่เคยมีใครตอนจบ

สำหรับตัวอย่างสุดท้ายหนึ่งคำwordมีหนึ่งพยางค์wordซึ่งลงท้ายด้วยกลุ่มพยัญชนะ

ความท้าทาย

รับสตริง, รายการของสตริง, รายการของรายการหรือรูปแบบที่เหมาะสมอื่น ๆที่เป็นตัวแทนของบทกวีที่มีอย่างน้อยหนึ่งบรรทัดพิจารณาว่ามันเป็นไปตามเกณฑ์ของไฮกุที่ระบุไว้ข้างต้นและส่งกลับผล

คุณสามารถส่งคืนผลลัพธ์ในรูปแบบใด ๆ ต่อไปนี้:

  • คุณค่าความจริงหากบทกวีเป็นไฮกุและเป็นเท็จอย่างอื่น
  • ค่าเท็จถ้าบทกวีเป็นไฮกุและเป็นความจริงอย่างอื่น
  • ค่าจากช่วง จำกัด ของค่าที่ระบุในการส่งถ้าบทกวีเป็นไฮกุและค่าจากช่วง จำกัด เฉพาะของค่าซึ่งกันและกันซึ่งระบุไว้ในการส่งด้วย

คุณอาจสมมติว่าบทกวีไม่มีตัวอักษรที่ไม่ใช่ตัวอักษร แต่คุณอาจไม่คิดว่ามันเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กทั้งหมด

สำหรับวัตถุประสงค์ของการท้าทายนี้Yคือเสียงสระ

กรณีทดสอบ

Truthy

This is a haiku
Yes it truly is one
See what I did man

I am so tired
of writing this already
when can I stop this

Writing another
Of these horrific things
Come on please

Consonant only
Counts as one syllable
ghjk tgh knmb wrts vbc

Falsy

oh boy writing non haiku is so much easier

This is
so good
on my
poor dear brain

The syllables do not match
at least I do not think so
I have not checked

It does not really matter
these test cases will help
At least I think they will

I am done here
This is enough
Goodbye

เกณฑ์การให้คะแนน

ตั้งแต่นี้เป็น
คำตอบที่สั้นที่สุดจะชนะ
ขอให้ทุกคนโชคดี



คำตอบ:


4

เยลลี่ ,  25  23 ไบต์

-2 ขอบคุณ Erik the Outgolfer (ใช้รายการของบรรทัดเป็นอินพุต)

e€Øy0;ŒgP€
ḲLÐfÇ€ḣ8µ€ḣ4

ลิงก์ monadic ที่ใช้รายการรายการของอักขระ (บรรทัด) และส่งคืนรายการของรายการของศูนย์และรายการ ไฮกุที่ถูกต้องจะมีความยาว 3 และเมื่อใดก็ตามที่มีรายการที่ลึกที่สุดซึ่งเป็นศูนย์เดียวจะถูกแทนที่ด้วยหนึ่งเดียวผลรวมของรายการที่แบนจะเป็น 5, 7 และ 5 ตามลำดับ รูปแบบ (ไม่ว่าจะเป็นตัวอักษรวิ่งเป็นพยัญชนะและเพียง 8 คำแรกของแต่ละถึง 4 บรรทัดเท่านั้น) ให้แน่ใจว่ามีเพียงขอบเขตที่ถูกต้องและไม่ถูกต้องของแต่ละช่วง

ลองออนไลน์! หรือดู (มากยิ่งขึ้นทำให้เกิดความสับสน!)การทดสอบในตัว


นี่คือการใช้ 32  30 ไบต์รุ่นที่ง่ายขึ้นเพียงแค่ส่ง 1 หรือ 0:

e€Øy0;ŒgP€SȯL$
ḲLÐfÇ€Sµ€⁼5,7,5

ลองคนนี้หรือดูของการทดสอบในตัว


ฉันไม่คิดว่า "ช่วง" ของความเป็นไปได้ที่ไม่ใช่ไฮกุมี จำกัด - คุณสามารถมีคำ / บรรทัดได้ไม่ จำกัด จำนวน
Ørjan Johansen

โอ้แช่งเมื่อมีการเปลี่ยนแปลงฉันคิดว่ามันเป็นเพียงช่วงไฮกุที่ต้องมี จำกัด ที่ทำให้มันกลับไปที่ 32 byter ฉันคิดว่า
Jonathan Allan

ตกลงถูกกำหนดไว้สำหรับสี่ไบต์โดย จำกัด คำต่อบรรทัดที่แปดและสี่บรรทัด
Jonathan Allan

ฉันคิดว่าคุณสามารถลบỴµได้เนื่องจากคุณสามารถบันทึกรายการได้
Erik the Outgolfer

3

JavaScript (ES6), 84 75 ไบต์

รับอินพุตเป็นรายการของคำ ส่งคืนtrueสำหรับไฮกุหรือfalseสำหรับที่ไม่ใช่ไฮกุ

a=>a.map(s=>(s.map(w=>w.match(/[aeiouy]+/gi))+'').split`,`.length)=='5,7,5'

กรณีทดสอบ


2

เรติน่า 49 ไบต์

i`[aeiouy]+
1
T`lL`2
2*12+
3
[12]+
3
%M`3
^5¶7¶5$

ลองออนไลน์!

ผลผลิต1สำหรับไฮกุ0สำหรับผู้ที่ไม่ไฮกุ


@FryAmTheEggman ใช้งานได้ยกเว้นฉันต้องเพิ่ม^และ$เพราะไฮกุสxในแถวจะให้xเป็นสตริง
fireflame241

1
ผมคิดว่านี้การทำงานอาจจะเป็นเวลา 45 ไบต์
Neil

2

Python 2 , 126 125 120 121 ไบต์

lambda s:[len(split('\s+',sub('[aeiouy][^aeiouy ]+','X ',t,0,I).strip()))for t in s.split('\n')]==[5,7,5]
from re import*

ลองออนไลน์!


การแก้ไขครั้งล่าสุดของคุณทำลายข้อกำหนดที่คำพยัญชนะเท่านั้นนับเป็น 1 พยางค์
Ørjan Johansen

@ Ørjan Johansen: แก้ไข; ขอบคุณ!
Chas Brown


1
คุณสามารถตีกอล์ฟง่ายๆไบต์โดยการป้อนข้อมูลเป็นรายการของบรรทัดและแทนที่ s.split () ด้วยเพียงs
Rɪᴋᴇʀ


1

ทำความสะอาด , 162 ... 115 ไบต์

import StdEnv,StdLib
@t=[sum[max(sum(map hd(group[sum[1\\v<-:"AaEeIiOoUuYy"|c==v]\\c<-w])))1\\w<-l]\\l<-t]==[5,7,5]

กำหนดฟังก์ชั่น@การ[[[Char]]](รายชื่อของรายการของคำ) Boolและให้
ส่งคืนTrueเมื่ออินพุตเป็นไฮกุหรือเป็นFalseอย่างอื่น

ลองออนไลน์!


ดูเหมือนว่าจะล้มเหลวในกรณีมุมคำพยัญชนะเท่านั้น
Ørjan Johansen

@ ØrjanJohansenแก้ไขแล้ว
Οurous

1

Mathematica 119 ไบต์

นี่คือรุ่นที่สอดคล้องกับกฎที่กำหนดไว้สำหรับพยางค์:

Tr/@Map[Length@StringCases[#,("a"|"e"|"i"|"o"|"u"|"y")..]/. 0->1&,(s=StringSplit)/@s[ToLowerCase@#,"\n"],{2}]=={5,7,5}&

นี่คือรุ่น 83 ไบต์ที่นับพยางค์จริง ๆ :

Tr/@Map[Length@WordData[#,"Hyphenation"]&,(s=StringSplit)/@s[#,"\n"],{2}]=={5,7,5}&

เช่น

%@"This is a haiku
Yes it truly is one
See what I did man"

ส่งคืนFalseเนื่องจากบรรทัดที่สองมีหกพยางค์แทนที่จะเป็นเจ็ดที่ต้องการ


สิ่งนี้ล้มเหลวเนื่องจากความท้าทายได้กำหนดจำนวนพยางค์ของตัวเองอย่างชัดเจนซึ่งไม่ได้ใช้กฎภาษาอังกฤษทั่วไป
Ørjan Johansen

ดีขอบคุณที่ไม่ได้ลงคะแนน ฉันเห็นความพยายามในการนิยามพยางค์ แต่มันไม่ชัดเจน ฉันเดาว่า "หนึ่ง" มีสองพยางค์ตามคำจำกัดความนี้ ดูเหมือนว่าผู้คนกำลังนับสระที่ต่อเนื่องกัน
Kelly Lowder

เกือบ แต่คำที่ไม่มีสระจะนับเป็นหนึ่งพยางค์ ดูความคิดเห็นของคำถาม ฉันคิดว่ามันเป็นเพียงความสับสนเกี่ยวกับสิ่งที่ต้องทำเกี่ยวกับกลุ่มพยัญชนะ แต่นั่นไม่ได้ส่งผลกระทบต่อการนับครั้งสุดท้ายจริง ๆ
Ørjan Johansen

"หนึ่ง" มีสองเสียงสระและไม่ต่อเนื่องกัน
Kelly Lowder

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