Suatu kali saya menulis sebuah program JavaScript yang akan mengambil string dan karakter sebagai input dan akan menghapus semua karakter kecuali yang pertama dan karakter yang diberikan sebagai input, satu per satu.
Misalnya, menghitung ini dengan input codegolf.stackexchange.com
dan e
untuk hasil karakter:
codegolf.stackexchange.com
cdegolf.stackexchange.com
cegolf.stackexchange.com
ceolf.stackexchange.com
celf.stackexchange.com
cef.stackexchange.com
ce.stackexchange.com
cestackexchange.com
cetackexchange.com
ceackexchange.com
ceckexchange.com
cekexchange.com
ceexchange.com
ceechange.com
ceehange.com
ceeange.com
ceenge.com
ceege.com
ceee.com
ceeecom
ceeeom
ceeem
ceee
Itu membuat karakter pertama dan semua e
s. Semua karakter lain dihapus satu per satu.
Tugas Anda adalah menulis program (atau fungsi) yang mengambil dua input dan output (atau mengembalikan) string yang menyelesaikan efek ini.
Spesifikasi
- Anda dapat mengasumsikan bahwa string tidak akan mengandung baris baru.
- Input kedua akan selalu menjadi satu karakter.
- Jika jawabannya adalah dalam bentuk fungsi, Anda dapat mengembalikan array string yang berisi setiap baris dalam output.
- Outputnya dapat berisi baris tambahan.
Uji Kasus
Test Cases
, s
:
Test Cases
Tst Cases
Ts Cases
TsCases
Tsases
Tsses
Tsss
Make a "Ceeeeeeee" program
, e
:
Make a "Ceeeeeeee" program
Mke a "Ceeeeeeee" program
Me a "Ceeeeeeee" program
Mea "Ceeeeeeee" program
Me "Ceeeeeeee" program
Me"Ceeeeeeee" program
MeCeeeeeeee" program
Meeeeeeeee" program
Meeeeeeeee program
Meeeeeeeeeprogram
Meeeeeeeeerogram
Meeeeeeeeeogram
Meeeeeeeeegram
Meeeeeeeeeram
Meeeeeeeeeam
Meeeeeeeeem
Meeeeeeeee
Hello World!
, !
:
Hello World!
Hllo World!
Hlo World!
Ho World!
H World!
HWorld!
Horld!
Hrld!
Hld!
Hd!
H!
Hello World!
, z
:
Hello World!
Hllo World!
Hlo World!
Ho World!
H World!
HWorld!
Horld!
Hrld!
Hld!
Hd!
H!
H
alphabet
, a
:
alphabet
aphabet
ahabet
aabet
aaet
aat
aa
upperCASE
, e
:
upperCASE
uperCASE
uerCASE
ueCASE
ueASE
ueSE
ueE
ue
Ini adalah kode-golf , jadi kode terpendek (dalam byte) menang.
Meeeeeeeeegram
Jawaban:
V , 12 byte
Cobalah online!
Hexdump:
Saya telah menguji ini dengan versi V terbaru yang tersedia sebelum tantangan , dan semuanya berjalan dengan benar, membuat jawaban ini bersaing.
Penjelasan:
Regex terkompresi diterjemahkan menjadi
Yang berarti
Versi tidak bersaing (11 byte)
Versi ini menggunakan pintasan untuk
Yp
itu tidak tersedia ketika tantangan ini diposting.sumber
cat filename | vim
atau saya akan melakukan sesuatu yang lain?Vim,
27, 26, 25 byteCobalah online!
Masukan datang dalam format ini:
Pendekatan pertama saya yang naif adalah tiga byte lebih lama:
Saya juga senang dengan jawaban ini karena ini dimulai dengan nama saya.
Lihat kesamaannya? Eh?
Pendekatan yang kurang berhasil:
Penjelasan:
sumber
k
terlalu banyak :)(...)comk
dalam baris 5 saat ini.:t
sini. NormalYp
akan menghemat satu byte. Anda harus beralih ke<C-R>-
tentu saja. Aturan PPCG yang khas membuat frustrasi, karena untuk setiap kasus uji yang masuk akal,:t.|s
dengan99@:
atau bahkan999@:
akan benar, tetapi tidak ada cara yang baik untuk mendapatkan pengulangan yang tidak terbatas dengan cara itu. Anda terpaksa menggunakan strategi yang kurang menarik.MATL ,
2016 byteCobalah online! Atau verifikasi kasus uji: 1 , 2 , 3 , 4 , 5 .
Bonus
Kode yang dimodifikasi untuk melihat string secara bertahap menyusut (kompiler offline):
Atau coba di MATL Online!
Penjelasan
sumber
Haskell, 50 byte
Menentukan fungsi yang
(%)
mengembalikan daftar string.Penjelasan
(%)
disebut sebagaiw%c
, denganw
menjadi string input, danc
karakter untuk disimpan. Singkatnya, definisi ini berfungsi dengan memisahkanw
ke dalam karakter pertama (a
) dan sisanya (x
), membelahx
pada kemunculan pertama karakter selainc
, dan secara rekursif menyebut dirinya sendiri dengan satu karakter jatuh.sumber
Retina ,
2827 byteHitungan byte mengasumsikan penyandian ISO 8859-1.
Cobalah online!
Penjelasan
Ada banyak konfigurasi di sini. Panggung itu sendiri benar-benar adil
G1`
, yang hanya menyimpan baris pertama, membuang karakter input.*
mengubahnya menjadi run kering, yang berarti bahwa hasilnya (yaitu baris pertama dari string) dicetak tanpa benar-benar mengubah string.{
memberitahu Retina untuk menjalankan kedua tahap dalam satu lingkaran sampai string berhenti berubah dan;
mencegah output di akhir program.Ini membuang karakter pertama yang a) tidak di awal input, b) tidak sama dengan karakter input yang terpisah.
sumber
Pip ,
22262422 byteMengambil string sebagai argumen baris perintah pertama, karakter sebagai yang kedua. Cobalah online!
Penjelasan
Putaran karakter input; jika karakter sama dengan karakter khusus, pindah ke yang berikutnya; jika tidak, hapus dan cetak string.
Versi ungolfed (
a
,b
dapatkan cmdline args;o
dimulai dengan nilai1
,x
is""
):Trik golf:
L
hanya dievaluasi sekali, jadi kita dapat menyelinap mencetak awal di sana.#Pa-1
tidak akan berfungsi karenaP
diutamakan rendah (akan diuraikan sebagai#P(a-1)
), tetapi kita dapat mengaturnya kembaliv+#Pa
, menggunakanv
variabel yang diinisialisasi sebelumnya ke-1
.RA:
Operator mengembalikan nilai barua
, sehingga kami dapat mencetak ekspresi yang bukan memiliki terpisahPa
pernyataan.?
.sumber
Perl 5, 29 byte
Saya mendapat 35 byte menggunakan Strawberry Perl: 31 byte, plus 1 untuk
-nE
bukannya-e
, ditambah 3 untuk ruang +-i
(digunakan untuk input huruf tunggal; string yang lebih panjang adalah dari STDIN).Namun, saya yakin ini bisa dilakukan tanpa
chomp;
menggunakan<<<
, yaitu 29 byte, meskipun saya tidak bisa mengujinya sendiri menggunakan Strawberry.Jadi:
sumber
-l
opsi, yang mengaktifkan mode penanganan baris baru otomatis di manaprint
mencetak baris baru tambahan (tidak relevan di sini) dan-p
/-n
input menghapus baris baru (sangat relevan). Juga, sudah usang, tapi saya pikir Anda bisa mengganti^I
dengan kontrol literal-I untuk byte penghematan tambahan. Akhirnya, saya pikirs/.\K[^$^I]/redo/e
akan menjadi satu karakter lebih pendek, meskipun saya tidak 100% yakin itu adalah tempat yang legal untuk menempatkanredo
.^I
, itu berlaku untuk sebagian besar variabel huruf kontrol, tetapi tidak yang ini, IIRC. Kembali\K
dan masukkanredo
pengganti/e
, terima kasih! Saya akan mengujinya ketika saya memiliki kesempatan untuk ....Perl 6 ,
47 4038 byteDiperluas:
Alasannya
...^
digunakan sebagai gantinya...
adalah bahwa&[eq]
tidak akan kembaliTrue
sampai nilai terakhir diulang.sumber
05AB1E ,
2625 byteCobalah online!
Harap dicatat bahwa
¬²k0Q
dapat ditulis ulang¬²Q
, tetapi karena alasan tertentu itu tidak berfungsi ketika karakter saat ini adalah tanda kutip: Q mengembalikan string aktual daripada boolean dan itu menyebabkan loop tak terbatas.Kode ini dapat digulirkan lebih jauh karena
¯J?
diduplikasi. Memindahkan bagian ini dalam loop akan menghapus duplikasi dan juga memungkinkan untuk menjatuhkan braket persegi penutup.sumber
DˆćUΔD²KRнõ.;DXìˆ}¯¨»
untuk 21, tetapi itu menggunakan perintah baru.Python 2,
7166 byte:Program lengkap. Membawa 2 input melalui STDIN dalam format
'<String>','<Char>'
.Juga, berikut ini adalah solusi rekursif yang saat ini mencapai 140 byte :
Yang ini harus disebut dalam format
print(Q('<String>','<Char>'))
.sumber
Python 3 , 72 byte
Cobalah online!
Menjalani diet:
sumber
JavaScript (ES6), 74 byte
sumber
f('test cases', 's')
(diakhiri denganstss
, bukantsss
). Saya pikir ini karenareplace
menghilangkan kejadian pertama sehingga menghilangkan yang pertamat
daripada yang keduat
dalam iterasi keempat darimap
loop.Ruby,
1481399790837762 byteTidak yakin apakah kode amatir diterima di bursa ini, tetapi saya tertarik untuk belajar kode golf walaupun saya buruk dalam hal itu, ada bantuan tentang bagaimana saya membuat program ini tampak sekecil yang lain di sini?
SUNTING:
Ganti menempatkan dengan p
Menghapus satu ton spasi dan menghitung byte dengan benar berkat Wheat Wizard
Berkat penantang5 beralih dari
s=gets.chop;c=gets.chop;
kes,c=gets.chop,gets.chop;
diganti
then
dengan;
dangets.chop
dengangets[0]
terima kasih Mhutter!Mengambil input sebagai variabel baris perintah sekarang, mis.
prog.rb helloworld l
Terima kasih banyak perbaikan oleh penggantian jeroenvisser101
a=s.dup
dengans=""+a
dan jika sebelumnyaif s[i]!=c;s[i]="";p s;else i+=1;end
dengan(d!=c)?(s[i]="";p s):i+=1;
perbaikan besar!sumber
=
s. Untuk tips yang lebih komprehensif, Anda dapat mengunjungi halaman tips kami .s=gets.chomp
. Saya tidak yakin apakah Anda bisa melakukan ini di Ruby tetapi dalam beberapa bahasa seperti Python Anda dapat menggabungkan beberapa tugas menjadi satu pernyataan, sepertia,b,c=0,1,2
.do
,then
danend
), dan sekitar keempat=
.c90,
129125 bytedengan spasi putih:
tanpa spasi putih:
ungolfed:
Ini membutuhkan pointer ke awal string, dan loop, iterasi pointer ini hingga mencapai akhir string. Di dalam loop, ia mencetak karakter pertama, kemudian setiap contoh argumen kedua yang ditemukan antara awal string dan pointer. Setelah ini, ia memanggil menempatkan pointer, mencetak sisa string.
Ini harus dikompilasi pada sistem di mana sizeof (int) == sizeof (char *). +3 byte jika tidak.
Ini adalah pertama kalinya saya mencoba kode golf di sini, jadi saya yakin ada beberapa optimasi yang dilakukan.
sumber
Dyalog APL , 27 byte
{×i←⊃1+⍸⍺≠1↓⎕←⍵:⍺∇⍵/⍨i≠⍳≢⍵}
⍺
adalah karakter yang dikecualikan,⍵
adalah string awalargumen cetak; cari indeks
i
non-pertama⍺
setelah char pertama; jika ditemukan, panggil secara rekursif dengani
dihapussumber
Mathematica, 64 byte
Fungsi anonim. Mengambil dua string sebagai input, dan mengembalikan daftar string sebagai output. Berfungsi dengan berulang kali menghapus karakter non-instance pertama.
sumber
FixedPointList
.PHP,
88848685828178 byte1 byte disimpan berkat @IsmaelMiguel, 3 byte terima kasih ke @ user59178, 3 byte terinspirasi oleh @ user59178
mengambil input dari argumen baris perintah; jalankan bersama
php -r <code> '<string>' <character>
Itu menambahkan
54 byte kode, tetapi menghemat output dan tambahanecho$a;
.sumber
$argv[1]."\n"
dapat ditulis sebagai"$argv[1]\n"
$b
mendapat baris baru ditambahkan ke itu, ia akan selalu dengan kebenaran selama itu memiliki panjang> = 1. Karena""<
itu tidak perlu.substr()
daripada menugaskan$b
.substr
hasil untuk kondisi danprint
; jadi saya harus menempatkannya di suatu tempat. Tapi Engkau mengilhami saya.for(;$b=substr($b?:".$argv[1]\n",1);)
tetapi apa yang Anda miliki sekarang bahkan lebih baik.05AB1E,
262423 byteTerima kasih @Kade untuk 2 byte!
Terima kasih @Emigna untuk 1 byte!
Menggunakan pengkodean CP-1252 . Cobalah online!
y²k0Ê
bisa jadiy²Ê
tetapi"
kekacauan itu.Ini mungkin bisa golf lebih karena
«
diulang dua kali. Silakan tinggalkan komentar jika Anda memiliki saran atau cara untuk menurunkannya.sumber
Java 10,
155140139124 byteCobalah online.
Penjelasan:
Jawaban rekursif 139 byte yang lama:
-1 byte terima kasih kepada @Eugene . (Lain kali, buat komentar alih-alih mengedit posting orang lain.)
Cobalah online.
Penjelasan:
sumber
C #,
122117112 byteTidak Disatukan:
Mengembalikan koleksi string.
sumber
c
. Dalam hal ini loop akan mencoba bekerja selamanya.TSQL, 127 byte (Tidak termasuk definisi variabel)
Diformat:
sumber
patindex
, tetapialphabet
contohnya tampaknya tidak benar, itu ditampilkanaaphabet
melaluiaaa
. Juga patut disebutkan bahwa ini harus dijalankan pada server atau database dengan susunan case-sensitive, jika tidakupperCASE
contohnya juga gagal, ditampilkanueE
pada baris terakhir.C #,
135138 :(137 byteGolf:
Tidak Disatukan:
Fungsi mengembalikan koleksi string.
EDIT1: @psycho memperhatikan bahwa algoritma tidak diterapkan dengan benar.
EDIT2: Dibuat variabel untuk
s.Length
. Satu byte disimpan berkat @TheLethalCoder.sumber
codeegolf e
akan memberice
alih-alihcee
.if
denganwhile
dan berfungsi.s.Length
menyimpan satu byte:int i=1,l;for(;;){yield return s;l=s.Length;while(i<l&&s[i]==c)i++;if(i>=l)break;s=s.Remove(i,1);}}
Python 2 -
6573 BytesDan solusi rekursif 76 Bytes , karena meskipun lebih lama daripada yang pertama, saya agak suka lebih baik:
sumber
Racket 194 byte
Tidak Disatukan:
Pengujian:
Keluaran:
sumber
JavaScript (ES6), 64
69Mengembalikan string tunggal dengan baris baru
sumber
.map
adalah kumulatif. Saya melihat.map().filter()
dan berpikir "Ini akan membuat pemahaman array yang hebat!", Tetapi kurangnya indeks dalam pemahaman array membunuhnya dan berakhir pada panjang yang sama:s=>c=>[for(x of(i=0,z=[...s]))if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
(btw, saya menghitung 68 byte untuk semua ini.)([...z],c,i=0)=>[for(x of z)if(--i&&x!=c)(z[~i]=~i?'':x,z.join``)]
Swift 3 -
151147 bytesSwift bukanlah bahasa yang ideal untuk bermain golf, terutama ketika itu berkaitan dengan pengindeksan string. Ini yang terbaik yang bisa saya lakukan:
Sayangnya, Swift membutuhkan ruang di sekitar
!=
(tetapi tidak untuk==
), dan Swift 3 menjatuhkan++
operator. Trik untuk keduanya adalah untuk mengkonversi ke array karakter yang memungkinkan pengindeksan bilangan bulat, dan menggunakan interpolasi string karakter untuk mengkonversi kembali keString
("\(c)"
).Tidak Disatukan:
Sebelumnya, solusi non-rekursif
sumber
while
ruang-ruang kebutuhan untuk dikompilasi. Saya juga bermain dengan typealiasingString
dan mencoba untukprint
menutup, tetapi mereka tidak menghemat ruang.Pyke,
261917 byteCoba di sini!
sumber
Mathematica, 78 byte
Sial, Martin Ender, aku hampir menjadi yang pertama: hlm
Fungsi yang tidak disebutkan namanya; implementasi langsung dengan
While
loop dan beberapa variabel sementara.sumber
JavaScript ES6, 89 byte
Saya pikir ini akan menjadi tantangan yang mudah, tapi saya cukup yakin saya melewatkan sesuatu di sini ..
Menggunakan rekursi dan mengembalikan array string
sumber
Groovy, 34 byte
sumber