Marquee menandatangani surat


41

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 Odari 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 Eselain yang Anda miliki.
Hari 4: Untuk menulis SEVENTEEN, Anda perlu Etotal 4 yang sudah Anda miliki dua (bukan tiga!), Sehingga Anda membeli dua lagi. Anda juga memiliki Tdan 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


5
Script leaderboard liar telah muncul di usia script pengguna: o
Quintec

Bisakah kita menampilkan sebagai array karakter yang perlu dibeli daripada serangkaian semua karakter? misalnya:[['E', 'N', 'O'], ...]
Downgoat

Apakah output SHORTLONGOOOOOvalid untuk output terakhir? AKA tidak menggunakan pembatas?
Magic Gurita Guci

@Downgoat Ya, daftar karakter tidak masalah untuk ditampilkan.
xnor

@MagicOctopusUrn Tidak, Anda perlu pembatas, jika tidak, Anda tidak dapat menentukan huruf apa untuk hari apa.
xnor

Jawaban:


10

Haskell, 54 49 byte

import Data.List
g x=zipWith(\\)x$scanl(++)""$g x

Cobalah online!

Kami membuat daftar keluaran dengan menghitung secara berpasangan perbedaan daftar ( \\) dari daftar masukan dan tambahan kumulatif dari daftar keluaran (dimulai dengan "").

input list:                ONE       TWO       THREE        SEVENTEEN
cumulative append:         ""   +->  ONE  +->  ONETW   +->  ONETWHRE
list difference (output):  ONE -+    TW  -+    HRE    -+    SVEEN

Dengan keduanya Data.Listdan Data.Functiondalam ruang lingkup (misalnya dengan menggunakan lingkungan lambdabot), ini dapat disingkat menjadi 30 byte:

fix.(.scanl(++)"").zipWith(\\)

Sunting: -5 byte terima kasih kepada @Sriotchilism O'Zaic.



10

Python 2 , 72 68 byte

-4 byte terima kasih kepada Jonathan Allan.

p=''
for r in input():
 for x in p:r=r.replace(x,'',1)
 print r;p+=r

Cobalah online!

Berkomentar

l=input()       # the list of words to write
p=''            # p contains all letters we own
for r in l:     # for each word ...
  for x in p:   # for each letter we own ...
    r=r.replace(x,'',1)   # remove one occurence from the current word
  print r       # print the remaining word
  p+=r          # add the remaining chars to p

3
for r in input():menghemat 4 byte.
Jonathan Allan


7

Perl 6 , 44 byte

{$!=@;.map:{kxxv $!=.comb.Bag∖($⊎=$!):}}

Cobalah online!

Output sebagai daftar daftar karakter.

Penjelasan

{                                      } # Anonymous codeblock
 $!=@;                                   # Initialise $! to an empty list
      .map:{                          }  # Map each item in the input to
                    .comb                # The string split to characters
                         .Bag            # In a Bag
                                        # Set minus
                              ($⊎=$!)    # The accumulated Bag of results
                 $!=                     # And save the result for the next item
            kxxv                     : # Then decompose the Bag into a list

2
Alasan untuk downvote akan dihargai
Jo King

Bukan downvoter, tapi saya akan mengatakan format output ini terlalu jauh. Sesuatu seperti Bag(E(2), N, S, V)harus benar-benar menunjukkan dua E agar OK.
xnor

3
Sebenarnya apa? Itu hanya format cetak standar. Hasil kembali adalah daftar tanpa urutan yang berisi karakter tersebut (dan dapat berisi beberapa karakter yang sama). Saya akan memperbarui format output untuk mencerminkan hal ini dengan lebih baik, tetapi downvote tampaknya konyol.
Jo King

Downvoter, bisakah Anda jelaskan, apakah ini tentang I / O atau sesuatu yang lain? Tentang format tas, saya tidak tahu Perl, apakah ini umum untuk I / O di golf Perl? Melihat dokumen (di-cache karena situs sedang down), mereka bagi saya lebih seperti dicts dengan jumlah, mirip dengan Python collections.Counteryang 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?
xnor

