Tulis program atau fungsi yang menduplikasi huruf dalam sebuah kata, sehingga semua huruf yang digandakan yang disusun dari kiri ke kanan dalam kata tersebut akan membentuk array input.
Sebagai contoh:
input: chameleon, [c,a,l,n]
output: cchaamelleonn
Memasukkan
- Kata awal (mis.
chameleon
)
- Array karakter (
[c,a,l,n]
) atau string untuk mewakili array ( caln
), atau yang serupa
- Input dapat melalui parameter fungsi, STDIN atau setara bahasa
- Semua input akan berupa huruf kecil (az)
Keluaran
Kata yang diubah
Jika ada banyak solusi, apa pun bisa dicetak
input: banana [n,a]
possible outputs: bannaana, banannaa
|-|---------|-|--->[n,a]
Anda dapat berasumsi bahwa kata input (tidak harus array) akan memiliki huruf dalam array (dalam urutan)
Anda juga dapat berasumsi bahwa input tidak memiliki huruf berurutan yang sama (BUKAN apel, geek, hijau, kaca, pintu ...)
Contohnya
input: abcdefghij, [a,b,c]
output: aabbccdefghij
input: lizard, [i,a,r,d]
output: liizaarrdd
input: coconut, [c,o]
ouput: ccooconut or coccoonut or ccocoonut
input: onomatopoeia, [o,o,a,o,o]
output: oonoomaatoopooeia
input: onomatopoeia, [o,a,o]
output: oonomaatoopoeia or onoomaatoopoeia or oonomaatopooeia etc.
Kemenangan program terpendek!
Papan peringkat (terima kasih kepada Martin Büttner untuk cuplikannya)
/* Configuration */
var QUESTION_ID = 51984; // 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";
/* App */
var answers = [], page = 1;
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 getAnswers() {
jQuery.ajax({
url: answersUrl(page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
if (data.has_more) getAnswers();
else process();
}
});
}
getAnswers();
var SIZE_REG = /\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;
var NUMBER_REG = /\d+/;
var LANGUAGE_REG = /^#*\s*([^,]+)/;
function shouldHaveHeading(a) {
var pass = false;
var lines = a.body_markdown.split("\n");
try {
pass |= /^#/.test(a.body_markdown);
pass |= ["-", "="]
.indexOf(lines[1][0]) > -1;
pass &= LANGUAGE_REG.test(a.body_markdown);
} catch (ex) {}
return pass;
}
function shouldHaveScore(a) {
var pass = false;
try {
pass |= SIZE_REG.test(a.body_markdown.split("\n")[0]);
} catch (ex) {}
return pass;
}
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
answers = answers.filter(shouldHaveScore)
.filter(shouldHaveHeading);
answers.sort(function (a, b) {
var aB = +(a.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0],
bB = +(b.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0];
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
answers.forEach(function (a) {
var headline = a.body_markdown.split("\n")[0];
//console.log(a);
var answer = jQuery("#answer-template").html();
var num = headline.match(NUMBER_REG)[0];
var size = (headline.match(SIZE_REG)||[0])[0];
var language = headline.match(LANGUAGE_REG)[1];
var user = getAuthorName(a);
if (size != lastSize)
lastPlace = place;
lastSize = size;
++place;
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", user)
.replace("{{LANGUAGE}}", language)
.replace("{{SIZE}}", size)
.replace("{{LINK}}", a.share_link);
answer = jQuery(answer)
jQuery("#answers").append(answer);
languages[language] = languages[language] || {lang: language, user: user, size: size, link: a.share_link};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function (a, b) {
if (a.lang > b.lang) return 1;
if (a.lang < b.lang) 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: 50%;
float: left;
}
#language-list {
padding: 10px;
width: 50%px;
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="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>
<div id="language-list">
<h2>Winners 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>
<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>
[c,o,c,o]
, bukan[c,o]
.#answer-list
dan#language-list
lebar50%
untuk menghindari tumpang tindih kolom di cuplikan Anda.bash
+ sayased
): Apakah itu ilegal untukbanana, na
=>baannana
? Saya percaya bahwa "Anda dapat berasumsi bahwa semua input akan memiliki huruf dalam array (dalam urutan)" dimaksudkan untuk mengizinkan , tetapi tidak memerlukan , jawaban untuk memproses kedua daftar secara berurutan, tetapi @ manatwork menafsirkannya secara berbeda.Jawaban:
Pyth, 14 byte
Demonstrasi.
Gaya masukan:
Penjelasan:
sumber
Brainfuck,
4645 (63 dengan karakter yang dapat dicetak dalam input)Kompatibel dengan bff Alex Pankratov (interpreter brainfuck digunakan pada SPOJ dan ideone) dan Thomas Cort's BFI (digunakan pada Anarchy Golf).
Versi yang dapat dicetak mengambil array terlebih dahulu sebagai string, diikuti oleh tab, diikuti oleh string awal tanpa baris baru.
Demonstrasi tentang ideone.
Kami dapat menyimpan beberapa byte dengan menggunakan
\x00
sebagai pemisah alih-alih tab:sumber
CJam, 15 byte
Cobalah online.
Bagaimana itu bekerja
sumber
C, 62 byte
Nah, ini sangat kompetitif.
Kami mendefinisikan fungsi
f(char*, char*)
yang menggunakan string sebagai input pertama dan array karakter untuk diduplikasi sebagai input kedua.Beberapa kode pengujian:
Yang mencetak:
Cobalah online !
Jika dapat diterima untuk mengirim makro daripada fungsi, berikut
#define g(s,c)
ini hanya 58 byte , tetapi membutuhkans
danc
menjadi pointer aktual:sumber
CJam, 15 byte
Pendekatan alternatif CJam. Cobalah online
Penjelasan
Untuk setiap karakter di string kedua, kami melakukan dua hal.
Pisahkan akhiran string saat ini dengan karakter, mis
"beeper" "e" -> ["b" "" "p" "r"]
Buka string pertama dalam array, masukkan dua karakter, lalu gabungkan kembali array dengan karakter, misalnya
"b" "ee" "eper"
. String terakhir adalah sufiks baru.sumber
Retina, 33 byte
Informasi lebih lanjut tentang Retina.
Ini mengharapkan dua string pada STDIN, dipisahkan oleh baris baru.
Untuk tujuan penghitungan, setiap baris masuk ke file terpisah,
\n
harus diganti dengan karakter baris baru yang sebenarnya (0x0A). Jika Anda benar-benar ingin menguji ini, lebih mudah untuk menempatkan ini dalam satu file di mana\n
tetap seperti itu dan kemudian memohon Retina dengan-s
opsi sebelum melewati file.Penjelasan
(Sudah kedaluwarsa ... Saya berhasil menyingkirkan penanda ... Saya akan memperbaruinya nanti.)
Setiap pasangan garis adalah substitusi regex (baris pertama polanya, baris kedua substitusi).
Ini menempatkan
#
sebagai penanda di awal string input.Ini menemukan huruf pertama dalam input (setelah marker) yang sesuai dengan huruf berikutnya yang akan diduplikasi, menggandakan huruf itu, memindahkan marker di belakangnya, dan menjatuhkan karakter pertama dari string kedua. The
+`
di depan memberitahu Retina untuk melakukan ini berulang kali hingga string berhenti berubah (dalam hal ini, karena string kedua kosong dan semua huruf yang diperlukan telah digandakan).Akhirnya, kami membersihkan string dengan menjatuhkan spidol.
sumber
Python, 61
Solusi rekursif serakah. Menyimpan
b
apakah huruf pertama dari strings
adalah huruf pertama dari string yangl
akan digandakan. Jika demikian, ambil salah satu dari surat itu dan tambahkan ke panggilan rekursif dengan yang lains
, hapus elemen pertamal
. Jika tidakb
, lakukan hal yang sama tetapi jangan menggandakan surat dan jangan menghapus daril
.Kode memeriksa
s[:1]==l[:1]
daripadas[0]==l[0]
untuk menghindari kesalahan indeks out-of-bounds ketikas
ataul
kosong.sumber
Prolog,
95837956 byteContoh:
kembali
Sunting: Disimpan 4 byte berkat Oliphaunt
Sunting2: Disimpan 20 byte menggunakan
put/1
predikat SWI-Prolog yang sudah usang alih-alihwritef
. Disimpan satu byte menggantikan predikat ujung rekursid([],_).
ked(_,_).
. Tidak akan bekerja jika pemesanan kedua definisid
bertukar, tetapi kami tidak peduli tentang itu dalam kode golf. Menyimpan 2 byte lainnya dengan menghilangkan tanda kurungH=[A|T],put(A),d(S,T)
sumber
H=[A|T]
. Juga, mengapa tidak membuatnya sedikit lebih mudah dibaca dengan mengganti spasi dengan baris baru?Python 2,
83747265 BytesTidak ada trik khusus yang nyata di sini.
x
adalah string,y
adalah array karakter yang digandakan.Untuk memperjelas jika ini tidak menyalin dengan benar, tingkat lekukan pertama adalah spasi, selanjutnya adalah tab.Sunting 1: Disimpan 9 byte dengan menggunakan manipulasi string alih-alih pop ().
Sunting 2: Disimpan 2 byte dengan menggunakan
-~
selisihg
1.Sunting 3: Disimpan 7 byte dengan menggunakan
y[:1]
trik, terima kasih kepada xnor untuk ini!Lihat disini.
Diformat dan dijelaskan dengan benar:
sumber
y[:1]
.y=y[g:]
, jadi "beberapa" cukup berlebihan.y[:1]==c
. Apakah itu bekerja?Excel VBA, 110 byte
Ini adalah entri pertama saya ke CodeGolf jadi saya harap ini ok.
Anda memasukkan kata input dalam A1 dan kemudian huruf yang akan diganti dalam B1 dan kata yang dihasilkan ditampilkan dalam kotak pesan.
sumber
Haskell, 42 byte
Contoh penggunaan:
Bagaimana itu bekerja:
Jika satu string kosong, hasilnya adalah string pertama. Lain: jika karakter pertama dari senar cocok, ambil dua kali dan tambahkan panggilan rekursif dengan ekor senar. Jika karakter tidak cocok, ambil karakter pertama dari string pertama dan tambahkan panggilan rekursif dengan ekor dari string pertama dan string kedua yang sama.
sumber
Pyth,
1817 byteDemo langsung.
Disimpan 1 byte berkat @Jakube.
Penjelasan:
Versi asli:
Demo langsung untuk yang asli.
sumber
Javascript, 47 byte
Memanfaatkan beberapa fitur ES6.
sumber
onomatopoeia
,oao
?b.indexOf(d)==0
, coba~b.search(d)
search
hanya berlaku di string. Harus mengubah b ke arrayPyth, 16 byte
Cobalah online: Demonstrasi
Ini cukup aneh. Bahasa berbasis tumpukan mungkin memiliki keuntungan di sini.
Penjelasan
sumber
JavaScript ES6, 47 byte
Asumsi
s
adalah sebuah array["c","a","l","n"]
sumber
> <> (Ikan) ,
6834 BytesAnda dapat menjalankannya di http://fishlanguage.com/playground dengan memasukkan string sebagai tumpukan awal (dengan "tanda, yaitu" bunglon ") dan larik huruf tambahan sebagai tumpukan input (tidak ada" tanda yaitu caln).
Jangan lupa untuk menekan tombol Berikan untuk menyemai tumpukan input.
EDIT: Dibelah dua! :)
sumber
R, 119
Berdasarkan jawaban @ Alex , yang ini lebih pendek beberapa byte:
Tidak Disatukan:
sumber
Perl,
73625956Pendekatan yang sama sekali baru menghasilkan hasil yang jauh lebih baik. Meski begitu, saya yakin itu bisa lebih pendek.
Sebut sebagai
f('coconut', ['c','o'])
.Untuk setiap karakter dalam array, temukan kemunculan pertama dan duplikatnya, dan ubah semuanya menjadi huruf besar. Kemudian kembalikan seluruh string, dikonversi menjadi huruf kecil.
EDIT: mencukur beberapa karakter lebih banyak dengan menyingkirkan
shift
danpop
.Versi sebelumnya:
sumber
foreach
kunci sebenarnya adalah sinonim untukfor
kata kunci, sehingga Anda dapat menggunakan keduanya." - Foreach Loops .)for
petunjuknya. Ini sebenarnya lebih pendek sekarang.Rubi,
5247 byteLarutan:
f=->(s,a){s.chars.map{|c|c==a[0]?a.shift*2:c}.join}
Contoh:
p f.call('banana', ['n','a']) # => "bannaana"
Penjelasan:
Bentuk Proc dari metode yang menggunakan string sebagai argumen pertama, dan array karakter sebagai argumen kedua. Memetakan blok ke array karakter dalam argumen string, yang memeriksa setiap karakter terhadap elemen pertama dari array perbandingan, dan jika ada kecocokan, menghapus elemen pertama dari array perbandingan, dan menggandakannya.
memperbarui
f=->s,a{s.chars.map{|c|c==a[0]?a.shift*2:c}*''}
sumber
s,a
. Dan*''
setara dengan.join
. Itu 5 byte yang disimpan, tapi saya masih mengalahkan Anda satu per satu (untuk sekarang): DPerl, 51 byte
Masukan diberikan melalui STDIN. Input pertama adalah kata awal (mis.
chameleon
), Input kedua adalah huruf-huruf sebagai string tunggal (miscaln
.).Di atas hanyalah cara yang membingungkan (baca "lebih cantik") untuk melakukan hal berikut:
Saat kita membaca setiap huruf, kita mengganti dari awal kata hingga huruf di kata sumber hanya dengan huruf baru, dan menambahkan kecocokan (disimpan dalam
$&
) ke hasil kita. Karena pertandingan menyertakan surat dan kemudian diganti dengan surat, setiap huruf akhirnya muncul dua kali.Karena STDIN menambahkan karakter baris baru ke kedua input kami, kami dijamin akan menangkap sisa kata lengkap pada pertandingan terakhir, yaitu karakter baris baru.
sumber
REGXY, 24 byte
Menggunakan REGXY , bahasa berbasis pengganti regex. Input diasumsikan sebagai kata awal dan array, dipisahkan dengan ruang (mis. "Bunglon caln").
Program ini bekerja dengan cara mencocokkan karakter dalam string pertama dengan karakter pertama setelah spasi. Jika ini cocok, karakter diulang dalam substitusi dan karakter dalam array dihapus (well, tidak ditambahkan kembali ke string). Pemrosesan bergerak ke baris kedua, yang hanya merupakan penunjuk kembali ke baris pertama, yang menyebabkan pemrosesan mengulangi hasil dari substitusi sebelumnya. Akhirnya, tidak akan ada karakter setelah spasi, pada titik mana cabang kedua dari pergantian akan cocok, menghapus ruang tambahan dari hasilnya. Regex kemudian akan gagal untuk mencocokkan, pemrosesan selesai dan hasilnya dikembalikan.
Jika ini membantu, langkah-langkah eksekusi yang berulang adalah sebagai berikut:
Program mengkompilasi dan mengeksekusi dengan benar dengan contoh juru bahasa pada tautan di atas, tetapi solusinya mungkin agak kurang ajar karena bergantung pada asumsi dalam ketidakjelasan spesifikasi bahasa. Spec menyatakan bahwa token pertama pada setiap baris (sebelum /) bertindak sebagai label, tetapi asumsinya adalah bahwa penunjuk label nol akan menunjuk kembali ke perintah pertama dalam file dengan label nol (atau dengan kata lain, bahwa 'nol' adalah label yang valid). Solusi yang kurang sopan adalah:
Yang berjumlah 27 byte
sumber
JavaScript ES6, 72 byte
Ini adalah fungsi anonim yang mengambil 2 parameter: kata awal sebagai string dan karakter untuk direntangkan sebagai array. Kode ungolfed yang menggunakan ES5 dan menguji UI di bawah ini.
sumber
Python 2, 77
Panggil sebagai:
Saya mungkin salah menghitung byte dengan salah ... Menggunakan campuran spasi dan tab.
sumber
rs, 39 byte
Informasi lebih lanjut tentang rs.
Sudah ada jawaban Retina, tapi saya pikir yang ini menggunakan pendekatan yang sedikit berbeda. Mereka juga dibuat secara terpisah: ketika saya mulai mengerjakan yang ini, jawaban itu belum diposting.
Lagi pula, yang ini lebih panjang 6 byte. :)
Demo langsung dan test suite.
sumber
JavaScript, 92 karakter
Versi tanpa gangguan:
sumber
R,
136128122 byteIni menciptakan fungsi tanpa nama yang menerima string dan vektor karakter sebagai input dan mencetak string ke STDOUT. Untuk menyebutnya, berikan nama.
Penjelasan + tidak dikumpulkan:
Contoh:
Disimpan 8 byte berkat MickeyT dan 3 lainnya berkat jja!
sumber
cat(p,sep='')
untuk output langsung ke STDOUT untuk pasanganmessage(p)
lebih pendek.message
, itu luar biasa! Terima kasih! Diedit untuk menggunakan saran Anda.Bash + sed, 51
Masukan dari stdin; karakter yang akan digandakan sebagai argumen tunggal:
Ini bekerja dengan membangun program sed dari
$2
dan kemudian mengeksekusinya$1
. Program sed menggantikan kejadian pertama dari setiap surat pengganti dengan dua salinan dari versi huruf besar, dan menurunkan seluruh lot di akhir. Untuk contoh di atas, program sed yang dihasilkan adalahcukup dicetak:
Saya menggunakan huruf besar untuk menandai karakter yang diproses sejauh ini; ini menghindari penggandaan kembali karakter yang sudah digandakan, atau menerapkan penggandaan lebih awal dari yang sebelumnya.
Versi sebelumnya, sebelum klarifikasi bahwa urutan daftar pengganti signifikan (44 karakter):
sumber
strtech na <<< banana
menghasilkan "baannana", tetapi pertama-tama kemunculan pada "n" harus digandakan, hanya setelah itu terjadinya "a".Python,
5392 byteMenemukan solusi saya dengan panjang yang sama di Python 2 dan 3.
EDIT: Man, memperbaiki kasus itu ketika melakukan beberapa penggantian huruf yang sama (saat masih menggunakan metode yang sama) butuh sedikit kerja.
Python 2:
Coba di sini
Python 3:
sumber
Mathematica, 66 byte
Contoh:
sumber
Lua,
767876755853 byteSolusi baru yang sepenuhnya dikerjakan ulang dengan bantuan dari wieselkatze dan SquidDev! ayolah teman, kita bisa mengalahkan brainfuck: P
Penjelasan datang besok. Coba di sini.
Solusi asli: Disimpan 2 byte berkat @ kirbyfan64sos!
Lua adalah bahasa yang sangat buruk untuk bermain golf, jadi saya pikir saya cukup bagus untuk yang satu ini.
Penjelasan kode, bersama dengan versi yang tidak diklik:
Coba di sini. (Kode usang tetapi konsep yang sama, hanya sedikit golf, akan memperbarui besok)
sumber
function f(x,y)
dan setelahprint(x)
, menghemat dua byte.