Eh, apakah ini haiku?


19

Jadi, Anda ingin membuat haiku, tetapi Anda tidak yakin apakah itu mengikuti aturan suku kata untuk haiku.

Saya tidak bisa repot menulis uraian yang tepat seperti yang biasa saya lakukan, jadi Anda harus puas dengan ini. Mari kita terjebak.

Menemukan haiku di alam liar

Untuk keperluan tantangan ini, kami akan memeriksa apakah puisi yang diberikan memenuhi kriteria ini:

  • Ada tiga garis.
  • Baris pertama memiliki 5 suku kata.
  • Baris kedua memiliki 7 suku kata.
  • Baris ketiga memiliki 5 suku kata.

Setiap baris terdiri dari satu kata atau lebih, dipisahkan oleh kelompok spasi. Kata-kata ini belum tentu merupakan kata-kata bahasa Inggris yang valid.

Setiap kata dibagi menjadi suku kata, dan kemudian suku kata tersebut dihitung untuk mendapatkan jumlah suku kata total baris.

Suku kata terdiri dari 2 atau 3 bagian: awal, akhir, dan mungkin tengah. Setiap bagian adalah sekelompok konsonan (juga dikenal sebagai gugus konsonan, seperti s, skatau spl) atau sekelompok vokal (seperti i, eaatau oui).

Jika yang awalnya adalah sekelompok konsonan, yang di tengah adalah sekelompok vokal dan yang terakhir adalah sekelompok konsonan. Jika awal adalah sekelompok vokal, akhirnya akan menjadi sekelompok konsonan dan tidak akan ada tengah.

Misalnya, kata exampletersebut terdiri dari tiga suku kata ex,, amdan ple. pletidak memiliki akhir karena dipotong pada akhir kata.

Sebagai contoh lain, kata tersebut syllablejuga memiliki tiga suku kata syll,, abldan e, yang juga tidak memiliki akhiran.

Sebagai satu contoh terakhir, kata tersebut wordmemiliki satu suku kata word, yang berakhir dengan sekelompok konsonan.

Tantangan

Diberikan string, daftar string, daftar daftar atau format wajar lainnya yang mewakili sebuah puisi dengan setidaknya satu baris, tentukan apakah itu memenuhi kriteria haiku yang diuraikan di atas dan kembalikan hasilnya.

Anda dapat mengembalikan hasilnya dalam format berikut:

  • Nilai kebenaran jika puisi itu adalah haiku dan yang salah sebaliknya.
  • Nilai palsu jika puisi itu adalah haiku dan yang benar sebaliknya.
  • Nilai dari rentang nilai terbatas yang ditentukan dalam pengiriman jika puisi tersebut adalah haiku dan nilai dari kisaran nilai terbatas yang saling eksklusif juga ditentukan dalam pengiriman.

Anda juga dapat menganggap puisi itu tidak mengandung karakter non-alfabet, tetapi Anda mungkin tidak menganggap bahwa itu sepenuhnya dalam huruf besar atau kecil.

Untuk keperluan tantangan ini, Yadalah vokal.

Uji kasus

Sejujurnya

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

Palsu

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

Mencetak gol

Karena ini adalah
. Jawaban terpendek akan menang.
Semoga berhasil bagi Anda semua



Jawaban:


4

Jelly ,  25  23 byte

-2 Terima kasih kepada Erik the Outgolfer (gunakan daftar baris sebagai masukan)

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

Tautan monadik mengambil daftar daftar karakter (garis) dan mengembalikan daftar daftar nol dan satu. Haiku yang valid akan menjadi panjang 3 dan sekali salah satu daftar paling dalam yang merupakan nol tunggal diganti dengan yang tunggal, jumlah daftar yang diratakan masing-masing adalah 5, 7, dan 5. Formasi (apakah run huruf adalah konsonan dan hanya mengambil 8 kata pertama dari masing-masing hingga hanya 4 baris) memastikan hanya ada hingga terbatas masing-masing rentang yang valid dan tidak valid.

Cobalah online! atau lihat test-suite (bahkan lebih membingungkan!)


Berikut ini adalah versi  32  byte yang jauh lebih mudah digunakan , cukup dengan mengeluarkan 1 atau 0:

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

Coba yang ini atau lihat test-suite-nya .


Saya tidak berpikir "kisaran" kemungkinan non-Haiku terbatas - Anda dapat memiliki jumlah kata / baris yang tidak terbatas di dalamnya.
Ørjan Johansen

Oh sial ketika perubahan itu dibuat saya pikir itu hanya kisaran haiku yang perlu terbatas. Itu mengembalikannya ke 32 byter, saya pikir.
Jonathan Allan

OK ditujukan untuk empat byte dengan membatasi kata per baris menjadi delapan dan baris menjadi empat.
Jonathan Allan

Saya pikir Anda dapat menghapus Ỵµ, karena Anda dapat mengambil daftar garis.
Erik the Outgolfer

3

JavaScript (ES6), 84 75 byte

Mengambil input sebagai daftar daftar kata. Pengembalian trueuntuk haiku atau falseuntuk non-haiku.

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

Uji kasus


2

Retina , 49 byte

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

Cobalah online!

Output 1untuk haiku, 0untuk non-haiku.


@FryAmTheEggman Itu berhasil, kecuali saya harus menambahkan ^dan $karena xhaikus berturut-turut akan memberikan xsebagai string.
fireflame241

1
Saya pikir ini mungkin berhasil selama 45 byte.
Neil

2

Python 2 , 126 125 120 121 byte

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*

Cobalah online!


Suntingan terakhir Anda melanggar persyaratan bahwa kata konsonan-saja dihitung sebagai 1 suku kata.
Ørjan Johansen

@ Ørjan Johansen: Diperbaiki; Terima kasih!
Chas Brown


1
Anda dapat melepas beberapa byte mudah dengan mengambil input sebagai daftar baris, dan mengganti s.split () dengan hanyas
Rɪᴋᴇʀ


1

Bersih , 162 ... 115 byte

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]

Menentukan fungsi @, mengambil [[[Char]]](daftar daftar kata), dan memberi Bool.
Kembali Trueketika input adalah haiku, Falsejika tidak.

Cobalah online!


Tampaknya gagal pada kasus sudut kata konsonan-saja.
Ørjan Johansen

@ ØrjanJohansen diperbaiki
Οurous

1

Mathematica 119 Bytes

Berikut adalah versi yang sesuai dengan aturan suku kata yang diberikan:

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

Berikut adalah versi 83 byte yang sebenarnya menghitung suku kata:

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

misalnya

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

kembali Falsekarena baris kedua memiliki enam suku kata daripada tujuh yang diperlukan.


Ini gagal karena tantangan secara eksplisit mendefinisikan jumlah suku kata sendiri, yang tidak menggunakan aturan bahasa Inggris biasa.
Ørjan Johansen

Yah terima kasih untuk tidak downvoting. Saya melihat upaya definisi suku kata, tetapi tidak jelas. Saya menduga "satu" memiliki dua suku kata dengan definisi ini. Sepertinya orang hanya menghitung vokal yang berdekatan.
Kelly Lowder

Hampir, tetapi kata-kata tanpa huruf vokal dianggap sebagai satu suku kata. Lihat komentar pertanyaan. Saya kira itu hanya membingungkan tentang apa yang harus dilakukan tentang kelompok konsonan, tetapi itu tidak benar-benar mempengaruhi penghitungan akhir.
Ørjan Johansen

"satu" memiliki dua vokal, dan keduanya tidak bersebelahan.
Kelly Lowder

Benar, jadi mereka dianggap sebagai dua suku kata.
Ørjan Johansen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.