Berapa lama kata Wales?


37

Tulis program atau fungsi yang menerima sebagai input string yang mewakili kata Welsh (UTF-8 kecuali ditentukan lain oleh Anda).

Berikut ini adalah semua huruf tunggal dalam bahasa Welsh:

a, b, c, ch, d, dd, e, f, ff, g, ng, h, i, j, l, ll, m, n, o, p, ph, r, rh, s, t, th, u, b, y

Mengutip Wikipedia ,

Sementara digraf ch , dd , ff , ng , ll , ph , rh , th masing-masing ditulis dengan dua simbol, semuanya dianggap sebagai huruf tunggal. Ini berarti, misalnya bahwa Llanelli (sebuah kota di South Wales) dianggap hanya memiliki enam huruf dalam bahasa Welsh, dibandingkan dengan delapan huruf dalam bahasa Inggris.

Huruf-huruf ini juga ada di Welsh, meskipun terbatas pada kosakata teknis yang dipinjam dari bahasa lain:

k, q, v, x, z

Surat dengan diakritik tidak dianggap sebagai huruf yang terpisah, tetapi fungsi Anda harus menerimanya dan dapat menghitungnya. Kemungkinan surat-surat tersebut adalah:

" ù, ẁ

(Ini berarti bahwa ASCII bukan penyandian input yang dapat diterima, karena tidak dapat menyandikan karakter ini.)

Catatan:

  • Ini kode golf.
  • Anda tidak harus menjelaskan kata-kata seperti llongyfarch , di mana ng bukan digraph, tetapi dua huruf terpisah. Kata ini memiliki sembilan huruf, tetapi Anda dapat salah menghitungnya menjadi delapan. (Jika Anda dapat menjelaskan kata-kata seperti itu, itu luar biasa, tetapi di luar cakupan tantangan ini.)
  • Input dijamin tidak memiliki spasi putih (kecuali jika Anda lebih suka dengan satu trailing newline (atau sesuatu yang lebih esoteris), dalam hal ini yang dapat diberikan). Tidak akan ada spasi putih internal.

Kasus uji:

  • Llandudno, 8
  • Llanelli, 6
  • Rhyl, 3
  • Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch, 50 (benar-benar 51, tapi kami akan menghitung 50)
  • Tiga, 3
  • Cymru, 5
  • Glyndŵr, 7

4
Bisakah input diberikan dalam semua huruf kecil?
ETHproduk

15
Istri saya yang merupakan penutur bahasa Welsh asli akan merekomendasikan bahwa J ditambahkan ke bagian surat "Dipinjam" karena sebenarnya bukan bagian dari alfabet Welsh
Rich Starkie

@RichStarkie Artikel Wikipedia agak kabur di bagian depan. Pemahaman saya adalah bahwa j digunakan dalam kata-kata yang dipinjam bahkan ketika kata itu tidak ada dalam kata aslinya, sehingga digunakan secara fonologis, yang menyiratkan bahwa pada tahap ini kata ini di-natualkan ke dalam bahasa. Saya telah melihat argumen serupa tentang v dalam bahasa Irlandia. Secara luas dianggap tidak menjadi bagian dari alfabet Irlandia, tetapi ada dalam beberapa nama Irlandia, seperti Ó Cuiv .
TRiG

1
Dan catatan kaki dalam artikel ortografi Welsh mencantumkan mh , nh , dan ngh sebagai grafem . Methinks Saya perlu membuka pertanyaan tentang Linguistics SE .
TRiG

3
Malu sudah terlambat; "Ngh" berlipis ganda mungkin membuatnya sedikit lebih rumit.
megaflop

Jawaban:


6

05AB1E , 24 23 21 byte

Kode:

u•éÓœ°D¥M™ù>•30B2ô0:g

Penjelasan:

u                      # Convert the input to uppercase.
 •éÓœ°D¥M™ù>•30B       # Compressed version of CHDDFFNGLLPHRHTH.
                         It convert the text between the •'s from base 214 to
                         base 10 and converts that to base 30.
                2ô     # Split into pieces of 2.
                  0:   # Replace each element that also occurs in the input by 0.
                    g  # Get the length of the processed input.