3
Downvote adalah kesalahan, dimaksudkan untuk bangkit.
Jonathan Allan

7

Haskell , 44 byte

import Data.List
foldl1(\a x->a++',':(x\\a))

Cobalah online!

Output adalah string seperti ONE,TW,HRE,SVEENdengan koma antara hari.


1
Betapa \`. And an unexpected bagusnya penggunaan format output untuk menghindari keharusan melipat case base foldl1` juga.
xnor

7

JavaScript (Node.js) , 59 byte

a=>a.map(h=>([...t].map(c=>h=h.replace(c,'')),t+=h,h),t='')

Cobalah online!

Solusi yang cukup mudah. Untuk setiap kata h, hapus huruf yang sudah kita miliki.

Ini adalah versi yang dijelaskan dari kode itu:

f = list => {
  // the string that accumulates all the letters already bought
  let accu = '';
  // for every word in the list
  return list.map( word => {
    // for every letter already bought 
    [...accu]
      // remove the letter from the word
      .map(char => {
        return word = word.replace(char,'')
      });
    // add not bought letters to accumulator
    accu += word;
    // the reduced word (without already bought letters) should be added to result map
    // this represents the letters to buy today
    return word
  }, accu)
}

console.log(f(['ONE', 'TWO', 'THREE', 'SEVENTEEN']))
console.log(f(['ONE', 'TWO', 'ONE', 'THREE']))
console.log(f(['ABC', 'AABC', 'ABBC', 'ABCC', 'AABBCC']))
console.log(f(['SHORT', 'LOONG', 'LOOOONG', 'LOOOOOOONG', 'SHORT', 'LOOONG']))


Anda dapat menghemat 1 byte dengan meminjam satu-satunya trik yang bermanfaat dari solusi saya yang terlalu rumit.
Arnauld

5

J , 29 byte

-29 bytes terima kasih kepada FrownyFrog!

(],a.<@#~0>.-&(1#.a.=/;))/@|.

Cobalah online!

Pos Asli

J , 58 byte

