Bedakan antara Nouns Maskulin dan Feminin dalam Bahasa Prancis dalam 100 karakter

21

Anda harus menulis program yang sangat kecil dalam 100 karakter. Program Anda harus membedakan antara nomina Prancis maskulin dan feminin. Hasilnya harus unjika itu maskulin dan unefeminin. Seringkali, ada aturan statistik tertentu yang dapat Anda ikuti (misalnya jika diakhiri dengan "e", itu lebih cenderung feminin daripada maskulin).

Masukan :

Kata Prancis; mungkin terdiri dari huruf kecil dan garis kecil, termasuk huruf kecil dengan aksen.

Contoh input: ami

Keluaran :

unjika kata itu maskulin dan unejika kata itu feminin.

Contoh output: un

Anda tidak harus mendapatkan setiap kata dengan benar; tujuan Anda adalah seakurat mungkin.

Penilaian : Jawaban Anda harus dalam 100 karakter. Pernyataan seperti printatau console.logatau alerttidak tidak dihitung sebagai bagian dari keseluruhan byte Anda. Anda juga dapat menulis fungsi atau metode yang melakukan tugas ini, dalam hal ini beberapa byte pertama (misalnya f=x=>) yang merupakan bagian dari deklarasi fungsi tidak dihitung dengan total Anda. Skor total Anda adalah jumlah jawaban yang salah. Dasi dipecah berdasarkan ukuran kode.

Kata benda untuk diuji dengan:

un ami
un café
un chapeau
un concert
un crayon
un garage
un garçon
un lit
un livre
un mari
un musée
un oncle
un ordinateur
un pantalon
un piano
un pique-nique
un portable
un père
un sandwich
un saxophone
un stade
un stylo
un théâtre
un téléphone
un voisin
une botte
une boum
une chaise
une chaussette
une chemise
une clarinette
une copine
une femme
une fille
une glace
une heure
une lampe
une maison
une montagne
une personne
une piscine
une pizza
une radio
une raquette
une salade
une souris
une sœur
une table
une télé
une voiture
soktinpk
sumber
6
Saya akan menambahkan un squelette ke daftar hanya untuk membuat segalanya sulit.
200_sukses

Jawaban:

23

CJam, 0 salah, 32 29 byte

Kode ini menggunakan beberapa karakter aneh (beberapa di antaranya tidak dapat dicetak), tetapi semuanya baik-baik saja dalam rentang ASCII yang diperluas. Jadi sekali lagi, saya menghitung setiap karakter sebagai satu byte.

"un"'el2b"zPB:  ":i+:%2/*

Karena karakter yang tidak patut dicetak, saya yakin Stack Exchange menelan beberapa, jadi Anda mungkin ingin menyalin kode dari penghitung karakter (ini menunjukkan byte dengan pengkodean UTF-8, yang suboptimal untuk tantangan ini; juga, tautannya tidak t tampaknya berfungsi di Firefox, tetapi berhasil di Chrome).

Uji di sini.

Setelah beberapa diskusi lagi dalam obrolan, kami pikir golf regex tidak akan membawa kami lebih jauh. Jadi mengikuti saran saya sebelumnya (bercanda), kami mulai melihat ke dalam memanipulasi kode karakter kata-kata dengan fungsi tertentu, sehingga semua kata dari satu kelompok akan menghasilkan angka dengan beberapa properti yang mudah untuk diperiksa. Dan kami menjadi lebih beruntung dari yang kami harapkan! Inilah yang dilakukan kode terhadap kata-kata:

  • Konversi karakter secara implisit dalam kata ke poin kode mereka.
  • Menginterpretasikannya sebagai angka pada basis 2 (ya, angka akan jauh lebih besar dari 0 atau 1, tetapi CJam dapat mengatasinya).
  • Berulang kali mengambil hasil modulo ... nomor-nomor berikut: [133, 122, 80, 66, 58, 26, 20, 14, 9, 4]. Urutan angka ini sendiri dikodekan sebagai titik kode string (ini adalah tempat karakter aneh dan tidak patut dicetak).
  • Seolah-olah dengan sihir, semua 25 nomina maskulin menghasilkan 0atau 1, dan semua 25 nomina feminin menghasilkan 2atau 3dengan prosedur ini. Jadi jika kita membaginya dengan 2(pembagian integer) kita mendapatkan nol untuk kata benda maskulin dan yang untuk kata benda feminin.

