m | Y bR | ain adalah Kita | iRd. F (o) RT (h) E La | sT fi (v) e YE | ars O | R s | o, (I) ha | ve C (u) T wO | rds in h (a) lf wh | En (I) s (e) e Th | em. Ketika saya mulai Melakukannya, itu untuk | usaha | TaL - B (u) TI hampir bisa (l) tidak N (o) T d | o itu. N (o) w, aku d | o itu di belakang kepalaku, a (n) d hampir tidak | | | | Namun, saya pikir ini akan membuat tantangan besar.
Definisi
Untuk tantangan ini, setiap huruf diberi skor poin, berdasarkan penilaian saya tentang lebarnya dalam font sans-serif. Anda akan menggunakan lebar ini untuk memotong kata menjadi dua bagian dengan lebar yang sama. Karakter yang akan digunakan tantangan ini adalah alfabet dalam huruf besar dan kecil, apostrof, dan tanda hubung.
Width Characters
1 i l I '
2 f j r t -
3 a b c d e g h k n o p q s u v x y z
4 m w A B C D E F G H J K L N O P Q R S T U V X Y Z
5 M W
Untuk penjelasan dan kasus pengujian saya, |
menunjukkan lokasi di mana sebuah kata dapat dibagi menjadi dua. (
dan )
di kedua sisi surat menunjukkan bahwa surat itu akan dibagi dua untuk membuat pemisahan bersih.
Memasukkan
Input akan terdiri dari satu "kata" (yang tidak harus ada dalam kamus). Anda dapat mengambil kata ini dalam input teks apa pun yang Anda inginkan (String, array char, dll.). Kata ini hanya akan berisi huruf '
,, dan -
(lihat tabel di atas). Karena apa yang akan Anda lakukan dengan kata ini (lihat di bawah), kasus input diserahkan kepada kebijaksanaan pengembang. Mengejar baris baru diizinkan jika perlu.
Tugas
Permutasi melalui semua bentuk input (semua huruf pada semua posisi huruf besar atau kecil yang mungkin). Misalnya, untuk input it's
, di bawah ini semua permutasi:
it's
it'S
iT's
iT'S
It's
It'S
IT's
IT'S
Untuk membagi permutasi kata menjadi dua, titik di satu sisi kata harus sama dengan titik di sisi lain kata. Namun, jika sebuah huruf tersangkut di antara dua bagian genap, Anda juga dapat memotong satu huruf menjadi dua.
Harap dicatat bahwa "setengah" tidak berarti bahwa Anda telah pindah ke tengah-tengah string. "Setengah" berarti bahwa poin di kedua sisi sama.
Contoh:
W
adalah 5 poin. i
adalah 1 poin. Membagi permutasi menjadi Wiiiii
setengah akan menghasilkan W | iiiii
, dengan 5 poin di setiap sisi |
.
T
adalah 3 poin. Membagi permutasi menjadi TTTT
setengah akan menghasilkan TT | TT
, dengan 6 poin di setiap sisi |
.
w
adalah 4 poin. a adalah 3 poin. Membagi permutasi menjadi waw
setengah akan menghasilkan w (a) w
, dengan 5,5 poin di setiap sisi. Poin dari a
didistribusikan ke kedua sisi, seperti a
yang terbelah dua.
Keluaran
Output Anda adalah bilangan bulat dari jumlah permutasi unik dari input yang dapat dibagi menjadi dua. Mengejar baris baru diizinkan jika perlu.
Uji Kasus
Saya akan mengeluarkan semua permutasi yang valid dari input untuk kasus uji. Ingatlah bahwa itu bukan bagian dari spesifikasi untuk Anda.
Dalam output antara saya, angka-angka menunjukkan nilai poin dari huruf di atas mereka, sehingga outputnya sedikit lebih mudah untuk divisualisasikan.
Input: a
( a )
3
( A )
4
Output: 2
Input: in
Output: 0
Input: ab
A | B
4 4
a | b
3 3
Output: 2
Input: abc
A ( B ) C
4 4 4
A ( b ) C
4 3 4
a ( B ) c
3 4 3
a ( b ) c
3 3 3
Output: 4
Input: will
W ( I ) L l
5 1 4 1
W ( I ) l L
5 1 1 4
W ( i ) L l
5 1 4 1
W ( i ) l L
5 1 1 4
w I | L l
4 1 4 1
w I | l L
4 1 1 4
w i | L l
4 1 4 1
w i | l L
4 1 1 4
Output: 8
Input: stephen
S T E ( P ) H E N
4 4 4 4 4 4 4
S T E ( p ) H E N
4 4 4 3 4 4 4
S T E | p h e n
4 4 4 3 3 3 3
S T e ( P ) H E n
4 4 3 4 4 4 3
S T e ( P ) H e N
4 4 3 4 4 3 4
S T e ( P ) h E N
4 4 3 4 3 4 4
S T e ( p ) H E n
4 4 3 3 4 4 3
S T e ( p ) H e N
4 4 3 3 4 3 4
S T e ( p ) h E N
4 4 3 3 3 4 4
S t E ( P ) H e n
4 2 4 4 4 3 3
S t E ( P ) h E n
4 2 4 4 3 4 3
S t E ( P ) h e N
4 2 4 4 3 3 4
S t E ( p ) H e n
4 2 4 3 4 3 3
S t E ( p ) h E n
4 2 4 3 3 4 3
S t E ( p ) h e N
4 2 4 3 3 3 4
S t e ( P ) h e n
4 2 3 4 3 3 3
S t e p | H E N
4 2 3 3 4 4 4
S t e ( p ) h e n
4 2 3 3 3 3 3
s T E ( P ) H E n
3 4 4 4 4 4 3
s T E ( P ) H e N
3 4 4 4 4 3 4
s T E ( P ) h E N
3 4 4 4 3 4 4
s T E ( p ) H E n
3 4 4 3 4 4 3
s T E ( p ) H e N
3 4 4 3 4 3 4
s T E ( p ) h E N
3 4 4 3 3 4 4
s T e ( P ) H e n
3 4 3 4 4 3 3
s T e ( P ) h E n
3 4 3 4 3 4 3
s T e ( P ) h e N
3 4 3 4 3 3 4
s T e ( p ) H e n
3 4 3 3 4 3 3
s T e ( p ) h E n
3 4 3 3 3 4 3
s T e ( p ) h e N
3 4 3 3 3 3 4
s t E ( P ) h e n
3 2 4 4 3 3 3
s t E p | H E N
3 2 4 3 4 4 4
s t E ( p ) h e n
3 2 4 3 3 3 3
s t e P | H E N
3 2 3 4 4 4 4
s t e p | H E n
3 2 3 3 4 4 3
s t e p | H e N
3 2 3 3 4 3 4
s t e p | h E N
3 2 3 3 3 4 4
Output: 37
Input: splitwords
S P L I T | W O r d s
4 4 4 1 4 5 4 2 3 3
<snip>
s p l i t w | o R d S
3 3 1 1 2 4 3 4 3 4
Output: 228
Input: 'a-r
' a ( - ) R
1 3 2 4
' a | - r
1 3 2 2
Output: 2
Input: '''''-
' ' ' ( ' ) ' -
1 1 1 1 1 2
Output: 1
Kemenangan
Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang. Anda harus dapat mengeluarkan semua kotak uji (jadi, semua masukan hingga 10 karakter) dalam jumlah waktu yang wajar. Jangan membatasi input Anda secara artifisial.
Karunia
Saya tidak tahu apakah ini ada kemungkinan. Namun, Anda adalah pegolf - Anda akan melakukan apa saja untuk perwakilan. Saya menawarkan 200 rep bounty (saya akan memulainya setelah kondisi bounty ini terpenuhi, karena tampaknya pada dasarnya tidak mungkin bagi saya) untuk sebuah program yang menghasilkan output yang benar antidisestablishmentarianism
dalam waktu kurang dari 15 detik pada komputer rata-rata (alias milik saya). Harap dicatat bahwa test case ini tidak boleh dikodekan dengan cara apa pun.
@DigitalTrauma menghancurkan karunia saya, datang di bawah dua detik. Lihatlah jawabannya di sini .
antidisestablishmentarianism
(non-golfy) adalah83307040
(dan cocok dengan semua kasus uji) tetapi butuh ~ 37 detik di laptop saya (ingat itu Python). Adakah yang punya hitungan untuk itu?Jawaban:
Pyth ,
75747370 byteCobalah online!
Demi kasih Tuhan, tolong jangan coba-coba
antidisestablishmentarianism
dalam bahasa penerjemah. Anda akan menabraknya.Penjelasan
Biarkan kami memecah kode ini menjadi X bagian.
Bagian pertama: menghasilkan versi cased dan memetakan ke nilai-nilai
Mari kita perjelas di sini. Dalam tidak ada bagian dari proses adalah huruf dikapitalisasi. Kita hanya perlu memetakan satu huruf menjadi dua nilai (dan tanda baca menjadi satu nilai), tanpa perlu menggunakan huruf kapital. Kami akan memutuskan karakter mana yang kami perlukan dua nilai, dan untuk karakter mana kami akan membutuhkan satu:
Seperti yang Anda lihat, bahkan bagian pertama terlalu panjang.
Nilai pertama adalah untuk versi huruf kecil, yang mencakup
'
dan-
. Nilai kedua adalah untuk versi huruf besar, dengan'
dan-
tidak akan mengambil.Nilai pertama:
String pertama berisi
"mw"
pada indeks 0. Ini memiliki nilai 4, yang menjelaskan kebutuhan logis atau. Perhatikan bahwa Pyth menggunakan pengindeksan 0. Juga, ruang sebelum4
adalah untuk memisahkannya1
.Nilai kedua (huruf besar):
Jika
d
adalah"i"
, kemudian memberikan1
pada langkah pertama. Kalau tidak, itu berlanjut. Jikad
ini"m"
atau"w"
, maka langkah ketiga memberikan1
, yang ditambahkan ke4
memberi5
. Jikad
tidak"m"
atau"w"
, maka langkah ketiga memberi0
, yang ditambahkan4
untuk memberi4
.Bagian kedua: menyelesaikan pekerjaan
Ini diawali dengan bagian pertama, yang secara teknis tidak dipisahkan dari bagian kedua (masih satu perintah). Jadi, nilai dari bagian pertama diteruskan ke kanan.
Rekap: pada bagian pertama, kami memetakan huruf ke nilai yang mungkin (huruf kecil dan huruf besar untuk huruf, hanya satu nilai untuk dua tanda baca). Untuk input
"ab"
, orang akan mendapatkannya[[3,4],[3,4]]
.Untuk menghasilkan versi cased berbeda (yang seharusnya dilakukan di bagian pertama, tetapi itu akan melimpah), kami menggunakan produk Cartesian berulang kali, dan kemudian meratakan hasilnya. Masalah muncul ketika hanya ada satu huruf (testcase pertama), karena produk Cartesian tidak akan memberi kita sebuah array, dan perintah rata (
.n
) diluap untuk memberikan hasil yang aneh ke angka. Kita akan melihat bagaimana saya menghindari masalah ini.Jika itu adalah perpecahan di tengah
|
, maka awalan akan memiliki jumlah yang digandakan menjadi jumlah dari total.Jika itu dibagi
()
, maka jumlah awalan menjadi dua kali lipat dikurangi nilai dalam tanda kurung akan menjadi jumlah dari total.sumber
c, 378 byte; sekitar 0,6 untuk
antidisestablishmentarianism
Jawaban yang diperbarui . Saya membaca @ komentar JonathanAllan tentang
i
s, dan pada saya pertama tidak mengerti optimasi ini, tapi sekarang saya melihat bahwa sejak keduai
danI
memiliki lebar 1, maka kita dapat menghitung permutasi terkait dua kali dengan hanya harus memvalidasi sekali. Sebelumnya solusi saya menggunakan banyak utas untuk menyebarkan beban ke banyak CPU dan dengan itu saya hampir bisa melewati semua kemungkinan 28 pada mesin saya. Sekarang dengani
optimasi tidak perlu mengacaukan utas - utas tunggal melakukan pekerjaan dengan mudah dalam batasan waktu.Tanpa fungsi c - golf lanjut:
Fungsi rekursif
f
mengambil 3 parameter - pointer ke string input, panjang string dan offset dalam string untuk memulai pemrosesan (harus 0 untuk panggilan tingkat atas). Fungsi mengembalikan jumlah permutasi.Cobalah online . TIO tampaknya biasanya dijalankan melalui semua testcases (termasuk
antidisestablishmentarianism
di bawah 2 detik.Perhatikan bahwa ada beberapa unsintables dalam string tersebut
bcopy()
dieditm[]
. TIO tampaknya menangani ini dengan benar.Tidak Disatukan:
Saya memiliki MacBook Pro pertengahan 2015 yang menjalankan MacOS 10.12.4. Compiler adalah dentang MacOS default. Saya mengkompilasi dengan:
Menjalankan semua testcases, termasuk
antidisestablishmentarianism
memberi:Ini tidak berarti optimal. Algoritme hanya memaksa secara kasar melalui semua kemungkinan (modulo
i
- lihat komentar di atas), dan menghitung kata-kata yang dapat dibagi sesuai dengan kriteria.sumber
i
,-
,'
,l
,mw
,fjrt
, danabcdeghknopqsuvxyz
, tapi itu akan mengambil aplikasi dari Pólya pencacahan teorema (atau metode enumerasi kombinatorial setara), di mana saya tidak berpengalaman.JavaScript (ES6),
199169167 byteMengharapkan string input dalam huruf kecil. Terlalu lambat untuk hadiah.
Uji kasus
Tampilkan cuplikan kode
sumber
C,
403394 byte,Kevin terima kasih!
Cobalah online
Kode tidak dikunci:
sumber
f(char* w, int l){
->f(char*w,int l){