[:}.@>[:(],<@(/:~@({.@>@-.&(((e.<@#[){:)\));))&.>/<@a:,~|.

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.

wo=.{.@>@-.&(((e. <@# [) {:)\)

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 ABBAmenjadi:

┌─┬─┬──┬──┐
│A│B│BB│AA│
└─┴─┴──┴──┘

Yang ketiga Aakan menjadi AAAdan seterusnya. Ini dilakukan dengan frasa ((e. <@# [) {:)\, yang mengambil setiap awalan \, melihat elemen terakhirnya {:, dan membuat topeng semua elemen dalam awalan itu yang cocok dengan e.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:

[: }.@> [: (] , <@(/:~@wo ;))&.>/ <@a: ,~ |.

Pada dasarnya, semua yang kita lakukan di sini adalah mengatur masalah kita sebagai pengurangan tunggal. Kami mulai membalikkan input |.dan menambahkannya ,~sebagai kartu as a:, atau kotak kosong, yang akan menjadi nilai awal dari hasil akhir kami, seperti:

┌─────────┬─────┬───┬───┬──┐
│SEVENTEEN│THREE│TWO│ONE│┌┐│
│         │     │   │   ││││
│         │     │   │   │└┘│
└─────────┴─────┴───┴───┴──┘

Kami menempelkan kata kerja berikut di antara setiap elemen untuk mempengaruhi reduksi:

(] , <@(/:~@wo ;))/

Ini mengatakan: ambil input yang benar ](yaitu, hasil kami) dan tambahkan , input kiri (ini ONEpada iterasi pertama, TWOpada tanggal 2, dll) tanpa wokehancuran ;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: }.@>.


[:}.@>|.(],a.<@#~0>.-&(1#.a.=/;))&.>/@,<@a:
FrownyFrog

Sederhana (],a.<@#~0>.-&(1#.a.=/;))/@|.juga berfungsi kecuali saya kehilangan kasing.
FrownyFrog

Sejauh yang saya tahu, penyortiran tidak ada dalam persyaratan.
FrownyFrog

2
Diperbarui dan sekarang saya punya waktu untuk menyerapnya, hanya ingin mengatakan lagi: Itu bagus sekali J!
Jonah

4

JavaScript (ES6),  66  65 byte

a=>a.map(b=s=>[...s].filter(c=>x==(x=x.replace(c))?b+=c:0,x=b+0))

Cobalah online!

Berkomentar

bbxcxb

a =>                      // a[] = input
  a.map(b =               // initialize b to the callback function of this map()
                          // it will be coerced to a string that does not contain
                          // any letter in uppercase
    s =>                  // for each entry s in a[]:
    [...s].filter(c =>    //   for each character c in s:
      x == (              //     check whether x is changed when
        x = x.replace(c)  //     c is replaced with 'undefined'
      ) ?                 //     if so:
        b += c            //       append c to b and keep c
      :                   //     else:
        0,                //       discard c
      x = b + 0           //     coerce b to a string and save it in x
    )                     //   end of filter()
  )                       // end of map()

4

C ++ (gcc) , 177 170 byte

-5 byte berkat tip @ anatolyg, -2 byte untuk hal-hal kecil yang saya perhatikan.

#import<random>
#define v std::vector<std::string>
v a(v p){std::vector<int>o(91),b;int j=-1;for(auto i:p){b=o;p[++j]="";for(int c:i)--b[c]<0?p[j]+=c,++o[c]:0;}return p;}

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!


Anda dapat melakukan #define v std::vector<std::stringdan menghapus using namespace stduntuk mengurangi jumlah byte sebanyak 6 byte.
anatolyg

2

C # (Visual C # Interactive Compiler) , 123 byte

a=>{var b="";for(dynamic i=0,e,f;i<a.Count;b+=a[i++]=f)foreach(var c in((e,f)=(b.ToList(),"")).f+a[i])f+=e.Remove(c)?"":c;}

Cobalah online!

Fungsi anonim yang menghasilkan dengan memodifikasi array input.

// a: input array of strings
a=>{
  // b: cumulative letters
  var b="";
  for(
    // i: loop index of string
    // e: copy of cumulative letters for manipulation
    // f: characters missing from current string
    dynamic i=0,e,f;
    // iterate over each string in a
    i<a.Count;
    // add missing letters of the day to
    // cumulative missing letters and
    // update array for output
    b+=a[i++]=f
  )
    // iterate current string with character c
    foreach(var c in
      // tuplized variable assignment
      // e=b.ToList()
      //   set e to a copy of the cumulative letters
      // f=""
      //   initially there are no letters needed for the day
      ((e,f)=
      (b.ToList(),"")).f+a[i]
    )
      // conditionally add c to missing letters for the day
      f+=e.Remove(c)?"":c;
}

2

R, 119 112 106 103 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)

a=scan(,'');b=a=strsplit(a,'');for(i in 2:length(a))b[[i]]=vecsets::vsetdiff(a[[i]],unlist(b[1:i-1]));b

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 untuk unlistdan strsplituntuk mengubah string menjadi vektor karakter individu yang akan keren untuk diketahui. Saya juga menggunakan vsetdifffungsi dalam vecsetspaket Carl Withoft untuk mendapatkan perbedaan set huruf yang diperlukan untuk hari berikutnya dan surat-surat saat ini dimiliki.


1
tidak, tidak apa-apa. Saya sendiri agak enggan menggunakan paket-paket eksternal, tetapi hanya saya ... Saya lebih suka mendekati tantangan dalam kode R dasar;)
digEmAll






2

Japt , 15 14 byte

£Q®X=rZPPÃQ±XX

Cobalah

£Q®X=rZPPÃQ±XX     :Implicit input of array
£                  :Map each X
 Q®                :  Map each Z in Q (initially a quotation mark)
   X=              :    Reassign to X
     rZ            :    Replace Z with
       P           :    The empty string
        P          :    With the default global flag disabled
         Ã         :  End map
          Q±X      :  Append X to Q
             X     :  Return X

1
@Downvoter, mohon kesopanan untuk memberikan komentar.
Shaggy


1

PowerShell , 71 byte

$args|%{$w=$_;$p|% t*y|%{$w=$w-replace"^(.*?)$_(.*)",'$1$2'};$w;$p+=$w}

Cobalah online!

Mengambil kata $args- kata masukan dan mengulanginya. Setiap iterasi kami atur kata saat ini $w, kemudian $plewati ool kami dari surat yang sudah dibeli. Setiap loop dalam, kami melakukan regex -replacepada $word kami saat ini , sehingga kami mengganti hanya contoh pertama dari surat dari $pool 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+=$wuntuk kata berikutnya.


1

Excel VBA, 127 byte

Function z(w)
z=""
For Each x In w.Cells
v=x.value
For y=1To Len(z)
v=Replace(v,Mid(z,y,1),"",1,1)
Next
z=z&v
Next
End Function

Mengambil input dalam bentuk rentang excel.


1

C (gcc) , 118 byte

m(a,r,q,u)char**a,*r,*q,*u;{for(;*a;a++,memcpy(r,q,255))for(memcpy(q,r,255),u=*a;*u;u++)*u=r[*u]-->0?32:(q[*u]++,*u);}

Cobalah online!

Sebagai bonus kecil, dibutuhkan stok rawal sebagai array. Menghasilkan input yang diakhiri dengan null null-terminated-string list adengan semua huruf yang dimiliki sebelumnya diganti dengan spasi.




1

Swift 4.2 / Xcode 10.2 , 244 242 239 238 byte

a.reduce(([Character:Int](),[String]())){c,l in let b=l.reduce(into:[Character:Int]()){$0[$1,default:0]+=1}.map{($0,max(0,$1-(c.0[$0] ?? 0)))};return(c.0.merging(b){$0+$1},c.1+[b.map{String(Array(repeating:$0.0,count:$0.1))}.joined()])}.1

Cobalah online!

Surat-surat tidak diatur dalam urutan abjad, tidak dilarang oleh aturan.


1

Scala, 68 byte

(c:Seq[String])=>c./:(Seq(""))((a,n)=>a:+n.diff(a./:("")(_+_))).tail

Cobalah online!

/: adalah kependekan dari operator foldLeft, a is aggregation, akhirnya mengembalikan hasil yang kita inginkan, n adalah elemen berikutnya

Tidak bermain golf

def NewLettersPerDay(c: Seq[String]): Seq[String] = {
    c.foldLeft(Seq(""))((agg, next) => {
      val existingLetters = agg.reduce(_+_)
      val newDayLetters = next.diff(existingLetters)
      agg :+ newDayLetters
    }).tail
}


0

Arang , 18 byte

EθΦι¬⊙…θκ‹№…ιμλ№νλ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

 θ                  Input array
E                   Map over strings
   ι                Current string
  Φ                 Map over characters
       θ            Input array
      …             Truncated to length
        κ           Outer index
    ¬               Logical Not
     ⊙              Any element exists where
          №         Count of
              λ     Current letter in
            ι       Outermost word
           …        Truncated to
             μ      Current letter index
         ‹          Is less than
               №    Count of
                 λ  Current letter in
                ν   Innermost word
                    Implicitly print each day's bought letters on their own line

0

PHP, UTF-8 aware (253 bytes)

<?php $p=[];for($i=1;$i<$argc;$i++){$a=$p;$b=[];for($j=0;$j<mb_strlen($s=$argv[$i]);$j++){$k=1;if(isset($a[$c=mb_substr($s,$j,1)]))if($a[$c]){$k=0;$a[$c]--;}if($k){echo $c;if(isset($b[$c]))$b[$c]+=$k;else $b[$c]=$k;}}$p=array_merge($p,$b);echo PHP_EOL;}





Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.