Menggunakan pengkodean CP-1252 . Cobalah online!


16

Retina , 23 byte

i`[cprt]h|dd|ff|ng|ll|.

Cobalah online!

Bahkan moar regex.


Mungkin ketidaktahuan saya tentang Retina, tetapi di mana keluaran dari panjang teks input? Dokumentasi tentang Retina tampaknya tidak menjelaskan bagaimana cara kerjanya di "Coba online!" situs
Xaero Degreaz

2
Outputnya implisit, karena satu-satunya baris adalah tahap Pertandingan, mengembalikan jumlah pertandingan. Di sini, regex cocok dengan setiap huruf Welsh.
user48538

Jadi dengan logika itu, maka setiap jawaban di bawah ini yang panjangnya secara eksplisit disebut dalam kode dapat disingkat?
Xaero Degreaz

2
@XaeroDegreaz Retina adalah satu-satunya bahasa yang secara otomatis menghitung kecocokan dan mencetaknya. Beginilah cara Retina, bahasanya, bekerja. Ini bukan cara kerja bahasa lain, dan bahasa-bahasa itu perlu memanggil fungsi panjangnya secara eksplisit untuk mendapatkan hasil yang benar.
isaacg

Terima kasih, saya mengerti sekarang. Setelah membaca lebih dalam dokumentasi saya melihat tahap "Match" default melakukan output ini.
Xaero Degreaz

5

JavaScript (ES6), 44 byte

x=>x.match(/[cprt]h|dd|ff|ng|ll|./gi).length

Jawaban sepele mungkin yang terpendek.


5

BASH 52 50 (sed + wc) 41

Terima kasih kepada Jordan

sed -r 's,dd|ff|ng|ll|[cprt]h,1,gi'|wc -m

Jika huruf besar diperlukan ini perlu idi akhir perintah sed. (Saya meninggalkannya karena semua "huruf tunggal" dalam pertanyaan adalah huruf kecil meskipun beberapa contoh tidak).


1
Kenapa grep -o .|wc -lbukannya wc -c?
Jordan

wc -c dihitung â sampai ẁ sebagai dua.
Riley

Ah, tentu saja. FWIW jika Anda menggunakan GNU atau BSD, wcAnda dapat menggunakan -muntuk menghitung karakter alih-alih byte.
Jordan

Bisakah Anda memindahkan cdari chdalam dengan [prt]? sed -r 's,dd|ff|ng|ll|[cprt]h,1,gi'|wc -m
megaflop

2
Sayang ([dfl])\1akan lebih lama dari dd|ff|ll. Satu lagi konsonan berlipat ganda akan mendukung versi pintar.
Toby Speight

4

Straw , 30 58 35 33 byte

<((?i:[cprt]h|dd|ff|ng|ll|.))0/$>

Ganti setiap kemunculan regex dengan 0, dan konversi dari unary ke desimal.

Sedihnya, Straw tidak bisa mengibarkan bendera ke regex. Saya lupa tentang ?flags:konstruknya

Cobalah online! (Kode yang ditambahkan adalah untuk memverifikasi semua kasus uji)


Bagaimana bahasa ini berbeda dari sesuatu seperti Retina?
Downgoat

@Downgoat Straw berbasiskan tumpukan: P
TuxCrafting


3

PowerShell v2 +, 52 50 48 byte

($args[0]-replace'dd|ff|ng|ll|[prtc]h',0).length

Apakah -replacepada semua huruf dua simbol-satu-huruf, perubahan mereka 0(dilakukan karena mengubah ke non-angka akan memerlukan tanda kutip), kemudian mendapatkan hasil .lengthdari string yang dihasilkan.

Uji kasus

PS C:\Tools\Scripts\golfing> 'Llandudno','Llanelli','Rhyl','Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch','Tŷr','Cymru','Glyndŵr'|%{"$_ --> "+(.\how-long-is-a-welsh-word.ps1 $_)}
Llandudno --> 8
Llanelli --> 6
Rhyl --> 3
Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch --> 50
Tŷr --> 3
Cymru --> 5
Glyndŵr --> 7

Saya tidak terbiasa dengan PowerShell, tetapi apakah Anda benar-benar membutuhkan tanda kurung [prtc]h?
Jordan

@ Jordan Tidak, saya tidak. Itu bukan hal PowerShell, itu hal yang saya-tidak-baik-di-regex. : D Terima kasih untuk golfnya!
AdmBorkBork


2

PHP, 56 Bytes

<?=preg_match_all("#[cprt]h|dd|ff|ll|ng|.#iu",$argv[1]);

1
Saya percaya [dfl]{2}pertandingan df,, lddll. Serta pertandingan yang dimaksud. dd|ff|llmemiliki panjang yang sama.
ETHproduk

1
Saya tahu bahwa kepercayaan Anda benar tetapi saya pikir keyakinan Anda bukanlah tipe kepercayaan. kelihatannya lebih dari jenis kowledge
Jörg Hülsermann

1
Alih-alih echo(spasi di akhir), gunakan <?=, yang menyimpan 2 byte. Juga, $ttidak diperlukan di sana, menghemat 3 byte lebih banyak.
Ismael Miguel

Thnak You Ismael. Saya pasti sedikit bingung karena saya tidak menghapus $ t
Jörg Hülsermann

2

Java 7, 156 73 byte

Banyak byte yang disimpan berkat @ OlivierGrégoire .

int c(String s){return s.replaceAll("[cprt]h|dd|ff|ng|ll","*").length();}

Kasus yang tidak disatukan & uji:

Coba di sini.

class M{
  static int c(String s){
    return s.replaceAll("[cprt]h|dd|ff|ng|ll", "*").length();
  }

  public static void main(String[] a){
    System.out.println(c("llandudno"));
    System.out.println(c("llanelli"));
    System.out.println(c("rhyl"));
    System.out.println(c("llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch"));
    System.out.println(c("tŷr"));
    System.out.println(c("cymru"));
    System.out.println(c("glyndŵr"));
  }
}

Keluaran:

8
6
3
50
3
5
7

Anda mengimpor dan kemudian Anda tidak menggunakan Matchersecara langsung? : o Juga, Matcherdapat didefinisikan dalam for loop.
Olivier Grégoire

1
Saya memiliki perasaan kuat yaitu return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()jauh, jauh lebih pendek. Bisakah ini bekerja?
Olivier Grégoire

Ya, itu berfungsi, dan 73 byte untuk versi Java 7 ( int c(String s){return s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length();}). Dan hanya 51 untuk versi Java 8 ( s->s.replaceAll("[cprt]h|dd|ff|ng|ll","a").length()).
Olivier Grégoire

1
@ OlivierGrégoire Terima kasih. Itu Matcherkecelakaan. Saya sudah benar dalam kode tes, tetapi tidak dalam kode golf ..>.> replaceAllPekerjaan Anda lebih baik, terima kasih.
Kevin Cruijssen

1

R, 54 byte

Sangat mirip dengan jawaban yang lain. Cocok dengan salah satu dari dua huruf karakter dan menggantinya dengan @dan kemudian menghitung jumlah karakter. Membaca input dari stdin. Menggunakan opsi ignore.case = TRUE(argumen ketiga ke gsub) untuk mencocokkan karakter huruf besar dan kecil.

nchar(gsub("ch|dd|ff|ng|ll|ph|rh|th","@",scan(,""),T))

Bonus

Keduanya gsubdan ncharmerupakan vektor yang artinya ini juga berfungsi pada vektor karakter, misalnya:

v=c("Llandudno","Llanelli","Rhyl","Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch","Tŷr","Cymru","Glyndŵr")
nchar(gsub("ch|dd|ff|ng|ll|ph|rh|th","@",v,T))

menghasilkan:

[1]  8  6  3 50  3  5  7


0

XQuery, 77 byte

declare variable$s external;count(tokenize($s,'[cprt]h|ff|dd|ll|ng|.','i'))-1

0

tcl, 71

proc L s {string le [regsub -all -nocase ch|dd|ff|ng|ll|ph|rh|th $s @]}

demo


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.