Setiap hari Anda memasang kata baru pada tanda tenda dengan huruf bergerak , hanya membeli surat yang Anda butuhkan untuk menulisnya. Anda menggunakan kembali surat yang telah Anda beli untuk kata-kata sebelumnya bila memungkinkan. Mengingat kata-kata yang ingin Anda tulis setiap hari secara berurutan, berikan huruf-huruf yang Anda beli setiap hari.
Contoh
Input: ['ONE', 'TWO', 'THREE', 'SEVENTEEN']
Output: ['ENO', 'TW', 'EHR', 'EENSV']
Hari 1: Anda mulai dengan tidak ada surat, sehingga untuk menulis ONE
, Anda membeli semua huruf yang E
, N
, O
.
Hari 2: Hari berikutnya, Anda ingin memasang TWO
(mencatat ONE
). Anda sudah memiliki O
dari ONE
, jadi Anda membeli tambahan TW
.
Hari 3: Pada titik ini, sudah ENOWT
. Untuk menulis
THREE
, Anda perlu EHR
. Perhatikan bahwa Anda perlu membeli satu detik E
selain yang Anda miliki.
Hari 4: Untuk menulis SEVENTEEN
, Anda perlu
E
total 4 yang sudah Anda miliki dua (bukan tiga!), Sehingga Anda membeli dua lagi. Anda juga memiliki T
dan salah satu N
's, sehingga Anda membeli surat-surat yang tersisa:
EENSV
.
Kami telah mengeluarkan surat yang diurutkan secara alfabet dalam contoh ini, tetapi Anda dapat menampilkannya dalam urutan apa pun.
Input: Daftar string surat yang tidak kosong A-Z
. Anda dapat menggunakan huruf kecil jika diinginkan. Daftar karakter tidak masalah untuk string.
Keluaran: Keluaran atau cetak surat-surat tambahan yang perlu Anda beli setiap hari. Surat-surat untuk satu hari mungkin merupakan output dalam urutan apa pun, tetapi hari-hari harus datang dalam urutan yang benar.
Surat-surat dari setiap hari harus dipisahkan dari hari-hari lain sehingga Anda dapat mengetahui di mana hari berakhir. Pemisah trailing dan / atau leading baik-baik saja, baik dalam sehari atau antara hari. Perhatikan bahwa suatu hari mungkin tidak ada surat yang dibeli, yang harus tercermin dalam output (spasi atau baris kosong OK, bahkan untuk hari terakhir).
Uji kasus
['ONE', 'TWO', 'THREE', 'SEVENTEEN']
['ENO', 'TW', 'EHR', 'EENSV']
['ONE', 'TWO', 'ONE', 'THREE']
['ENO', 'TW', '', 'EHR']
['ABC', 'AABC', 'ABBC', 'ABCC', 'AABBCC']
['ABC', 'A', 'B', 'C', '']
['SHORT', 'LOONG', 'LOOOONG', 'LOOOOOOONG', 'SHORT', 'LOOONG']
['HORST', 'GLNO', 'OO', 'OOO', '', '']
Berikut semua input dan output sebagai daftar terpisah:
[['ONE', 'TWO', 'THREE', 'SEVENTEEN'], ['ONE', 'TWO', 'ONE', 'THREE'], ['ABC', 'AABC', 'ABBC', 'ABCC', 'AABBCC'], ['SHORT', 'LOONG', 'LOOOONG', 'LOOOOOOONG', 'SHORT', 'LOOONG']]
[['ENO', 'TW', 'EHR', 'EENSV'], ['ENO', 'TW', '', 'EHR'], ['ABC', 'A', 'B', 'C', ''], ['HORST', 'GLNO', 'OO', 'OOO', '', '']]
Dan sebagai string yang dipisahkan oleh spasi (spasi di dalam output penting):
ONE TWO THREE SEVENTEEN
ONE TWO ONE THREE
ABC AABC ABBC ABCC AABBCC
SHORT LOONG LOOOONG LOOOOOOONG SHORT LOOONG
ENO TW EHR EENSV
ENO TW EHR
ABC A B C
HORST GLNO OO OOO
Papan peringkat
var QUESTION_ID=183544,OVERRIDE_USER=20260;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}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>
[['E', 'N', 'O'], ...]
SHORTLONGOOOOO
valid untuk output terakhir? AKA tidak menggunakan pembatas?Jawaban:
Haskell,
5449 byteCobalah online!
Kami membuat daftar keluaran dengan menghitung secara berpasangan perbedaan daftar (
\\
) dari daftar masukan dan tambahan kumulatif dari daftar keluaran (dimulai dengan""
).Dengan keduanya
Data.List
danData.Function
dalam ruang lingkup (misalnya dengan menggunakan lingkungan lambdabot), ini dapat disingkat menjadi 30 byte:Sunting: -5 byte terima kasih kepada @Sriotchilism O'Zaic.
sumber
Python 2 ,
7268 byte-4 byte terima kasih kepada Jonathan Allan.
Cobalah online!
Berkomentar
sumber
for r in input():
menghemat 4 byte.Jelly , 7 byte
Cobalah online!
Output:
-pisah terpisah.
sumber
Perl 6 , 44 byte
Cobalah online!
Output sebagai daftar daftar karakter.
Penjelasan
sumber
Bag(E(2), N, S, V)
harus benar-benar menunjukkan dua E agar OK.collections.Counter
yang saya tidak bermaksud untuk mengizinkan sebagai output. Dapatkah seseorang dengan mudah beralih di atas tas elts dengan multiplisitas, dilemparkan ke daftar / array, tampilan dengan multiplisitas, dll?Haskell , 44 byte
Cobalah online!
Output adalah string seperti
ONE,TW,HRE,SVEEN
dengan koma antara hari.sumber
\`. And an unexpected
bagusnya penggunaan format output untuk menghindari keharusan melipat case base foldl1` juga.JavaScript (Node.js) , 59 byte
Cobalah online!
Solusi yang cukup mudah. Untuk setiap kata
h
, hapus huruf yang sudah kita miliki.Ini adalah versi yang dijelaskan dari kode itu:
sumber
J , 29 byte
-29 bytes terima kasih kepada FrownyFrog!
Cobalah online!
Pos Asli
J , 58 byte
Cobalah online!
Terima kasih kepada ngn untuk bantuan meningkatkan "kurangi surat sambil menghormati bagian pengulangan".
Tidak cocok untuk J, tapi latihan yang mencerahkan.
Mari kita mulai dengan membangun kata kerja penolong
wo
("tanpa") yang menghapus semua karakter dalam satu string dari yang lain, sambil menghormati pengulangan.Ada ide yang menyenangkan di sini: Kami membuat setiap instance karakter yang diulang menjadi unik, dengan mengulanginya sebanyak yang diperlukan. Dengan demikian jika string asli kita
ABBA
menjadi:Yang ketiga
A
akan menjadiAAA
dan seterusnya. Ini dilakukan dengan frasa((e. <@# [) {:)\
, yang mengambil setiap awalan\
, melihat elemen terakhirnya{:
, dan membuat topeng semua elemen dalam awalan itu yang cocok dengane.
elemen terakhir, dan kemudian menyaring dan mengotakkan hanya elemen-elemen itu<@#
.Dengan input kami "unik-ified", kami sekarang dapat menggunakan set minus normal dengan aman
-.
sambil tetap menghormati pengulangan.Kami kemudian membuka setiap hasil dan hanya mengambil elemen pertama yang "membatalkan" pengulangan kami:
{.@>
Memasukkan kata kerja pembantu ini ke dalam, solusi keseluruhan kami (yang hanya sebaris itu) menjadi:
Pada dasarnya, semua yang kita lakukan di sini adalah mengatur masalah kita sebagai pengurangan tunggal. Kami mulai membalikkan input
|.
dan menambahkannya,~
sebagai kartu asa:
, atau kotak kosong, yang akan menjadi nilai awal dari hasil akhir kami, seperti:Kami menempelkan kata kerja berikut di antara setiap elemen untuk mempengaruhi reduksi:
Ini mengatakan: ambil input yang benar
]
(yaitu, hasil kami) dan tambahkan,
input kiri (iniONE
pada iterasi pertama,TWO
pada tanggal 2, dll) tanpawo
kehancuran;
input yang benar (yaitu, tanpa huruf sebelumnya sejauh ini digunakan), tetapi sebelum menambahkan, urutkan/:~
dan kotak lagi<@
.Pada akhir semua ini kita akan mendapatkan hasil yang kita inginkan, daftar kotak, tetapi semua di dalam satu kotak tambahan besar, dan masih dengan kotak kosong di depan. Jadi kita membuka untuk menghapus kotak luar dan membunuh elemen pertama:
}.@>
.sumber
[:}.@>|.(],a.<@#~0>.-&(1#.a.=/;))&.>/@,<@a:
(],a.<@#~0>.-&(1#.a.=/;))/@|.
juga berfungsi kecuali saya kehilangan kasing.JavaScript (ES6),
6665 byteCobalah online!
Berkomentar
sumber
C ++ (gcc) ,
177170 byte-5 byte berkat tip @ anatolyg, -2 byte untuk hal-hal kecil yang saya perhatikan.
Penjelasan
#import<random>
menambahkan kedua<string>
dan<vector>
setengah dari byte.Pertama menciptakan vektor 91-elemen dari 0s (hanya indeks 65-90 yang digunakan untuk menyimpan kejadian huruf), dan vektor lain dari jenis yang sama tetapi tidak diatur ke nilai. Iterasi melalui setiap elemen input (hari-hari): dapatkan surat-surat yang dimiliki saat ini, dapatkan surat-surat yang diperlukan untuk hari itu, ganti input pada indeks dengan jumlah yang diperlukan dan perbarui surat-surat yang dimiliki. Mengembalikan input yang diganti.
Cobalah online!
sumber
#define v std::vector<std::string
dan menghapususing namespace std
untuk mengurangi jumlah byte sebanyak 6 byte.C # (Visual C # Interactive Compiler) , 123 byte
Cobalah online!
Fungsi anonim yang menghasilkan dengan memodifikasi array input.
sumber
R,
119 112 106103 byte-7 byte dari aliasing dua nama fungsi lagi dan sekarang mengambil input pengguna dari
scan()
-6 byte hanya memanggil
strsplit()
sekali di awal-3 byte untuk menyingkirkan aliasing lagi dan menetapkan dua variabel dalam satu panggilan
(Juga diedit jumlah byte yang sebelumnya rendah salah)
Ini adalah pengajuan PPCG pertama saya dalam bentuk apa pun! Jadi saya tidak tahu apa yang saya lakukan baik dalam hal bermain golf maupun dalam hal memposting etiket. Outputnya adalah daftar vektor yang mungkin memenuhi persyaratan tantangan. :-P
Adapun kode itu sendiri, dibutuhkan input pengguna melalui
scan()
dan membandingkan setiap surat hari baru dengan surat-surat yang dimiliki secara kumulatif, seperti dalam solusi lain. Jika ada alternatif yang lebih pendek untukunlist
danstrsplit
untuk mengubah string menjadi vektor karakter individu yang akan keren untuk diketahui. Saya juga menggunakanvsetdiff
fungsi dalamvecsets
paket Carl Withoft untuk mendapatkan perbedaan set huruf yang diperlukan untuk hari berikutnya dan surat-surat saat ini dimiliki.sumber
Python 2 ,
102100 byteCobalah online!
-2 byte, terima kasih kepada Perwujudan Ketidaktahuan
sumber
Japt ,
1514 byteCobalah
sumber
Merah , 75 byte
Cobalah online!
sumber
PowerShell , 71 byte
Cobalah online!
Mengambil kata
$args
- kata masukan dan mengulanginya. Setiap iterasi kami atur kata saat ini$w
, kemudian$p
lewati ool kami dari surat yang sudah dibeli. Setiap loop dalam, kami melakukan regex-replace
pada$w
ord kami saat ini , sehingga kami mengganti hanya contoh pertama dari surat dari$p
ool kami . Setelah kami membaca semua huruf di pool, kami menampilkan apa yang tersisa$w
(yaitu, apa yang perlu kami beli), dan kemudian menempelkan huruf-huruf itu ke pool kami$p+=$w
untuk kata berikutnya.sumber
Excel VBA, 127 byte
Mengambil input dalam bentuk rentang excel.
sumber
C (gcc) , 118 byte
Cobalah online!
Sebagai bonus kecil, dibutuhkan stok
r
awal sebagai array. Menghasilkan input yang diakhiri dengan null null-terminated-string lista
dengan semua huruf yang dimiliki sebelumnya diganti dengan spasi.sumber
05AB1E , 11 byte
-6 terima kasih kepada Kevin Cruijssen
Cobalah online!
sumber
J
dengan»
. Anda juga dapat menyimpan 4 byte dengan menggantivyð.;}ðK
denganSõ.;
11 byte .Swift 4.2 / Xcode 10.2 ,
244242239238 byteCobalah online!
Surat-surat tidak diatur dalam urutan abjad, tidak dilarang oleh aturan.
sumber
Scala, 68 byte
Cobalah online!
/: adalah kependekan dari operator foldLeft, a is aggregation, akhirnya mengembalikan hasil yang kita inginkan, n adalah elemen berikutnya
Tidak bermain golf
sumber
PHP , 87 byte
Cobalah online!
sumber
Arang , 18 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
sumber
PHP, UTF-8 aware (253 bytes)
sumber
C # (Visual C # Interactive Compiler) , 112 byte
Cobalah online!
sumber
Perl 5
-p
, 28 byteCobalah online!
sumber
Ruby , 52 byte
Cobalah online!
sumber
Stax , 7 byte
Jalankan dan debug itu
Output dipisahkan baris baru.
sumber
K (ngn / k) , 36 byte
Cobalah online!
sumber