Untuk mengatasinya, kami mendorong "un"tumpukan, kami mendorong satu e. Kemudian kita membaca kata input dari STDIN dan melakukan perhitungan di atas, dan akhirnya mengalikan ehasilnya.

Saya belum pernah melipat modulo ke daftar mana pun sebelumnya, dan saya merasa seperti tidak akan pernah lagi ...

Terima kasih banyak untuk xnor dan Sp3000 karena telah melempar ide dan membantu mencari rantai pembagi.

Martin Ender
sumber
Tidak hanya lebih pendek, tetapi 2 menit lebih cepat. Menyeramkan!
Dennis
@ sudo;) ... salah satu waktu yang jarang saya dapat mengalahkan Anda ... Saya akan sangat tertarik pada penjelasan Anda :) :)
Martin Ender
11
Tunggu, saya bingung. Jika sihir ada, mengapa Anda membuangnya di situs tantangan pemrograman konyol dan tidak menyelesaikan perdamaian dunia atau sesuatu? (Tidak, tapi serius, woah . +1)
Gagang pintu
22

Ruby, 0 salah, 63 56 53 52 51 50 byte

Semua karakter dalam ASCII yang diperluas , khususnya ISO 8859-1 , jadi saya menghitung setiap karakter sebagai satu byte.

f=->s{s[/la|tt|i.e|[égdzœu]..$|^b|^f|so|^ta/]?'une':'un'}

Sepertinya set tes Anda agak terlalu pendek. Saya telah membuat regex dengan pegolf meta regex Peter Norvig .

Anda dapat memanggil fungsi di atas seperti f["ami"]. Anda dapat menggunakan alat uji ini untuk memeriksa semua kasus uji:

puts "ami café chapeau concert crayon garage garçon lit livre mari musée 
      oncle ordinateur pantalon piano pique-nique portable père sandwich 
      saxophone stade stylo théâtre téléphone voisin botte boum chaise 
      chaussette chemise clarinette copine femme fille glace heure lampe 
      maison montagne personne piscine pizza radio raquette salade souris 
      sœur table télé voiture".split.map{|s|f[s]+" "+s}

Uji di Coding Ground.

Sunting: Menggunakan skrip kedua Peter Norvig saya menemukan regex yang berbeda, yang sebenarnya satu byte lebih lama, tetapi saya dapat mempersingkat dua byte dengan tangan.

Sunting: Sp3000 mengatur regex pegolf yang dia tulis untuk tantangan regex saya baru-baru ini di atasnya, dan menemukan 36 35 34 byte regex untuk saya gunakan. Terima kasih untuk itu!

Martin Ender
sumber
2
Menghidupkan kembali mimpi buruk golf meta regex di sini karena tablemerupakan substring dari portable, dan beralih yang diatur agar cocok tidak sangat berguna karena set kedua tampaknya lebih mudah untuk mencocokkan ...
Sp3000
13

CJam, 0 kesalahan ( 36 32 29 28 byte)

{"un"oEb72^"+ÕåWïº"583b2b='e*o}:F;

Ini adalah fungsi bernama, jadi saya hanya menghitung kode bagian dalam. Juga, omerupakan pernyataan cetak, sehingga tidak berkontribusi pada jumlah byte.

Coba kasus uji dalam juru bahasa CJam .

Bagaimana itu bekerja

"un"o       " Print 'un'.                                                  ";
Eb          " Consider the input a base 14 number.                        ";
72^         " XOR the result with 72.                                     ";
"+ÕåWïº"    " Push that string.                                           ";
583b2b      " Convert from base 583 to base 2.                            ";
=           " Retrieve the corresponding element (0 or 1) from the array. ";
'e*o        " Print 'e' that many times.                                  ";

Hanya fungsi hash dan pencarian tabel.

Dennis
sumber