Tulis program untuk memainkan permainan nama .
Memasukkan
Program Anda harus menerima satu nama sebagai input dari pengguna dengan cara tertentu (misalnya membaca dari input standar atau sebagai argumen baris perintah). Anda dapat mengasumsikan bahwa nama tersebut adalah satu kata yang terdiri dari huruf besar diikuti oleh satu atau lebih huruf kecil.
Keluaran
Program Anda harus mencetak sajak untuk nama yang diberikan, seperti yang dijelaskan dalam lagu, dengan mengisi templat berikut:
(X), (X), bo-b(Y)
Banana-fana fo-f(Y)
Fee-fi-mo-m(Y)
(X)!
Di sini, (X)
adalah nama asli, dan (Y)
nama dalam huruf kecil dengan setiap konsonan awal dihapus.
Namun, ada satu pengecualian. Jika nama aslinya dimulai dengan m
, f
atau b
, itu harus ditulis tanpa surat ini pada baris yang sesuai. Misal jika namanya Bob
, garis "b" harus diakhiri dengan bo-ob
. Perhatikan bahwa dalam kasus ini, konsonan lain disimpan, jadi untuk Fred
itu fo-red
, tidak fo-ed
.
Contohnya
Shirley:
Shirley, Shirley, bo-birley
Banana-fana fo-firley
Fee-fi-mo-mirley
Shirley!
Arnold:
Arnold, Arnold, bo-barnold
Banana-fana fo-farnold
Fee-fi-mo-marnold
Arnold!
Bob:
Bob, Bob, bo-ob
Banana-fana fo-fob
Fee-fi-mo-mob
Bob!
Fred:
Fred, Fred, bo-bed
Banana-fana fo-red
Fee-fi-mo-med
Fred!
Mencetak gol
Kode terpendek menang.
Y
ditangani sebagai vokal, begituYves
juga sepertiIves
atauArnold
.Y
sebagai vokal hanya jika diikuti oleh konsonan. Setidaknya itu harus mencakup kasus-kasus itu.Jawaban:
vi,
118115Kode mencakup 5 karakter kontrol, yang saya masukkan ke dalam tanda kurung. Masing-masing hanya dihitung sebagai karakter tunggal terhadap jumlah karakter.
EDIT: Memindahkan join pertama (J) ke kemudian dan mengubah paste-before (P) ke paste-after (p) menyelamatkan saya 1 karakter. Juga, tidak menangkap o- di regex menyelamatkan saya 2 karakter lagi.
sumber
SNOBOL4,
437430 byteTidak tergabung (ditambah saya menambahkan prompt; yang di atas hanya menunggu nama yang akan diketik):
Ini adalah program SNOBOL pertama yang pernah saya tulis.
SNOBOL adalah bahasa berorientasi garis, seperti FORTRAN, COBOL, atau BASIC. Setiap baris terdiri dari label opsional yang dimulai pada kolom 1, kode untuk baris yang dapat melibatkan penugasan dan pencocokan pola, dan cabang opsional. Ya, garis diakhiri dengan GOTO (opsional). Mereka datang dalam dua bentuk:
Cabang untuk diberi label
TARGET
, sementaraCabang ke
SUCCESS
jika pola cocok berhasil, atauFAILURE
sebaliknya. Anda juga bisa hanya cabang pada kesuksesan dan jatuh ke baris berikutnya pada kegagalan, atau sebaliknya.Garis lanjutan dimulai dengan a
+
atau.
. Komentar dimulai dengan a*
.Bagaimana cara kerjanya?
Baca dalam nama, ubah menjadi huruf kecil. Atur B-, F-, dan M-nama dengan asumsi itu dimulai dengan vokal. Kemudian periksa apakah itu dimulai dengan rentang konsonan. Jika tidak, kami siap berangkat! Jika demikian, cabut konsonan utama dan atur nama B-, F-, dan M dengan asumsi itu tidak dimulai dengan huruf-huruf itu. Akhirnya, periksa apakah itu dimulai dengan masing-masing huruf pada gilirannya, memperbaiki nama-nama yang diperlukan. Maka kita siap untuk memainkan permainan nama!
Contoh dijalankan:
Saya menjalankan ini pada emulator mainframe Hercules S / 370 menjalankan 6.0a rilis Sistem Terminal Michigan menggunakan SNOBOL4 versi 3.10 dari 1 April 1973 dibangun untuk MTS pada 1 Mei 1975, tetapi mungkin ada cara yang lebih mudah untuk menjalankan SNOBOL4 pada sistem modern. :)
Sunting: Menghapus cabang sukses yang berlebihan yang setara dengan fallthrough (saya tidak menyadari bahwa saya dapat menempatkan hanya cabang kegagalan dengan sendirinya) yang menghilangkan label cabang yang tidak dibutuhkan, dan mengubah goto tanpa syarat menjadi cabang kegagalan pada baris sebelumnya, untuk penghematan 7 byte.
Sekarang TIO memiliki dukungan SNOBOL4 Anda dapat mencobanya secara online! Catatan: Ini menunjukkan ukuran sebagai 429 daripada 430 karena ketika saya menempelkannya di sana, umpan baris terakhir dihapus. Saya mencoba mengubah garis kelanjutan (yang dimulai dengan
+
) menjadi satu baris, yang tidak sah pada versi mainframe karena garis itu terlalu panjang, dan itu bekerja dan membawanya ke 427. Jelas CSNOBOL4 memungkinkan garis yang lebih panjang. Saya akan meninggalkan skor saya di 430, karena itu berapa banyak byte skrip ada di komputer saya, dan selain itu, SNOBOL sangat tidak kompetitif.sumber
N = TRIM(INPUT)
bisaN =TRIM(INPUT)
.J , 149 karakter
sumber
Javascript, 115 Bytes
Penjelasan:
fungsi ini mengembalikan nama tanpa konsonan awal
Maka sisanya adalah fungsi mengembalikan string string lengkap.
Sunting: dari 119 hingga 115 byte berkat @Martin Ender
sumber
/[aeiou]\w*/i
.JavaScript, <s>119</s> 115 bytes
di header untuk memberi orang petunjuk bahwa pada awalnya ada versi yang lebih panjang jika mereka tertarik.Clojure , 292 karakter setelah diminimalkan
Ini adalah upaya pertama, hampir positif saya bisa membuatnya lebih jauh:
Saya baru belajar clojure dan berpikir akan menyenangkan untuk mencobanya. Inilah alasan saya:
sumber
Scala 281
Saya mengganti (X) dan (Y) dalam pola dengan
#
dan012
.S
hanyalah nama baru untukString
dana(b,c,d)
merupakan definisi singkat untukb.replaceAll(c,d)
Doa ujian:
Dan ungolfed:
sumber
Python 3,
148145142 byteYa saya tahu ini agak terlambat tapi ...
Ia menggunakan f-string baru untuk memformat string yang dihasilkan.
Saya kira TIO belum mendukung f-string, sayangnya.
Versi lama
Disimpan 3 byte berkat @officialaimm
sumber
Sed, 162 byte
Saya tidak tahu sed dengan baik sebelum saya melakukan ini. Aku, uh, tahu itu jauh lebih baik, sekarang. Sed pertama dalam pipa menggandakan nama tiga kali sehingga menjadi "Bob \ nBob \ nBob \ nBob" bukan hanya "Bob". Sed berikutnya melakukan pengangkatan berat.
Mengharapkan input pada stdin like
echo Name |sed ...
Tidak Disatukan:
Beberapa catatan. Empat pertandingan pertama, 1s, 2s, 3s, 4s, mengubah output menjadi sesuatu yang tidak benar. Bob telah menjadi bo-bbob, Fred menjadi f-ffred, dan Mike telah menjadi mo-mmike. Kay akan menjadi mo-mkay, mkay?
Kemudian, kita perlu mengganti bo-bbob dengan bo-ob, atau bo-bkay dengan bo-bay. Untuk melakukan itu, kita dapat menggunakan fitur di mana kita melakukan substitusi seseorang ///, dan kemudian cabang jika itu berhasil, melompati yang kedua yang sekarang kita ingin lewati. Tetapi jika gagal, kami ingin jatuh melalui cabang dan melakukan penggantian berikutnya.
Perintah t [label] melakukan itu, hanya bercabang jika s /// sebelumnya cocok. Tetapi pada awal skrip saya sudah melakukan satu s /// untuk setiap baris (angka utama dalam 1s, 2s, dll adalah alamat; artinya perintah hanya dilakukan jika alamatnya cocok). Jadi, apa pun baris yang kita pakai, 1, 2, 3, atau 4, setidaknya satu s /// telah cocok. (Saya mencoba melakukannya sebaliknya, memijat nama-nama dan kemudian menambahkan "Pisang-dll." Setelah itu, tetapi macet seperti itu, dan mencoba melakukannya sekaligus akan menyebabkan beberapa pengulangan.) Untungnya, bendera dapat dibersihkan dengan mengambil cabang, jadi kami melakukannya dengan "tx;: x". tx bercabang ke label x, dan: x adalah label x.
Wah! Itu membersihkan langit-langit untuk dua pergantian final. Kami mencoba satu, dan jika berhasil kami bercabang di atas yang lain, kalau tidak kita lakukan yang kedua. Apa pun caranya, kita berakhir pada label: z dan buffer pola berisi satu baris lirik yang dicetak ke stdout.
Terima kasih telah menipu saya untuk menghabiskan waktu yang cukup dengan halaman manual sed dan manual Texinfo untuk akhirnya mengerti bagaimana melakukan lebih dari sed s / foo / bar /
sumber
|
dan semua. Mungkin saya harus memanggil ini bash / sed, atau menghitungnya secara berbeda? Saya tidak tahu Saya senang dengan itu apa adanya, tetapi beri tahu saya apakah itu harus berbeda dengan standar PPCG.Python, 161
Baru sadar kode saya gagal ...
- Tidak menghapus konstanta awal.
- Tidak mengelola bisnis 'bo-ob'.
Ini yang terjauh yang saya dapat, mungkin seseorang bisa menyelesaikannya.
sumber
Groovy, 146
sumber
R, 189 karakter
Tetapi dengan hanya satu karakter lagi, Anda dapat memasukkan banyak nama dalam sekali jalan:
sumber
Pyth , 111 byte SBCS
Suite uji
Kode menggunakan karakter yang tidak diinginkan, dan karena itu tidak ditampilkan dengan benar di Stack Exchange. Tautan yang disediakan berisi karakter-karakter ini dan merupakan versi program yang benar.
sumber
Python
sumber