Anjing saya bernama Rex. Setiap kali saya memarahinya, dia tampak tidak terlalu terkesan dan satu-satunya saat saya melihatnya bereaksi adalah ketika saya mengucapkan namanya. Jika saya katakan
Rex, I told you not to do this! You're making me angry Rex!
yang dia dengar hanyalah
Rex, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!
Tantangannya : diberi string input, program Anda harus menampilkan string yang sama di mana semua karakter alfabet telah berubah menjadi bintang, kecuali karakter dalam tampilan kata Rex
, yang harus dibiarkan tidak tersentuh. Karakter non-alfabet juga tidak tersentuh.
Detail : Tantangannya adalah case-insensitive, oleh karena itu rex
harus dibiarkan tidak tersentuh juga. Kata tersebut Rex
dapat menjadi bagian dari kata lain, jadi misalnya anorexic
harus diterjemahkan sebagai ***rex**
.
Pembaruan : karena teks awal dari tantangan ini tidak menjelaskan bagaimana garis bawah atau angka atau karakter yang ditekankan harus diperlakukan, saya tidak membuat persyaratan khusus pada karakter tersebut. Dengan demikian, solusi valid selama karakter dalam a-zA-Z
(dan juga yang disebutkan dalam contoh ,!".
) ditangani dengan benar.
Kasus uji:
Memasukkan : Rex lives in Rexland.
Keluaran: Rex ***** ** Rex****.
Memasukkan : To call Rex, just say "Rex".
Keluaran: ** **** Rex, **** *** "Rex".
Memasukkan : My cat is getting anorexic.
Keluaran: ** *** ** ******* ***rex**.
sumber
Hello! Isn't this ... a nice challenge?
Bisakah Anda mendengar anjing*****! ***'* *** ... * **** *********?
? Jika demikian, Anda dapat mempertimbangkan berkomunikasi dengan morse mulai sekarang ...a-zA-Z
, atau juga0-9
dan / atauäëïöüÿãõñáéíóúýàèìòùç
dll.? Dan bisakah Anda menambahkan beberapa test case tentang ini?"Rex lives in Rexland."
, output ="rex ***** ** rex****."
; atau alternatifnya input ="My cat is getting anorexic."
, output ="** *** ** ******* ***Rex**."
)Jawaban:
Retina ,
2421 byteCobalah online!
Penjelasan
Melewati
rex
s paling mudah dengan mencocokkannya juga, karena pertandingan tidak bisa tumpang tindih. Jadi jika kita mengutamakanrex
lebih dari surat-surat lain, itu akan dibahas dalam satu pertandingan dan tidak tersentuh oleh pertandingan individu-huruf.Tetapi bagaimana kita melakukan hal-hal yang berbeda tergantung pada alternatif yang digunakan untuk pertandingan? Sayangnya, Retina belum (belum) memiliki sintaksis substitusi bersyarat seperti Boost regex flavor. Tetapi kita dapat memalsukannya dengan memasukkan kedua pergantian tersebut dalam satu penggantian dan memastikan bahwa hanya satu yang tidak kosong:
$1
adalah grup penangkap pertama, yaitu(rex)
. Jika kami benar-benar mencocokkanrex
ini, cukup tulis kembali (jadi tidak ada hasilnya), tetapi jika kami tidak cocokrex
maka$1
adalah string kosong dan menghilang.$#2$**
harus dibaca sebagai($#2)$*(*)
.$#2
adalah berapa kali grup2
digunakan, yaitu(\w)
. Jika kami cocok denganrex
ini0
, tetapi jika kami cocok dengan huruf individual lainnya, ini1
.$*
mengulangi karakter berikutnya sebanyak operan tangan kirinya. Jadi bagian ini memasukkan satu*
untuk setiap pertandingan huruf dan tidak ada sama sekali untukrex
.sumber
\a
untuk[a-z]
zB?** REXX
151148141 byte **(Agak tampak tepat)
Coba di sini
Catatan untuk non-REXXers:
Lihat di sini untuk fungsi terjemahan
Lihat di sini untuk fungsi overlay
sumber
JavaScript (ES6),
424138 byteCobalah
Penjelasan
sumber
APL (Dyalog Unicode) , 22 byte SBCS
Cobalah online!
Sederhana PCRE R eplace.
⍠1
Menetapkan ketidakpekaan case. Cukup gantirex
dengan dirinya sendiri dan semua karakter kata lainnya dengan tanda bintang.sumber
\w
termasuk karakter garis bawah, dengan asumsi ini adalah RegEx - Saya tidak tahu APL.\w
beberapa jawaban sekarang!Perl 5 , 24 byte
23 byte kode +
-p
bendera.Saya menggunakan regex Martin Ender dari jawaban Retina- nya (yang kebetulan lebih pendek di Perl, terima kasih
\pl
), dan hanya perlu menyesuaikan sisi kanan s ///.Cobalah online!
sumber
Retina ,
3231 byteCobalah online! Penjelasan: Pisahkan string menjadi kemunculan kata
rex
dan yang lainnya, tetapi tetap cocok. Kemudian, pada baris yang tidak dimulairex
(yaitu "segalanya"), ubah huruf menjadi*
s. Akhirnya, gabungkan semuanya kembali bersama.sumber
C,
9997928674737265 byteLingkungan Pelles IDE menyediakan (kompilasi dengan / Go) strnicmp fungsi. Fungsi ini identik dengan strncasecmp. Lihat berfungsi di sini (dengan fungsi penggantian).
Output disimpan dalam parameter pertama yang merupakan parameter masuk / keluar.
Terima kasih kepada Johan du Toit karena memberi tahu saya bahwa rekursi sedikit lebih pendek.
sumber
Ruby,
363532 byteSebagai ujian:
Ini menghasilkan:
sumber
PHP, 78 Bytes
Cobalah online!
PHP, 84 Bytes
-1 Byte
\w
sebagai gantinya\pl
dalam hal ini garis bawah dan angka diganti juga\pL
lebih pendek sebagai[a-z]
atau[[:alpha:]]
Cobalah online!
sumber
\w
bukan\pL
.C (GCC pada POSIX),
1671189387 byteCobalah online!
sumber
f(char*s){for(;*s;s++)strncasecmp("Rex",s,3)?putchar(isalpha(*s)?42:*s):write(1,s-2,3,s+=2);}
. Sihir macam apa ituf(s)char*s;{}
? Saya belum pernah melihat sintaks ini sebelumnya.Python 2 atau 3,
757370 bytePada dasarnya sama dengan jawaban Ruby saya .
-2 byte berkat @Wondercricket.
Sebagai ujian:
sumber
x.group(1) or '*'
Java 8,
187192168164159138 byte-28 byte terima kasih kepada @ OlivierGrégoire.
Penjelasan:
Cobalah online.
sumber
0-9
dan karakter beraksen tidak boleh dimasukkan, hanyaa-zA-Z
harus."[a-zA-z]"
dengan/[a-z]/i
?"[a-zA-Z]"
->"(?i)[a-z]"
.s.regionMatches(0<1,i,"rex",0,3)
bukans.toLowerCase().substring(i,i+(i>l-3?1:3)).equals("rex")
.l
dan simpan 4 byte.Python 2, 87 Bytes
Saya kira itu bisa dipersingkat? :)
sumber
sed ,
3733 byteKode sumber 36 byte + 1 byte untuk flag -r.
Cobalah online!
sumber
.
sebagai gantinya\*
Gema, 25 karakter
Contoh dijalankan:
Fakta menyakitkan itu bisa saja
\CRex=$0;<L1>=\*
, tetapi sayangnya$0
mengandung templat, bukan kecocokan. ☹sumber
Retina ,
545049 byteGolf 5 byte berkat @MartinEnder
Retina , 49 byte
Cobalah online!
sumber
dex
, itu memberi*e*
sementara Anda memberi**x
.(
setelah yang pertama,i
Anda tidak perlu mengkonfigurasi tahap kedua.[a-z-[rex]]
.PowerShell, 60 byte
Cobalah online
sumber
\w
ke\p{L}
.$args
sebagai array memiliki konsekuensi ketika segala sesuatu dikutip, seperti dalam satu contoh. Dan jika Anda hanya menggunakan argumen pertama, Anda tidak perluforeach
.\w
. Catatan: Apakah kawat gigi\p{L}
benar-benar dibutuhkan?"$args"-replace'(rex)|\p{L}','$1*'-replace'(x)\*','$1'
secara keseluruhan jauh lebih pendek, membungkus$args
tanda kutip mengubah semuanya menjadi satu string dan menghemat banyak.QuadR ,
1110 + 1 = 11 byte+1 byte untuk
i
bendera.Cobalah online!
Penjelasan: Ganti huruf-huruf
rex
dan karakter kata-kata dengan dirinya sendiri dan tanda bintang, masing-masing.sumber
MATL , 24 byte
Inputnya adalah string yang dilampirkan dalam tanda kutip tunggal.
Cobalah online!
Penjelasan
Pertimbangkan input
'Rex lives in Rexland.'
sumber
Python 2 ,
9392 byteCobalah online!
sumber
Perl, 31 byte
Aktifkan perl dengan
-n
opsi. Sebagai contoh:sumber
[a-z]
sekarang dapat diganti dengan\w
karena input tidak akan pernah berisi angka atau garis bawah.-p
sebagai gantinya-n
dan menghapus;print
Bash , 128 byte
Cobalah online!
Saya berpegang teguh pada tr pada jawaban saya sebelumnya, string array bash non-fungsional diganti dan tidak ada penggantian awal!
Kurang bermain golf:
Harus menggunakan z bukannya * karena ekspansi
sumber
tr
parameter ketika tidak ada yang dapat diperluas.r=REXrex
variabel yang bernilai.'
untuk"
, sehingga tidak perlu untuk melarikan diri literal"
. Tentu saja, maka Anda menulis baris baru literal dengan melanggar garis di tempat itu bukan\n
:$r'",. !'
.Java 7,
96989796 byte+2 byte untuk e yang hilang diawali dengan r atau diikuti oleh x tetapi tidak keduanya
-1 byte untuk diubah
[a-z&&[^rex]]
menjadi(?![rex])\\w
Cobalah online!
Versi regex untuk penggantian menggunakan Java
Mengganti semua yang ada di regex ini dengan * (catatan di Java \ w harus diloloskan sebagai \\ w)
sumber
C #,
9390 bytePercayalah ini adalah pertama kalinya saya menggunakan regex dalam jawaban C # di sini karena namespace yang panjang
System.Text.RegularExpressions
.Tidak menyadarinya ketika saya menulis jawaban saya tetapi ini tampaknya merupakan versi C # dari jawaban JavaScript @ Shaggy .
sumber
CJam , 39 byte
Cobalah online!
Bagaimana itu bekerja
sumber
VimScript, 34 byte
Dan inilah substitusi menarik yang hampir berfungsi:
Bayangkan menjalankan ini berulang kali pada string.
Rex, dex, I told you not to do this! You're making me angry Rex!
Setelah baris pertama, stringnya adalahRex, *ex, * **** *** *** ** ** ****! ***'*e ****** *e ***** Rex!
Pass kedua akan menghasilkanRex, **x, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!
, dan pass ketiga akan menyelesaikannya. Setiap lintasan selanjutnya tidak akan mengubah string. Namun, dibutuhkan lebih dari 3 pergantian untuk sampai ke sana, misalnya pada stringxxxxxxxx
. Jadi, jika ada cara mudah untuk menjalankan substitusi di atas sampai berhenti mengubah hal-hal, atau berapa kali panjang input, itu akan menjadi solusi lain. Saya yakin itu bisa dilakukan dalam V, tetapi mungkin masih akan lebih lama dari 34 byte.sumber
Jelly , 23 byte
Tidak ada jawaban dalam lebih dari 24 jam untuk pertanyaan saya tentang kasus , jadi saya akan posting byter tentatif 23 ini.
Lihat test case di Coba online!
Bagaimana?
sumber
CJam , 26 byte (output huruf besar) / 36 byte (case-preserving)
Cobalah online!
Jika huruf besar perlu dilestarikan (karena itu masih sedikit tidak jelas ), itu dapat diselesaikan dengan 10 byte tambahan:
Cobalah online!
Ngomong-ngomong, ketika menulis jawaban ini, saya menemukan apa yang saya anggap sebagai bug desain di CJam: operator bitwise
&
dan|
tidak didefinisikan antara dua nilai char, jadi saya tidak bisa menggunakan.|
bitwise ATAU dua string. Solusinya, yang pada akhirnya menghabiskan dua byte tambahan, adalah pertama-tama mengubah salah satu string:i
menjadi array bilangan bulat, yang kemudian dapat ORed dengan string lainnya. (Sebenarnya harganya tiga byte, karena jika&
bekerja di antara dua karakter, saya bisa juga menggunakanSf&
alih-alih32f&
menyimpan informasi huruf.)Di sisi positif, saya menemukan bahwa
{...}f%
memang berfungsi seperti yang diharapkan untuk mengulangi karakter dalam serangkaian string. Bagus.Bagaimanapun, inilah versi kode 36-byte (ringan) yang dikomentari:
Trik hemat huruf berfungsi karena huruf ASCII ditentukan oleh bit kelima kode ASCII: bit ini adalah 0 untuk huruf besar dan 1 untuk huruf kecil. Dengan demikian, mengambil bitwise AND dari kode karakter dengan 32 = 2 5 mengekstrak bit case, dan bitwise ORing bit ini dengan huruf besar mengembalikan case asli mereka.
Tentu saja, karakter non-alfabet dapat memiliki nilai arbitrer untuk bit kelima (walaupun, karena cara karakter ASCII diatur, sebagian besar karakter tanda baca memiliki bit kelima diatur ke 1) tetapi ini tidak masalah, karena karakter tersebut dibiarkan tidak tersentuh oleh huruf besar dan loop sensor huruf tetap, dan ORing karakter dengan bit kelima sendiri tidak mengubahnya. Selain itu, mudahnya,
*
karakter sudah memiliki set bit kelima, sehingga tidak berubah oleh final.|
.sumber
Pip ,
2119 byteMengambil input dari stdin, output ke stdout. Cobalah online!
Penjelasan
sumber
V ,
27, 24 byteSaya meninggalkan kedua jawaban itu, karena saya pikir keduanya sama-sama menarik.
27 byte
Cobalah online!
Terima kasih kepada Brian McCutchon untuk idenya untuk melakukan ini dalam V
Hexdump:
Penjelasan:
24 byte
Cobalah online!
sumber