Tulis sebuah program atau fungsi yang akan menghasilkan string yang diberikan dengan cara tangga, menulis setiap bagian kata yang dimulai dengan vokal satu baris di bawah bagian sebelumnya.
Sebagai contoh:
Input: Programming Puzzles and Code Golf
Output: Pr P C G
ogr uzzl and od olf
amm es e
ing
Memasukkan
String yang hanya berisi huruf dan spasi.
String dapat dikirimkan melalui STDIN
atau berfungsi argumen atau apa pun yang setara
Huruf dapat berupa huruf kecil atau huruf besar.
Input selalu dianggap mengikuti aturan itu, Anda tidak perlu memeriksa input yang salah.
Keluaran
Setiap kali vokal (yaitu, a
, e
, i
, o
, u
atau y
) ditemui dalam kata, Anda harus output sisa kata pada baris berikutnya (vokal ditemui termasuk), pada posisi horisontal yang benar. Aturan ini bersifat rekursif, yang berarti bahwa jika ada n vokal dalam kata, itu akan ditulis pada n + 1 baris.
Vokal harus ditulis di awal baris berikutnya, dan bukan di akhir baris sebelumnya saat ditemui.
Setiap kata dimulai pada baris pertama, dan karenanya harus diformat secara independen dari kata-kata lain. Dua kata dipisahkan oleh spasi.
Jika sebuah kata dimulai dengan vokal, Anda harus menulisnya mulai dari baris kedua.
Uji kasus
- Memasukkan:
Programming Puzzles and Code Golf
Keluaran:
Pr P C G
ogr uzzl and od olf
amm es e
ing
- Memasukkan:
The quick brown fox jumps over the lazy dog
Keluaran:
Th q br f j th l d
e u own ox umps ov e az og
ick er y
- Memasukkan:
aeiouy
Keluaran:
a
e
i
o
u
y
- Memasukkan:
YEAh UppErcAsE VOwEls
Keluaran:
V
Y Upp Ow
E Erc Els
Ah As
E
- Memasukkan:
If you only knew the power of the Dark Side
Keluaran:
kn th p th D S
If y onl ew e ow of e ark id
o y er e
u
Mencetak gol
Ini kode-golf , jadi kode terpendek menang.
The vowel should be written at the beginning of the next line, and not at the end of the previous line when one is encountered.
Setelah beberapa pemikiran, saya mengerti bahwa ini berarti bahwa pindah ke baris berikutnya harus terjadi sebelum vokal dicetak, bukan setelah, tetapi mungkin layak untuk menuliskannya dengan cara yang dapat dimengerti secara instan - butuh beberapa saat.Jawaban:
Retina ,
504434(+10)3230 byteTerima kasih kepada Dennis karena telah menyimpan 14 byte dengan menggunakan karakter kontrol yang sebenarnya.
Berdasarkan jawaban ini , saya menggunakan kode pelarian ANSI untuk memindahkan kursor terminal secara vertikal. The
<ESC>
harus diganti dengan karakter kontrol 0x1b, dan<VT>
dengan tab vertikal0x0B
. Untuk pengujian yang lebih sederhana, Anda juga dapat menggantinya<ESC>
dengan\e
,<VT>
dengan ,\v
dan mengumpankan hasilnyaprintf
.Untuk tujuan penghitungan, setiap baris dimasukkan dalam file terpisah. Namun, untuk kenyamanan, lebih mudah untuk hanya menempelkan kode ke satu file dan memohon Retina dengan
-s
opsi.Penggantian pertama mengelilingi masing-masing vokal
\v...#
, di mana\v
menggeser kursor ke bawah dan#
merupakan penanda untuk langkah kedua. Inii`
adalah notasi Retina untuk pencocokan case-insensitive.Langkah kedua kemudian berulang kali (
+`
) menghilangkan a#
dari sebuah kata dan meletakkan ae\[A
di akhir kata yang menggeser kursor ke atas. Ini berhenti setelah string berhenti berubah, yaitu ketika tidak ada lagi#
penanda dalam string.sumber
printf
. Ganti saja\e
dengan byte ESC (0x1b).CJam,
3936 byteDi atas adalah dump xxd reversibel, karena kode sumber berisi karakter VT yang tidak dapat dicetak (titik kode 0x0b) dan ESC (titik kode 0x1b).
Seperti jawaban ini , ia menggunakan tab vertikal dan urutan pelarian ANSI .
Ini memerlukan terminal teks video pendukung, yang mencakup sebagian besar emulator terminal non-Windows.
Uji coba
Sebelum menjalankan kode yang sebenarnya, kami akan menonaktifkan prompt dan menghapus layar.
Ini memastikan output ditampilkan dengan benar.
Untuk mengembalikan prompt, jalankan ini:
Bagaimana itu bekerja
Kami menyisipkan tab vertikal sebelum setiap vokal untuk memindahkan kursor ke bawah dan salinan cukup dari urutan byte 1b 5b 41 (
"\e[A"
) setelah setiap ruang untuk memindahkan kursor kembali ke baris pertama.sumber
unset PS1save
sesudahnya.Java, 428 byte
Saya tahu, ini mengerikan. Mungkin ada beberapa karakter yang bisa dicukur, tapi aku terlalu malas untuk melakukan itu.
sumber
int
variabel (yaitui
,r
,p
,o
, danx
) di mana Anda menginisialisasil
danm
karena mereka akan diberi nilai kemudian. Anda juga dapat melakukanString v="...",a[]=...;
dan melakukan hal yang sama seperti di atasString u
. Itu akan menurunkan skor Anda sedikit.x++-~-p
Perl, 31 byte
Di atas adalah dump xxd reversibel, karena kode sumber berisi karakter VT yang tidak dapat dicetak (titik kode 0x0b) dan ESC (titik kode 0x1b).
Panjang kode 27 byte dan membutuhkan sakelar
040p
(4 byte).Program ini membutuhkan terminal teks video yang mendukung tab vertikal dan urutan pelarian ANSI , yang mencakup sebagian besar emulator terminal non-Windows.
Uji coba
Sebelum menjalankan kode yang sebenarnya, kami akan menonaktifkan prompt dan menghapus layar.
Ini memastikan output ditampilkan dengan benar.
Untuk mengembalikan prompt, jalankan ini:
Bagaimana itu bekerja
perl -040p
secara otomatis membaca input sebagai token yang dipisahkan spasi (-040
), menyimpan setiap token di$_
(-p
) dan menjalankan program.s/[aeiouy]/.$&/gi
melakukan pencarian global, tidak peka$_
huruf besar-kecil untuk vokal dan mengganti setiap vokal dengan karakter kontrol VT (memindahkan kursor ke bawah), diikuti oleh vokal itu sendiri.s
mengembalikan jumlah penggantian yang dibuatnya, sehingga$\=".[A"x s...
menyimpan banyak salinan dari urutan byte 1b 5b 41 (memindahkan kursor ke atas)$\
, satu untuk setiap vokal.Pada akhir program, Perl secara otomatis mencetak
"$_$\"
, karena-p
saklar.sumber
C,
200190 byteTidak Disatukan:
Ini mengalokasikan buffer persegi panjang (sebenarnya persegi), mengisinya dengan spasi dan baris baru, kemudian melintasi string yang diberikan. Pada akhirnya ia menambahkan karakter nol untuk mencegah tertinggal baris baru.
Secara teknis itu bukan fungsi karena mengandung global; bahkan tidak dapat dipanggil lebih dari sekali (
j
danl
harus 0 di awal). Untuk mematuhi,i,j,k,l,M;
bisa dipindahkan keint i,j=0,k,l=0,M;
pada awal fungsi.sumber
char*t=malloc(M*M);
->char t[M*M];
danfor(i=0;i<M*M;++i)
->for(;i<M*M;++i)
char t[M*M]
?CJam, 47
Ya, ini agak panjang, tapi tidak "curang" dengan kode ANSI :)
Cobalah online
Idenya adalah untuk menghitung nomor baris untuk setiap karakter (mulai dari 0, menambah vokal dan melompat kembali ke 0 di spasi), dan kemudian untuk setiap baris, ulangi string tetapi ganti karakter yang memiliki nomor baris berbeda dengan spasi. .
sumber
K,
81727066 byteYah, ini awal:
Contoh Penggunaan:
Edit 1:
Lebih baik. Melakukan beberapa peningkatan level permukaan:
Khususnya, saya membalikkan argumen
?
ketika saya melakukan pencarian vokal dan dengan demikian menghilangkan kebutuhan akan lambda, melakukan inversi yang sama dengan di_
mana saya membagi kata-kata di ruang putih, dan saya menyadari bahwa itu~{" "?x}'x
adalah cara mengatakan yang sangat konyol, terlalu rumit" "=x
.Edit 2:
Level permukaan lain mengubah
s
sebelum menerapkannya pada lambda, menghemat parens di dalam:Edit 3:
OK, mari kita ambil pendekatan berbeda untuk menghitung offset untuk setiap karakter. Alih-alih membelah urutan pada spasi dan menghitung jumlah running (
+\
) dari posisi vokal, kita dapat beroperasi pada seluruh string input dalam satu lintasan, mengalikan jumlah running dengan 0 setiap kali kita menemukan spasi. Saya perlu negasi dari urutan ini, jadi saya bisa mengurangi alih-alih menambahkan saat saya memindai dan menggunakan jumlah-of-berbeda (#?
) bukannya max (|/
) ketika saya menghitung jumlah padding vertikal.Itu menghemat 4 karakter lainnya. Fiuh!
sumber
Ruby:
135131124 124115112 karakterContoh dijalankan:
sumber
/(?=[aeiouy ])/i
.C, 192 byte
Ini berulang melalui string, mengosongkan karakter saat mencetaknya. Itu berulang sampai tidak ada karakter non-spasi yang tersisa untuk dicetak. Ini portabel C, tidak membuat asumsi tentang pengkodean karakter.
Versi yang mudah dibaca
sumber
' '
->32
danf(char*s){int l=0,r=1,v,c;
->l,r=1,v,c;f(char*s){
' '
mungkin menjadi32
, tapi itu tergantung pada pengkodean karakter, dan seperti yang saya katakan, saya membuat ini portable C. menjatuhkan eksplisitint
besar, meskipun - tidak yakin mengapa aku lupa itu!Python 3,
265207202185177 karakterIni mengerikan dan saya tidak bangga. Saya tahu ini bisa dibuat lebih pendek, tapi saya pikir saya tetap akan memposting.
Terinspirasi oleh versi C, ia membuat daftar yang kemudian diisi saat melintasi string input.
sumber
GNU Sed, 151 +1
(+1 karena perlu
-r
bendera)Saya pikir sed akan menjadi alat untuk pekerjaan ini, tetapi ternyata sangat sulit.
Versi yang dapat dibaca:
sumber
p
, jadi tidak menghasilkan apa-apa. Masalah kecil adalah bahwa output dimulai dengan ruang ekstra. Masalah besar adalah teks pertama yang dimulai dengan vokal menghilang.c
, karena garis sebelumnyatx
. Saya telah mengaktifkan kembali versi sebelumnya dengan loop yang serupa, dan saya akan mencoba lagi nanti.Python 2,
145142 BytesMungkin tidak sekompetitif beberapa metode lain, tapi saya pikir ini adalah cara keren menggunakan regex.
Regex
(?!([^aeiouy ]*[aeiouy]){N}[^aeiouy]* ).
cocok dengan karakter tunggal apa pun yang tidak berada dalam grup huruf ke-N dari akhir kata. Karena itu terhitung dari akhir dunia, saya membalikkan string sebelum dan sesudahnya, dan saya juga harus menambahkan spasi di akhir, tetapi setelah itu menjadi masalah sederhana menggunakanre.sub
untuk mengganti setiap instance dari karakter ini dengan spasi. Ini melakukan ini untuk setiap nilai N sampai string kosong.sumber
re.I
, Anda dapat menyimpan 3 byte dengan mengganti nilai flag yang sesuai, yaitu2
.Oktaf,
132129 karakterUji
Memasukkan:
"YEAh UppErcAsE VOwEls"
Keluaran:
sumber
Gema :
5348 karakterPerhatikan bahwa
^[
(x1b) dan^K
(x0b) adalah karakter tunggal. (Pada contoh di bawah ini saya menggunakan copy-paste friendly\e
dan\v
padanannya, jika Anda ingin mencobanya.)Contoh dijalankan:
sumber
Jelly , 42 byte (tidak bersaing?)
Cobalah online!
Mengapa Jelly, mengapa? :-(
sumber