Dalam drama absurd Rosencrantz dan Guildenstern are Dead , dua karakter utama Rosencrantz dan Guildenstern (atau mereka?) Selalu mencampuradukkan siapa di antara mereka yang — atau kadang-kadang bagian tubuh mereka yang mana — karena dianggap kurang memiliki identitas individu. Bukankah tidak masuk akal jika mereka bahkan mengacak-acak nama mereka?
Tugas Anda adalah menulis fungsi yang mengambil string dengan panjang genap (dan dengan desain, kelipatan 4) yang lebih besar dari 7 karakter, membaginya, dan mengocoknya.
Pemisahan harus sebagai berikut : string akan berformat "abscd"
, dengan akting sebagai karakter pemisah. Bagian pertama dan pemisah, abs
akan menjadi bagian pertama dari string, sedangkan bagian kedua akan menjadicd
Panjangnya a
akan(string length / 4) - 1
Panjangnya b
akan(string length / 4)
Panjangnya s
akan1
Panjangnya c
akan(string length / 4) + 1
Panjangnya d
akan(string length / 4) - 1
Ini mungkin benar-benar membingungkan, jadi izinkan saya menunjukkan kepada Anda dengan beberapa contoh
("a" + "bb" + "s" + "ccc" + "d").length //8
1 2 1 3 1
|-------4--------| |----4-----| <--- (4 is half of 8)
("rosen" + "crantz" + "&" + "guilden" + "stern").length //24
5 6 1 7 5
("foo" + "barr" + "?" + "barry" + "foo").length
3 4 1 5 3
Akhirnya:
Anda kemudian mengocok bagian di sekitar, mengeluarkan adscb
ex. "rosencrantz&guildenstern" --> "rosenstern&guildencrantz"
"foobarr?barryfoo" --> "foofoo?barrybarr"
Aturan:
- Celah Standar dilarang
- Jawaban yang dapat diterima: fungsi yang mengambil input melalui satu string input dan mengembalikan satu string output
- Jika string input tidak sesuai dengan persyaratan yang diberikan di atas, kode Anda HARUS error (tidak peduli apa
Exception
atauError
) - Ini
code-golf
, jadi jawaban terpendek (valid) (dalam setiap bahasa) menang! - Poin bonus untuk satu liner :-) (Tidak juga, hanya poin keren)
Jawaban:
K (oK) ,
353433 byteCobalah online!
Tanpa validasi input (untuk karunia ngn),
252423 byteCobalah online!
Cepat belajar sedikit K dan, melihat daftar kata kerja, saya pikir pendekatan alternatif ( tidak menggunakan cut) bisa bekerja di sini. Dan itu bekerja dengan sempurna.
Bagaimana itu bekerja
sumber
Perl 6 ,
6058 byte-2 byte terima kasih kepada Jo King
Cobalah online!
Lempar "Panjang daftar rotorisasi di luar jangkauan" jika terjadi kesalahan.
Penjelasan
sumber
J ,
3635 byteCobalah online!
-1 byte oleh
{.
+ panjang negatif &;.2
yang memotong yang sebagai penanda "berakhir" sebagai gantinya.Jawaban asli, 36 byte
Cobalah online!
ngn menyebut "cut" pada komentar ke jawaban K sebelumnya , dan itu membuat saya mencoba J yang memiliki "cut" yang sama (saya tidak tahu bagaimana K bekerja).
Bagaimana itu bekerja
Perhatikan bahwa fungsi ini secara otomatis menangani input yang tidak valid:
{.
melempardomain error
karena argumen panjangnya harus bilangan bulat.5 A.
melemparindex error
.length error
dilemparkan.sumber
Python 3 ,
10310210197888684 byteCobalah online!
Bukan benar-benar satu-liner, tetapi
;
satu byte lebih sedikit per baris dari linebreak dan indent.Melempar
ZeroDivisionError
jika panjang string input kurang dari 8 atau bukan kelipatan bilangan bulat dari 4.Juga berfungsi di Python 2.
-4 byte terima kasih kepada Jo King
-9 byte berkat ovs
-2 byte terima kasih kepada Jonathan Frech
-2 byte terima kasih kepada Bubbler
sumber
//=
pada pasangan terluar menjadi mubazir. Terima kasih banyak!-l+1
<->1-l
?Perl 6 , 78 byte
Cobalah online!
Blok kode anonim yang mengambil string dan mengembalikan string yang dimodifikasi jika valid, yang lain mengembalikan pembagian dengan kesalahan nol. Saya tahu saya bisa memodifikasi array secara langsung, jadi saya bisa menukar dua bagian dari string, tetapi saya tidak bisa mengetahuinya.
sumber
K (ngn / k) ,
1201131039995 byteSemoga dapat diturunkan lebih banyak, termasuk fungsi tambahan untuk pengujian jika panjang string dapat dibagi empat, kesalahan output dengan referensi ke variabel yang tidak dideklarasikan jika input tidak valid
SUNTING: Kondisi terlewat yang panjangnya lebih dari 7, termasuk
EDIT: Digabungkan menjadi satu fungsi, menghapus deklarasi variabel redundan
Cobalah online!
sumber
indices_string
)? ping saya di kebun jika saya harus menjelaskannyaRetina 0.8.2 , 58 atau 73 atau 83 atau 93 byte
Cobalah online! Penjelasan:
Capture
a
di$1
, dan membuatnya sesingkat mungkin*?
.$#2
,$#3
dan$#4
berakhir sebagai panjanga
.Menangkap
b
di$4
. Yang(?<-2>.)+
menangkap hingga panjanga
, sedangkan yang lain.
menambahkan 1 panjangnya seperti yang diperlukan.Tangkap
s
danc
masuk$6
. Panjang gabungan mereka adalah tiga lebih dari panjanga
.Menangkap
d
di$7
. Panjangnya tidak lebih dari panjanga
.Kami membuat
a
sesingkat mungkin, tetapi kami masih ingin mencapai akhir input.Pertukaran
b
dand
.Tahap di atas tidak memvalidasi inputnya. Karena Retina tidak memiliki kesalahan run-time, ada sejumlah opsi untuk validasi input:
Tidak menghasilkan apa-apa jika panjangnya kurang dari 8 atau tidak kelipatan 4. (+15 byte)
Keluaran
Error
jika panjangnya kurang dari 8 atau tidak kelipatan 4. (+25 byte)Hang jika panjangnya kurang dari 8 atau tidak kelipatan 4. (+35 byte)
sumber
C (gcc) dengan
-Dx=memcpy
dan-DL=(l-1)
,154158160 byteMengembalikan NULL jika panjang string input tidak habis dibagi 4 atau lebih pendek dari 8 karakter.
Terima kasih kepada Rogem dan Jonathan Frech untuk sarannya.
EDIT: Preprocessor yang dipindahkan mendefinisikan ke baris perintah dan membuat string yang dialokasikan secara dinamis untuk benar-benar sesuai dengan puzzle.
Cobalah online!
sumber
t[80]
? Tampaknya tidak ada batas atas tentang panjang input.malloc()
sebagai gantinya.NULL
untuk output yang tidak valid, menggunakan nilai kembali darimemcpy()
, makro seperti fungsi untuk melewati tipe dan array panjang variabel C99 untuk dilewatimalloc()
.//
atau-w
?-w
hanyalah kemudahan untuk menekan peringatan (sehingga kesalahan lebih mudah ditemukan). Saya biasanya menambahkan argumen baris perintah setelah//
TIO menghitung byte mereka untuk saya, dan kemudian mengurangi 1 dari total ke akun untuk satu karakter tambahan yang diperlukan untuk melakukan itu.Jelly , 28 byte
(Jika program lengkap diizinkan, kami dapat menghapus trailing
F
)Jika panjangnya kurang dari 8 atau tidak habis dibagi empat a
ValueError
dinaikkan selama pembagian bilangan bulat dariinf
(float) oleh4
- divisi menghasilkanNaN
(juga float) yang kemudian tidak dapat dilemparkan ke sebuahint
.Cobalah online!
Bagaimana?
sumber
Jelly , 25 byte
Cobalah online!
The
Ẏ
dapat dihapus untuk membuat ini menjadi program penuh.sumber
Ruby , 64 byte
Cobalah online!
sumber
JavaScript (ES6),
9789 byteDisimpan 8 byte berkat @ l4m2
Cobalah online!
sumber
JavaScript (Node.js) , 80 byte
Cobalah online!
JavaScript (Node.js) , 84 byte
Cobalah online!
JavaScript (Node.js) , 87 byte
Cobalah online!
Lebih pendek dari RegExp
sumber
Java 8, 135 byte
Melempar
ArithmeticException
(membaginya dengan nol) jika string input tidak cocok dengan persyaratan. Cobalah online di sini .Tidak Disatukan:
sumber
l/=l>7&l%4<1?4:0;
alih-alihl=l>7&l%4<1?l/4:l/0;
C (gcc) , 129 byte
Kembali dengan modifikasi. Kompilasi dengan:
Sumber data:
Cobalah online!
Degolf
sumber