Mengapa 6 takut dengan 7? Karena 7 8 9!
Diberikan string, terapkan transformasi berikut:
- Jika ada 6 di sebelah 7 hapus 6 (6 takut 7)
- Jika urutan "789" muncul hapus 8 dan 9 (7 makan 9)
(Jika saya tidak salah, tidak masalah bagaimana Anda melakukan transformasi)
Terus terapkan transformasi ini sampai Anda tidak bisa lagi.
Contoh:
78966
Pertama kita melihat "789", jadi string menjadi "766". Kemudian kita melihat "76", jadi kita mengeluarkan 6, dan string menjadi "76". Kemudian kita melihat "76" lagi, jadi kita pergi dengan "7".
Kasus uji:
987
=>987
(Tidak dalam urutan yang benar. Tidak melakukan apa-apa.)6 7
=>6 7
(Spasi bertindak sebagai penyangga antara 6 dan 7. Tidak ada yang terjadi)676
=>7
7896789
=>77
7689
=>7
abcd
=>abcd
68978966897896
=>68977
Jawaban:
Retina , 12
Terjemahan dari jawaban sed:
Cobalah online
sumber
Javascript ES6, 29 byte
Uji:
sumber
Java,
126816658 byteTerima kasih kepada @GamrCorps untuk menyediakan versi lambda dari kode ini!
Terima kasih kepada @ user902383 untuk menunjukkan trik autoboxing!
...ya.
Ini sebenarnya lebih lama dari yang saya harapkan - Java mengganti item dalam string dengan
replaceAll()
sekali per pertandingan, tidak berulang kali sampai berhenti berubah. Jadi saya harus menggunakan fancy untuk loop.Bentuk lambda:
Bentuk fungsi:
Kode Tidak Diuji yang Dapat Diuji:
sumber
.equals
ke!=
, yang tidak tidak melakukan hal yang sama.==
(atau!=
) membandingkan dengan lokasi objek hex, bukan dengan nilai. Panjangnya sama saja.while()
adalah 7 byte,for(;;)
adalah 7 byte.GNU Sed, 17
Skor termasuk +1 untuk
-r
opsi.sumber
67789
harus kembali77
tetapi sebaliknya kembali677
s/67|7(6|89)/7/
sebagai gantinyas/6?7(6|89)/7/
s///g
?Perl 6 ,
1918 byte(Perhatikan bahwa itu
[6|89]
adalah versi non-menangkap(6|89)
yang dieja seperti(?:6|89)
dalam Perl 5.<[6|89]>
adalah bagaimana Anda akan menulis apa yang dieja seperti[6|89]
di Perl 5)pemakaian:
sumber
6*
dan[6|89]*
tidak cocok, apa yang menghentikan7
yang diganti untuk7
iklan tak terhingga?7
dengan7
kemudian mulai lagi di posisi berikutnya, bekerja dengan cara sampai akhir.:g
kependekan dari:global
tidakrepeat until it doesn't match anymore
.s/67|76|789/7/
bekerja667
saya harus menuliskannya sebagai sesuatu yang efeknya:while s/67|76|789/7/ {}
yang tentu saja tidak akan pernah berhenti jika Anda menulisnyawhile s/6*7[6|89]*/7/ {}
seperti yang Anda harapkan. Juga, akhir dari komentar sebelumnya dapat dianggap sebagai kejam, bukan itu yang diinginkan[]
seharusnya diubah()
? Anda tidak ingin mencocokkan pipa atau79999
.[]
adalah versi Perl 6 yang tidak menangkap()
, apa yang Anda pikirkan dieja<[6|89]>
dalam Perl 6.Pyth, 17 byte
Coba di sini.
Leaky Nun telah mengungguli ini dengan byte dalam komentar.
sumber
Perl 5 , 17 byte
pemakaian:
sumber
Mathematica, 52 byte
Penjelasan:
sumber
Karat, 96 byte
Sangat panjang, seperti biasa untuk ...
Tidak Disatukan:
sumber
Emacs Lisp, 59 byte
Menjadi sedikit lebih jelas dengan spasi:
sumber
Ruby, 27 byte
Solusi ini dari komentar, kredit kepada b2gills Brad Gilbert .
Ruby, 37 byte
(solusi lama)
Solusi ini menggunakan fakta bahwa Anda tidak perlu mengganti lebih dari karakter dalam string.
sumber
chars
alih-alihsize.times
menyimpan beberapa byte.sub()
dangsub()
metode untuk menggantikan pertama atau semua. Jadi global hanya satu karakter lebih lama.->s{s.gsub /6*7(6|89)*/,'7'}
dan biarkangsub
semua looping berfungsi.gsub /6*7(6|89)*/,?7
dengan penggunaanruby -pe "gsub /6*7(6|89)*/,?7"
total 20 + 1 byteJapt , 15 byte
Solusi RegEx sederhana
Cobalah online
sumber
PowerShell, 27 byte
Memanfaatkan:
-replace
global mengganti secara default di PowerShell-regex
operator ke array$args
dengan menerapkannya ke semua elemen secara individual, dan hanya ada satu elemen di sini karena hanya ada satu parameter skrip, sehingga berfungsi OK dan kita dapat menghindari harus mengindeks elemen[0]
.Upaya baru sebelumnya sebelum menyadari penggantian global akan melakukannya; 74 byte membangun rantai "-ganti-ganti-ganti" menggunakan perkalian string, sebanyak panjang string, kemudian eval ():
(Dengan sedikit penggantian string untuk mempersingkat jumlah penggantian).
sumber
CJam,
7064 byteTerima kasih kepada @ Peter Taylor untuk memotong
{"789":I}{"76:":I}?
ke"789""76"?:I
"67":Iq:A{AI#:B){AB<7+A{BI,+}~>+s:A];}{"76"I={"789":I}{"76":I}?];}?}/A"67":Iq:A{AI#:B){AB<7+A{BI,+}~>+s:A];}{"76"I="789""76"?:I];}?}/A
Saya tahu ini mungkin bisa bermain golf lebih jauh dan bantuan Anda akan sangat dihargai, tetapi terus terang saya senang saya berhasil mendapatkan jawabannya. Ini adalah upaya pertama saya untuk menulis CJam.
Penjelasan:
sumber
/
dan*
. Juga perhatikan bahwa berpikir dalam hal tumpukan ketika Anda terbiasa dengan bahasa C-like membutuhkan adaptasi. Misalnya{"789":I}{"76":I}?
dapat menarik tugas menjadi"789""76"?:I
, yang selanjutnya bisa di-golf78976`3/?:I
.78976`3/
memberikan array["789" "76"]
; kemudian daripada menggunakan?
Anda perlu menggunakan=
untuk mengindeks; tapi ini back-to-front, jadi itu perlu indeks untuk dibalik, kehilangan keuntungan.MATL , 17 byte
Contoh
EDIT : Coba online!
Penjelasan
Ini bekerja dengan menerapkan penggantian ekspresi reguler sebanyak yang ada karakter dalam string asli . Ini cukup, karena setiap substitusi mengurangi jumlah karakter.
sumber
Serius, 29 byte
Mengambil input sebagai string yang dikutip ganda, seperti
"6789"
. Cobalah online (Anda perlu mengutip input secara manual).Penjelasan:
sumber
Thue , 26 byte
termasuk baris baru yang tertinggal.
Input ditambahkan ke program sebelum memulai.
Output membaca status program saat berakhir, sama seperti mesin Turing.
(Thue memang memiliki aliran output, tetapi sulit untuk digunakan dengan benar, jadi saya tidak yakin apakah ini merupakan metode output yang dapat diterima)
sumber
Bash,
1028267 (+7)? byteversi extglob
Ini dimaksudkan untuk dimasukkan ke dalam file dan dipanggil dengan mis
bash -O extglob 789.sh 6567678989689789656
. (+7)? byte adalah untuk jika opsi extglob diperhitungkan terhadap byte.Terima kasih kepada @BinaryZebra untuk menunjukkan fitur extglob!
Versi non-extglob (82 byte)
Ini dimaksudkan untuk dimasukkan ke dalam file dan dipanggil dengan mis
./789.sh 65678989656
.Itu menggunakan ekspansi parameter untuk mencari dan mengganti dalam satu lingkaran. Saya melibatkan serangkaian ekspansi untuk melakukan penggantian karena saya tidak mengetahui cara untuk secara efektif rantai ekspansi.
sumber
@()
sintaksnya. Saya tahu harus ada cara untuk menggabungkan itu. Dan @Mego, terima kasih atas sambutannya!R, 35 byte
Saya tidak tahu saya bisa menggunakan
gsub
cara ini, terima kasih banyak atas setiap jawaban di sini yang membuat saya belajar sesuatu yang baru.sumber
PHP 51 karakter
Test case ditulis dengan tangan panjang
Ini melakukan perbandingan string dan string menggantikan keduanya dalam kondisi while. Jika sementara kondisi terpenuhi, itu memperbarui tangan kiri perbandingan dengan hasilnya. Beri tahu saya tentang perbaikan apa pun.
sumber
Jolf , 15 byte
Coba di sini! Apakah saya benar-benar harus menjelaskan?
sumber
PHP, 36 byte
solusi regex, mengambil $ a string dan menggantikannya melalui ekspresi.
sumber
$argv
atau STDIN.Clojure, 71 byte
Clojure kurang ideal untuk bermain golf karena sifatnya yang verbose - tetapi tetap saja ini latihan yang menarik:
Versi golf, menggunakan Java interop:
Un-golfed version, menggunakan Java interop:
Versi "pure Clojure" yang tidak golf:
sumber
/// , 19 byte (tidak bersaing)
Anda tidak dapat benar-benar memberikan input dalam bahasa ini, sehingga input yang seharusnya berada di sebelah kanan kode.
sumber
Python 3, 46 byte
sumber
Japt v2.0a0, 12 byte
Cobalah online!
Bagaimana itu bekerja
String.e
adalah fungsi ganti rekursif. Japt 2 memiliki sintaks regex baru dan pelengkapan otomatis tanda kurung di dalam regex, yang menyimpan satu byte di sini. (Dalam Japt 1.x, kami harus memberikan string sebagai pengganti regex, yang agak kikuk.)sumber
Dyalog APL , 17 byte
'6*
sejumlah enam7
diikuti oleh tujuh(
...)*'
diikuti oleh nol atau lebih urutan ...6|89
enam atau delapan sembilan⎕R
R eplace bahwa dengan'7'
tujuhsumber
05AB1E , 12 byte
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
sumber