Sebagian besar bahasa dilengkapi dengan built-in untuk mencari string untuk semua kemunculan substring yang diberikan dan menggantikannya dengan yang lain. Saya tidak tahu bahasa apa pun yang menggeneralisasikan konsep ini untuk (tidak harus berdampingan). Jadi itulah tugas Anda dalam tantangan ini.
Input akan terdiri dari tiga string A
, B
dan C
, di mana B
dan C
dijamin memiliki panjang yang sama. Jika B
muncul sebagai urutan di A
dalamnya harus diganti dengan C
. Ini adalah contoh sederhana:
A: abcdefghijklmnopqrstuvwxyz
B: ghost
C: 12345
Ini akan diproses seperti ini:
abcdefghijklmnopqrstuvwxyz
|| | ||
abcdef12ijklmn3pqr45uvwxyz
Jika ada beberapa cara untuk menemukannya B
sebagai urutan, Anda harus dengan rakus mengganti yang paling kiri:
A: abcdeedcba
B: ada
C: BOB
Result: BbcOeedcbB
and NOT: BbcdeeOcbB
Hal yang sama berlaku jika B
dapat ditemukan di beberapa tempat terpisah:
A: abcdeedcbaabcde
B: ed
C: 12
Result: abcd1e2cbaabcde
and NOT: abcd112cbaabc2e (or similar)
Ketika B
tidak muncul A
, Anda harus output A
tidak berubah.
Aturan
Seperti yang dinyatakan di atas, ambil tiga string A
, B
dan C
sebagai input dan ganti kejadian paling kiri B
sebagai berikutnya A
dengan C
, jika ada.
Anda dapat menulis sebuah program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan mengeluarkan hasilnya melalui STDOUT (atau alternatif terdekat), nilai pengembalian fungsi atau parameter function (out).
Anda dapat mengambil tiga string dalam urutan yang konsisten yang harus Anda tentukan dalam jawaban Anda. Anda mungkin menganggap itu B
dan C
memiliki panjang yang sama. Semua string hanya akan berisi karakter alfanumerik.
Aturan standar kode-golf berlaku.
Uji Kasus
Setiap kasus uji empat baris: A
, B
, C
diikuti oleh hasilnya.
abcdefghijklmnopqrstuvwxyz
ghost
12345
abcdef12ijklmn3pqr45uvwxyz
abcdeedcba
ada
BOB
BbcOeedcbB
abcdeedcbaabcde
ed
12
abcd1e2cbaabcde
121
121
aBc
aBc
abcde
acb
123
abcde
ABC
ABCD
1234
ABC
012345678901234567890123456789
42
TT
0123T5678901T34567890123456789
edcbaedcbaedcbaedcba
abcde
12345
edcbaedcbaedcbaedcba
edcbaedcbaedcbaedcbaedcba
abcde
12345
edcb1edc2aed3bae4cba5dcba
daccdedca
ace
cra
dcrcdadca
aacbcbabcccaabcbabcaabbbbca
abaaaccbac
1223334444
aacbcbabcccaabcbabcaabbbbca
aacbcbabcccaabcbabcaabbbbcac
abaaaccbac
1223334444
1ac2cb2bccc33b3bab4aa4bbbc44
Papan peringkat
Cuplikan Stack di bagian bawah posting ini menghasilkan papan peringkat dari jawaban a) sebagai daftar solusi terpendek per bahasa dan b) sebagai papan peringkat keseluruhan.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
## Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:
## Perl, 43 + 2 (-p flag) = 45 bytes
Anda juga dapat membuat nama bahasa menjadi tautan yang kemudian akan muncul di cuplikan:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
/* Configuration */
var QUESTION_ID = 77719; // Obtain this from the url
// It will be like http://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 8478; // This should be the user ID of the challenge author.
/* App */
var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;
function answersUrl(index) {
return "http://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
return "http://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}
function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}
getAnswers();
var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
var OVERRIDE_REG = /^Override\s*header:\s*/i;
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
answers.forEach(function(a) {
var body = a.body;
a.comments.forEach(function(c) {
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});
var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
link: a.share_link,
});
else console.log(body);
});
valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;
var answer = jQuery("#answer-template").html();
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)
.replace("{{LINK}}", a.link);
answer = jQuery(answer);
jQuery("#answers").append(answer);
var lang = a.language;
lang = jQuery('<a>'+lang+'</a>').text();
languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang, user: a.user, size: a.size, link: a.link};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function (a, b) {
if (a.lang_raw.toLowerCase() > b.lang_raw.toLowerCase()) return 1;
if (a.lang_raw.toLowerCase() < b.lang_raw.toLowerCase()) return -1;
return 0;
});
for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
.replace("{{LINK}}", lang.link);
language = jQuery(language);
jQuery("#languages").append(language);
}
}
body { text-align: left !important}
#answer-list {
padding: 10px;
width: 290px;
float: left;
}
#language-list {
padding: 10px;
width: 290px;
float: left;
}
table thead {
font-weight: bold;
}
table td {
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="language-list">
<h2>Shortest Solution by Language</h2>
<table class="language-list">
<thead>
<tr><td>Language</td><td>User</td><td>Score</td></tr>
</thead>
<tbody id="languages">
</tbody>
</table>
</div>
<div id="answer-list">
<h2>Leaderboard</h2>
<table class="answer-list">
<thead>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
</thead>
<tbody id="answers">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
<tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
[[1], [2], [3]]
.Jawaban:
Jelly ,
232221 byteCobalah online! Perhatikan bahwa dua test case terakhir akan kehabisan memori.
Verifikasi
Bagaimana itu bekerja
sumber
Python 2, 88 byte
Fungsi yang mengambil dalam tiga string dan output hasilnya menjadi STDOUT. Fungsi ini hanya satu melewati string, mengambil karakter yang sesuai dan memperbarui
b,c
saat kita pergi.Untuk pengujian (setelah mengganti
print
denganreturn
):sumber
Java 7, 141
Saya pikir masih ada lagi yang bisa saya lakukan dengan ini, tetapi saya harus lari sekarang. Ini hanya iterate / ganti yang sederhana, menjaga indeks dalam A dan B.
Putih untuk kesenangan Anda:
sumber
Whitespaced
ya, itu benar-benar dapat dibacaj<k?a:d
Lua, 121 Bytes
Solusi langsung,
gsub
memungkinkan kita untuk mengulang tepat sekali pada setiap karakter dan menggantinya dalam instance string yang baru.Dibutuhkan input melalui 3 argumen baris perintah dan output string ke STDOUT.
Tidak disatukan
sumber
Python 3, 127 byte.
Disimpan 16 byte berkat Katenkyo.
Masih sedikit mengerjakan ini, manusia nastier ini daripada yang saya kira.
Penjelasan: Awww ya, rekursi.
Kasus uji:
sumber
all(x in a for x in b)
juga memeriksa elemen-elemen dalam b dan a muncul dalam urutan yang sama, atau hanya jika mereka ada di sini?return a.replace(b[0],c[0],1)[:l(b[0])+1]+f(a[l(b[0])+1:],b[1:],c[1:])if b and all(x in a for x in b)else a
membuat Anda menghemat beberapa byte?Python 3.5, 87 byte
repl.it untuk memverifikasi semua kasus uji .
Bagaimana itu bekerja
'(.*?)'.join(p)
membangun pola pencarian yang sesuai dengan urutan yang akan diganti dan apa pun di antara elemen-elemennya.Karena quantifiers malas, masing
(.*?)
- masing akan mencocokkan sesedikit mungkin karakter.Untuk polanya
ghost
, regex yang dibangun adalahg(.*?)h(.*?)o(.*?)s(.*?)t
.'\g<%d>'.join(r)%(*range(1,len(r)),)
membangun string pengganti, menggunakan pemformatan string.Setiap
\g<n>
mengacu pada n th kelompok ditangkap, seperti\n
akan.Untuk penggantian
12345
, string yang dibuat adalah1\g<1>2\g<2>3\g<3>4\g<4>5
.re.sub(...,...,s,1)
melakukan paling banyak satu penggantian dalam strings
.sumber
Pyth, 27
Test Suite
Test suite menghilangkan dua case terakhir karena mereka akan kehabisan memori. Algoritma yang digunakan di sini adalah untuk menemukan semua indeks dari setiap karakter dalam string kedua di string pertama, kemudian menemukan semua urutan yang mungkin dari indeks tersebut dan hanya mengambil yang berada dalam urutan diurutkan. Kemudian gunakan yang pertama ini dalam urutan diurutkan sebagai daftar indeks dalam string pertama untuk memperbarui dengan nilai-nilai dari string ketiga.
Saya merasa harus ada sesuatu yang lebih pendek dari
.nM*F
...sumber
MATL , 33 byte
Cobalah online!
Penjelasan
sumber
JavaScript (ES6), 84 byte
Penjelasan / Tes
Tampilkan cuplikan kode
sumber
JavaScript (ES6),
8476 byteKarena saya yakin ini adalah pekerjaan untuk RegExp.
Sunting: Disimpan 8 byte berkat @ MartinBüttner ♦.
Port jawaban Ruby @ KevinLau mengambil 82 byte:
Saya juga mencoba solusi RegExp rekursif tetapi butuh 90 byte:
sumber
Julia,
8970 byteMenggunakan indeks
i
untuk beralih melalui pola / string pengganti saat kita melangkah. -19 byte terima kasih kepada @Dennis!sumber
C, 98 byte
/ * Kode diperluas * /
Argumennya adalah: i nput string, o utput buffer, s earch string, r eplacement.
Setelah mengingat dimulainya input dan output, kami menjalankan input, mengganti dan memajukan substitusi setiap kali kami menekan satu. Pada akhirnya, jika kita kehabisan substitusi, kembalikan buffer output, atau input yang tidak dimodifikasi.
/ * Tes * /
sumber
R, 76 byte
menggunakan
sub
untuk mengganti pertandingan pertamaTidak disatukan
sumber
C ++, 204 byte
Golf
Tidak disatukan
sumber
std
cukup untuk menjamin penggunaanusing namespace std;
. Menggunakanstd::cin
,,std::cout
danstd::string
akan menghemat 5 byte karena tampaknya hanya menggunakan namespace itu.b
dalama
, tetapi surat-surat selanjutnya harus setelah surat sebelumnya juga. (Lihatlah test case 3 dan bandingkan dengan output Anda, saya pikir Anda akan menemukan bahwa kode Anda akan outputabc21ed...
ketika output yang diharapkanabcd1e2...
!)Retina , 63 byte
Input diambil dalam rangka
B
,C
,A
, dipisahkan oleh linefeeds.Cobalah online.
sumber
Haskell, 87 byte
Saya perhatikan kurangnya jawaban Haskell, dan memutuskan untuk memperbaikinya. Ini mendefinisikan fungsi terner
!
dengan pola urutan-penggantian-string. Coba di sini.Penjelasan
Fungsi bantu
#
mengambil daftarx
pasangan karakter (pola dan penggantian) dan stringy
. Jika karakter "pola" dalamx
bentuk selanjutnyay
, itu mengembalikan daftar kosong dany
dengan masing-masing karakter pola digantikan oleh rekannya. Jika tidak, itu mengembalikan pasangan(x,y)
. Fungsi!
ritsleting pola dan string pengganti menjadix
, berlaku#
untukx
dan string ketiga, dan mengembalikan komponen kedua dari hasilnya.Jika polanya adalah urutan dari string, kode akan berjalan dalam waktu O (n) , membuat satu kali rekursif melewati string dan dengan cepat membangun pengganti dalam proses. Namun, jika polanya bukan urutan, ia berjalan dalam waktu O (2 n ) dalam kasus terburuk. Ini karena pada setiap posisi di mana pola dan string memiliki karakter yang cocok, fungsi memanggil dirinya sendiri untuk memeriksa apakah pola itu sebenarnya sebuah urutan, menemukan itu bukan, dan menyebut dirinya waktu kedua untuk benar-benar menghitung hasilnya.
sumber
JavaScript (ES6),
10095 byteIni adalah fungsi JavaScript Lambda yang valid. Output sebagai fungsi
return
. Dibawa dalam tiga argumen (a,b,c
). Tambahkanf=
di awal dan aktifkan likef(arg1,arg2,arg3)
.sumber
f=
kecuali fungsi Anda bersifat rekursif, tetapi tidak terlihat seperti itu.a
tidak mengandung polanya. Saya juga tidak yakin mengembalikan deretan string dapat diterima.C (gcc),
67626159 byteCobalah online!
sumber
Oktaf, 97 byte
Iterate atas penggantian untuk menggantikan; temukan kemunculan pertama karakter pertama, temukan karakter berikutnya dalam string yang tersisa, ulangi. Sedikit yang menarik dari ini adalah:
Karena ideone masih tidak menerima fungsi dengan nama selain '', saya hanya akan membiarkan sampel dijalankan di sini. Input hanya ditampilkan untuk beberapa kasus uji pertama untuk singkatnya.
key
adalah output yang diharapkan,ans
adalah output fungsi.sumber
D(t=...)
) terus membingungkan saya :-)Python 3, 123 Bytes
Pendekatan yang berbeda yang ingin saya bagikan, yang beberapa byte lebih pendek. Tidak ada aturan yang melarang standar library / regex, kan?
PS. Ini golf pertama saya. Beri tahu saya tentang masalah / peningkatan apa pun.
sumber
Pyth, 22 byte
Verifikasi semua uji dalam Pyth Compiler .
Latar Belakang
Kami membangun regex dari pola dengan menambahkan
$
dan menempatkan(.*?)
antara semua karakter. Regex ini akan cocok dengan urutan yang akan diganti dan apa pun di antara elemen-elemennya, dan apa pun hingga akhir string.Karena quantifiers malas, masing
(.*?)
- masing akan mencocokkan sesedikit mungkin karakter.Untuk pola hantu, regex yang dibangun adalah
g(.*?)h(.*?)o(.*?)s(.*?)t(.*?)$
.Jika polanya cocok dengan input, builtin
r<str><regex>3
akan mengembalikan array yang berisi prematch (semuanya sebelum berikutnya), semua grup yang diambil (semuanya di antara dan setelah berikutnya), dan postmatch (string kosong).Jika polanya tidak cocok, builtin akan mengembalikan array tunggal yang berisi input asli.
Bagaimana itu bekerja
sumber
Jelly , 23 byte
Ini dua byte lebih panjang dari jawaban Jelly saya yang lain , tetapi langsung selesai. Cobalah online!
Verifikasi
Bagaimana itu bekerja
sumber
CJam, 29 byte
Cobalah online! atau verifikasi semua kasus uji .
sumber
Java 7, 102 byte
Detail coba di sini
sumber
Julia,
939086 byteHarus menguji secara terpisah jika pertandingan berhasil agak menghancurkan skor. Substitusi akan membutuhkan casting untuk
Base.SubstitutionString
, yang mungkin tidak layak ...Uji coba
sumber
Julia,
625958 byteI / O dalam bentuk array karakter.
Verifikasi
sumber
PHP,
130109 byteSaya masih suka lebih pendek; dapat menghemat 3 byte (
""<
) jikaB
dijamin tidak mengandung0
.mengambil argumen dari baris perintah. Jalankan dengan
-r
.Mengganti karakter ketika menemukannya;
mencetak salinan jika semua karakter telah diganti; asli yang lain.
sumber
Ruby,
70645958 byteFungsi anonim. Telusuri string
a
untuk membangun string baru dengan huruf diganti sesuai dengan karakter selanjutnya dib
danc
, kemudian jika semua karakter dalamb
habis pada akhirnya, kembalikan string yang baru dibangun, jika tidak kembalikan string asli.@ histokrat membantu menghemat 6 byte melalui
gsub
.Disimpan 1 byte berkat @Cyoce.
Cobalah online!
sumber
-1+i+=1
dengan~-i+=1
Perl, 80 + 1 = 81 byte
Jalankan dengan
-p
benderaCobalah online!
Kode secara prosedural menghasilkan pencarian dan mengganti perintah regex, yang kemudian dieksekusi dalam bit kode terakhir.
String
ghost
pada contoh pertama diubah menjadi stringg(.*?)h(.*?)o(.*?)s(.*?)t(.*?)
, yang berartig
diikuti oleh 0 atau lebih karakter, diikuti olehh
diikuti oleh 0 atau lebih karakter, diikuti oleh dll.*?
Kuantifikasi berarti bahwa pencarian harus non-serakah dan "melahap" "sesedikit mungkin karakter, daripada pencocokan default sebanyak mungkin.String
12345
kemudian berubah menjadi1 .$1.2 .$2.3 .$3.4 .$4.5 .$5
, yang dievaluasi setelah regex dilakukan. Masing-masing$1,$2,$3,$4,$5
sebenarnya adalah referensi kembali ke grup tangkap (dalam tanda kurung) dari string pertama.sumber
perl -pe 'eval"s/".<>=~s/.\K/(.*?)/gr."/".<>=~s/.\K/"\${".++$i."}"/gre."/"'
. Datang sendiri dengan saya, tapi itu cukup dekat dengan Anda, jadi saya tidak akan mempostingnya, itu akan menjadi dua jawaban yang sangat dekat, tetapi jangan ragu untuk mengedit milik Anda!perl -E 'chomp(($f,$t,$s)=(<>));$f=join"(.*?)",split"",$f;@r=split"",$t;@t=shift@r;push@t,"\${",++$x,"}"for(@r);$t=join"",@t;say$s=~s/$f/$t/r;'
Clojure, 113 byte
Panggilan dasar
reduce
, tidak terlalu senang tentang semua yang panjangfirst
,rest
danconj
fungsi. Berharap bisa melihat pendekatan yang lebih baik.sumber