Tujuan
Ini adalah tantangan sederhana. Tujuan Anda adalah menguraikan string dengan menukar setiap huruf dengan huruf berikutnya dari huruf yang sama, sambil membiarkan karakter non-huruf tidak berubah.
Penjelasan langkah demi langkah
Karakter pertama adalah a
E
. Kami mencari huruf berikutnya dalam huruf besar: itu aC
. Kami menukar karakter ini, yang mengarah keCdoE!
.Kami maju ke karakter berikutnya: ini adalah a
d
. Kami mencari huruf berikutnya dalam huruf kecil: itu ao
. Kami menukar karakter ini, yang mengarah keCodE!
.Kami maju ke karakter berikutnya: ini adalah
d
bahwa kami baru saja pindah ke sini. Kami mengabaikannya, karena sudah diproses.Kami maju ke karakter berikutnya: ini adalah
E
yang dipindahkan di sini di langkah # 1. Kami mengabaikannya, karena sudah diproses.Kami maju ke karakter berikutnya: ini adalah a
!
. Kami mengabaikannya, karena itu bukan surat.
Aturan
Anda dapat mengasumsikan bahwa string input dibuat secara eksklusif dari karakter ASCII yang dapat dicetak, dalam kisaran 32 - 126.
Anda dapat menulis program lengkap atau fungsi, yang mencetak atau mengembalikan hasilnya.
Jika string input berisi jumlah huruf ganjil, huruf terakhir yang tersisa tidak dapat ditukar dengan yang lain dan harus tetap di tempatnya, tidak peduli kasusnya. Logika yang sama berlaku jika string berisi angka genap, tetapi angka ganjil dari huruf besar dan jumlah ganjil dari huruf kecil.
Ini adalah kode-golf, jadi jawaban tersingkat dalam byte menang. Celah standar dilarang.
Uji kasus
Input : lLEhW OroLd!
Output: hELlO WorLd!
Input : rpGOZmaimgn uplRzse naC DEoO LdGf
Output: prOGRamming puzZles anD COdE GoLf
Input : eIt uqHKC RBWOO xNf ujPMO SzRE HTL EOvd yAg
Output: tHe quICK BROWN fOx juMPS OvER THE LAzy dOg
Input : NraWgCi: Nsas-eNEiTIsev rNsiTG!!
Output: WarNiNg: Case-sENsITive sTriNG!!
Kasus uji yang tidak terlalu acak:
Input : (^_^)
Output: (^_^)
Input : AWCTY HUOS RETP
Output: WATCH YOUR STEP
Input : hwn oeesd acsp nawyya
Output: who needs caps anyway
Input : SpMycaeIesKyBorekn
Output: MySpaceKeyIsBroken
Input : D's mroyr, Ivam. I'e faardi I act'n od htta.
Output: I'm sorry, Dave. I'm afraid I can't do that.
Jawaban:
Jelly ,
21201918 byteCobalah online!
Bagaimana itu bekerja
sumber
Retina , 53 byte
Tidak terlalu pintar, tetapi solusi yang bersih dan cukup mudah dibaca
Cobalah online!
sumber
MATL , 22 byte
Cobalah online! Atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
Utilitas Bash + Unix,
7762575654 byteMasukan di stdin. Output di stdout.
(Dalam versi terakhir ini, stderr kebetulan ditulis juga, tetapi konsensus PPCG tampaknya tidak masalah - stderr diabaikan begitu saja. )
Sunting 1: Terima kasih kepada @Dennis selama 15 byte! Perbaikan: (a) Mengambil input melalui stdin; (B) menggabungkan 2 skrip sed menjadi satu; dan (c) mengganti tr dengan substitusi melalui ekspansi parameter bash; (b) dan (c) menghilang di Edit 2.
Sunting 2: Lebih pendek dengan 5 byte tambahan. Menggunakan panggilan fungsi untuk mengganti (b) dan (c) pada Edit 1.
Sunting 3: Satu byte lagi - berlalu] sebagai bagian dari argumen fungsi.
Sunting 4: Mengganti dua panggilan fungsi dengan panggilan ke program itu sendiri ketika tidak memiliki argumen.
Output testbed dan sampel:
sumber
ES6,
18595 byteSolusi sangat singkat dengan bantuan @Neil, @Arnauld dan @ edc65
Penjelasan
sumber
/[a-z]/i.test(c)?o[e=c>"Z"]=1/(b=o[e])?[o[b],o[j]]=[c,o[b]]:j:0
[o[b],o[j]]=[c,o[b]]
bisao[o[j]=o[b],b]=c
Python , 82 byte
Cobalah online!
sumber
QBasic, 229 byte
Strategi
Kami mengulang melalui string input. Ketika kami menemukan huruf besar, kami menyimpannya dan posisinya. Kali kedua kami menjumpai huruf besar, kami menggunakan nilai yang tersimpan itu untuk menukar dengan yang sebelumnya. Sama untuk huruf kecil.
(Saya akan memposting versi yang lebih panjang yang menggunakan array, karena saya pikir string QBasic tidak dapat diubah. Kemudian saya menemukan fakta yang
MID$(strng$, index, length) = replacement$
berfungsi dengan baik. Langsung dan pelajari.)+ Ungolfed berkomentar
sumber
C ++ 11 (GCC),
154149 bytesumber
#include<string>
beralih ke C ++ 14 dan mendeklarasikan lambda generik[](auto s)
dan menganggapnyas
sebagaistd::string
. Juga, mendeklarasikan[](auto&s)
menyelamatkan Anda dari mengembalikan string sebagai memodifikasi argumen input untuk berfungsi sebagai output diizinkan.Qbasic,
436408 byteDisimpan satu byte berkat DLosc. Disimpan beberapa lagi dengan mengubah penanganan karakter non-huruf.
Ini pada dasarnya terdiri dari tiga bagian:
Penjelasan yang lebih terperinci (perhatikan bahwa ini merupakan versi kode yang lebih lama, tetapi prinsipnya masih berlaku):
sumber
PHP,
1089383 byteVersi sebelumnya (93 byte)
Terima kasih kepada @ user59178 untuk mengingatkan saya bahwa
preg_replace()
dapat menggunakan array string sebagai argumen.Jawaban asli (108 byte)
Kode dibungkus di sini agar sesuai dengan ruang yang tersedia.
Itu dapat dieksekusi dari baris perintah:
Versi 1 byte yang lebih pendek dimungkinkan pada PHP 7 dengan menekan penugasan
$f
di dalam panggilan pertamanya:Kedua solusi, dengan kasus uji dan versi tidak berjubah dapat ditemukan di Github .
sumber
preg_replace
dapat mengambil berbagai penggantian untuk melakukannya sehingga Anda hanya perlu satu panggilan. Selain itu lebih pendek untuk digunakan<?=
daripadaecho
. Dengan ini mudah untuk mendapatkan jawaban Anda hingga 93 byte.preg_replace()
. Saya lupa tentang itu. Saya tidak suka<?=
(menurut saya<?
bukan bagian dari bahasa, itu hanya penanda) dan saya suka menulis program satu baris pendek yang dapat dieksekusi dari baris perintah menggunakanphp -r
. Tetapi untuk tujuan golf kode Anda benar lagi. Saya bisa menghemat 1 byte menggunakan<?=
.Mathematica, 96 byte
Port jawaban Retina Leo , yang menggunakan ekspresi reguler.
sumber
Python 2 , 124 byte
Tidak sesingkat solusi berbasis regex saya , tapi saya pikir ini masih menarik.
Cobalah online!
sumber
Bean , 83 byte
Hexdump:
JavaScript Setara:
Penjelasan:
Secara implisit mengambil baris pertama dari input yang tidak diformat sebagai
a
(karena baris baru tidak dapat menjadi bagian dari string yang diacak), dan secara implisit mengeluarkan string yang tidak diacak dengan secara berurutan mengganti huruf besar, kemudian pasangan huruf kecil.Coba demo di sini.
Coba test suite di sini.
sumber
Ruby, 81 byte
sumber
JavaScript (ES6), 80 byte
Berdasarkan jawaban Retina Leo .
Ini berfungsi karena satu-satunya karakter huruf besar dalam kode
.replace(/([A-Z])([^A-Z]*)([A-Z])/g,'$3$2$1')
adalahA
danZ
, yang digunakan untuk menggambarkan rentang karakter. Inilah yang perlu kita ubah menjadi huruf kecil untuk memproses lintasan kedua.Uji kasus
Tampilkan cuplikan kode
sumber
ES6 155 - 195 byte
Saya tahu sudah ada jawaban yang lebih baik, tetapi saya ingin mencoba tanpa regex. Yang ini bekerja dengan tanda baca juga, tetapi itu tampaknya melanggar
(^_^)
tes. Dalam hal ini saya memilikic()
fungsi lain , yang diberikan di bawah ini.Penjelasan
sumber
Perl 6 , 56 byte
Mengambil variabel string sebagai argumen, dan memodifikasinya di tempat sehingga setelah memanggil lambda variabel berisi hasilnya.
Lebih lama daripada di Perl, karena:
<[A..Z]>
bukan[A-Z]
.EVAL
, yang akan memungkinkan lebih banyak fleksibilitas, membutuhkanuse MONKEY-SEE-NO-EVAL;
pragma yang tidak ramah terhadap golf .Di sisi positifnya, array dalam suatu
@
variabel dapat direferensikan secara langsung dalam regex, dan diperlakukan sebagai pergantian.Perl 6 , 65 byte
Versi fungsional (menampilkan hasilnya sebagai nilai pengembalian lambda).
sumber
R, 343 Bytes
Solusi R yang sangat kikuk:
sumber
Python 2, 181 byte
Jauh lebih lama dari yang seharusnya tetapi tetap:
Ini pertama membuat dua daftar: salah satu indeks karakter huruf besar dan satu untuk karakter huruf kecil. Masing-masing daftar ini dilingkarkan melalui pasangan indeks, dan karakter pada indeks tersebut dialihkan.
Saya akan bermain golf ini besok
, tetapi untuk sekarang saatnya tidur.sumber
Pip , 28 byte
Mengambil input sebagai argumen baris perintah. Cobalah online!
Penjelasan
Ini adalah solusi regex, menggunakan variabel regin builtin
XL
(huruf kecil,`[a-z]`
) danXU
(huruf besar,`[A-Z]`
).Ketika argumen kedua
R
adalah daftar, penggantian dilakukan secara seri; dengan demikian, penggantian huruf kecil dan penggantian huruf besar tidak saling mengganggu.sumber
Perl 5 , 48 + 1 (-p) = 49 byte
Cobalah online!
sumber
AWK ,
121129 byteCobalah online! Catatan: Tautan memiliki 8 byte tambahan untuk memungkinkan input multiline
Penggunaannya cukup tipikal, tetapi memang membutuhkan versi
AWK
yang menerima string kosong sebagai pemisah bidang (sebagian besar versigawk
tapi saya cukup yakin yang asliAWK
akan gagal :()Ini sangat mudah karena hanya mengulangi setiap karakter dan memeriksa jika sudah ditemukan salah satu dari kasus itu sebelumnya. Jika demikian, itu swap karakter dan mengatur ulang indeks yang diperiksa. Di sisi pembelajaran, saya tidak pernah menggunakan pernyataan tugas dalam pernyataan tugas
AWK
sebelumnya. Untuk beberapa alasan itu tidak pernah muncul. :)Saya mungkin dapat mencukur beberapa byte dengan mengatakan untuk menetapkan OFS dan FS di luar
BEGIN
blok melalui penugasan baris perintah atau serupa, tetapi "lebih bersih" dengan cara ini.Menambahkan tautan TIO menunjukkan kepada saya bahwa saya memiliki kesalahan transkripsi yang membutuhkan 8 byte untuk memperbaiki :( (saya tidak tahu
0*(U=a):
)sumber
C (gcc) ,
212206 byteCobalah online!
sumber
Stax , 18 byte
Jalankan dan debug itu
Pendekatan umum berbasis regex.
[a-z].*?[a-z]
.sumber
R ,
223163 byte148 byteEDIT: -60 byte dengan menerapkan loop for
EDIT: -15 byte dari Giuseppe
Cobalah online!
Bekerja dengan menguji apakah karakter adalah huruf kecil atau huruf besar, menempatkannya dalam matriks, membalikkan matriks untuk mengekstraksi nilai-nilai dalam format yang ditukar. Kemudian output dengan
cat
. Cobalah online berjuang denganscan(,'')
jika kode lebih dari satu baris, maka titik koma di sepanjang baris kode tunggal.sumber
x
mengutak-atik adalah sedikit pintar, tapi menyingkirkanm=matrix
adalah 4 byte juga.scan(,'')
masalahnya? Dan mengurangi "lLEhW OroLd!" di TIO kescan(,'')
atau cara lain untuk mendapatkan input?Java 7, 117 byte
EDIT: Hanya memperhatikan saya memiliki jawaban yang sama dengan jawaban Retina @Leo , meskipun saya sudah memikirkannya secara independen ..
Tidak Disatukan:
Kode uji:
Coba di sini.
Keluaran:
sumber