Kayan yazı işareti


41

Her gün , hareketli harfler içeren bir kayan yazı işaretine yeni bir kelime koyuyorsun , sadece yazman gereken harfleri alıyorsun. Mümkün olduğunda daha önceki kelimeler için satın aldığınız harfleri yeniden kullanırsınız. Her gün sırayla yazmak istediğiniz sözcükler göz önüne alındığında, her gün satın aldığınız harfleri yazınız.

Örnek

Input:  ['ONE', 'TWO', 'THREE', 'SEVENTEEN']
Output: ['ENO', 'TW', 'EHR', 'EENSV']

1. Gün: Çok yazma, hiçbir harflerle başlayan ONE, kendisine ait tüm harfleri satın E, N, O.
2. Gün: Ertesi gün, koymak istiyorsun TWO (alarak ONE). Zaten bir Ogelen var ONE, bu yüzden ek bir satın almak TW.
3. Gün: Bu noktada, var ENOWT. Yazmak için THREEihtiyacın var EHR. Sahip olduğunuza Eek olarak bir saniye daha almanız gerektiğini unutmayın .
4. Gün: yazma için SEVENTEEN, size 4 lüzum Eiki fazla satın Eğer öyleyse, zaten iki (! Değil üç) sahip olan 'ın toplam. Ayrıca var Tve birini Nkalan harfleri satın böylece, 's: EENSV.

Bu örnekte alfabetik olarak sıralanmış harfler çıktık, ancak bunları istediğiniz sırada verebilirsiniz.

Giriş: Boş olmayan harf dizelerinin boş olmayan bir listesi A-Z. İsterseniz küçük harf kullanabilirsiniz. Karakter listeleri, dizeler için iyidir.

Çıktı: Her gün satın almanız gereken ek harfleri yazdırın veya yazdırın. Bir günün harfleri herhangi bir sırayla verilebilir, ancak günlerin doğru sırayla gelmesi gerekir.

Her günün harfleri diğer günlerden ayrılmalıdır, böylece günün nerede bittiğini anlayabilirsiniz. İzleyen ve / veya öncü bir ayırıcı, hem bir gün içinde hem de günler arasında iyidir. Bir günün, çıkışta yansıtılması gereken, satın alınan mektuplara sahip olamayabileceğini unutmayın (boşluk veya boş satır son gün için bile iyidir).

Test durumları

['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', '', '']

İşte bütün girişler ve çıkışlar ayrı listeler halinde:

[['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', '', '']]

Ve boşlukla ayrılmış dizgiler (çıktılardaki izleyen boşluklar):

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  

Liderler


5
Kullanıcıların yaşlarında vahşi bir afiş senaryosu ortaya çıktı: o
Quintec

Tüm karakterlerin bir dizesinden ziyade, alınması gereken bir karakter dizisi olarak çıktı alabilir miyiz? eg:[['E', 'N', 'O'], ...]
Downgoat

Çıktı SHORTLONGOOOOOson çıktı için geçerli mi? AKA sınırlayıcı kullanmıyor mu?
Magic Octopus Urn,

@Downgoat Evet, listeler çıkış için uygundur.
xnor

@MagicOctopusUrn Hayır, sınırlayıcılara ihtiyacınız var, aksi halde hangi harflerin hangi gün için olduğunu söyleyemezsiniz.
xnor

Yanıtlar:


10

Haskell, 54 49 bayt

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

Çevrimiçi deneyin!

Çıktı listesini \\, girdi listesinin liste farkını ( ) ve çıktı listesinin kümülatif olarak eklenmesini (ile başlayarak "") ikili olarak hesaplayarak oluştururuz .

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

Her ikisi de Data.Listve Data.Functionkapsam dahilinde (örneğin lambdabot ortamını kullanarak), bu 30 bayta kısaltılabilir:

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

Düzenleme: @Sriotchilism O'Zaic sayesinde -5 bayt.



10

Python 2 , 72 68 bayt

Jonathan Allan sayesinde -4 bayt.

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

Çevrimiçi deneyin!

Yorumlananlar

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():4 bayt kaydeder.
Jonathan Allan,


7

Perl 6 , 44 bayt

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

Çevrimiçi deneyin!

Karakter listelerinin bir listesi olarak çıkar.

açıklama

{                                      } # 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
Olumsuzluğun bir nedeni memnuniyetle karşılanacaktı
Jo King,

Düşürücü değil, ama bu çıktı formatının çok uzak durduğunu söyleyeceğim. Gibi bir şey Bag(E(2), N, S, V)aslında iki E'nin tamam olduğunu göstermek gerekir.
xnor

3
Gerçekten mi? Bu sadece varsayılan baskı formatıdır. Döndürülen sonuç, bu karakterleri içeren (ve aynı karakterden birden fazlasını içerebilir) sıralanmamış bir listedir. Çıktı biçimlendirmesini daha iyi yansıtacak şekilde güncelleyeceğim, ancak olumsuz yönleri çok saçma görünüyor.
Jo King,

Downvoter, lütfen, G / Ç ya da başka bir şeyle ilgili olduğunu açıklayabilir misiniz? Çanta formatı hakkında, Perl'i bilmiyorum, bu Perl golflerinde I / O için yaygın mı? Baktığımızda docs (site kapalı olduğu için önbelleğe), daha Python en benzeyen sayımları ile dicts gibi olmak bana görünüyor collections.Counterben çıktı olarak izin vermek niyetinde değildi hangi. Torba eltleri çokluklu, bir listeye / diziye aktarılmış, çokluklu gösterme, vb. Üzerinde kolaylıkla yinelenebilir mi?
xnor

3
Aşağı oylama bir hataydı, yukarı olması gerekiyordu.
Jonathan Allan,

7

Haskell , 44 bayt

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

Çevrimiçi deneyin!

Çıktı ONE,TW,HRE,SVEENgünler arasında virgül gibi bir dizedir .


1
Çıktı formatının ne hoş bir kullanımı da \`. And an unexpected fold1` taban çantasını katlamak zorunda kalmamak için .
xnor

7

JavaScript (Node.js) , 59 bayt

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

Çevrimiçi deneyin!

Oldukça basit bir çözüm. Her kelime için h, sahip olduğumuz harfleri kaldırın.

İşte bu kodun açıklanmış bir versiyonu:

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']))


Aşırı karmaşık çözümümden sadece değerli bir numarayı ödünç alarak 1 byte tasarruf edebilirsiniz .
Arnauld

5

J , 29 bayt

FrownyFrog sayesinde -29 bayt!

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

Çevrimiçi deneyin!

Orijinal Gönderi

J , 58 bayt

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

Çevrimiçi deneyin!

"Tekrarlayan bölüme saygı gösterirken harfleri çıkar" ın iyileştirilmesine yardım için ngn teşekkürler.

J için uygun değil, aydınlatıcı bir egzersiz.

woTekrarlamalara saygı duyarak, tüm bölümleri bir dizgede diğerinden kaldıran bir yardımcı fiil ("olmadan") oluşturarak başlayalım.

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

Burada eğlenceli bir fikir var: Bir karakterin tekrarlanan her örneğini, istenen sayıda tekrarlayarak benzersiz hale getiririz. Böylece eğer orijinal dizgimiz şöyle ABBAolur:

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

Üçüncüsü Aolur AAAve böyle devam eder. Bu, ((e. <@# [) {:)\her öneki \alan, son elemanına bakıp, bu son elemanla {:eşleşen tüm elemanların maskesini oluşturur e.ve sonra sadece bu elemanları filtreler ve kutulara yerleştirir <@#.

Hem "benzersiz" hem de girdilerimizle, artık -. tekrarlamaya saygı duyurken normal seti eksi olarak güvenle kullanabiliriz .

Daha sonra her bir sonucu açıp tekrarlarımızı "geri almak" için sadece ilk elemanı seçeriz: {.@>

Bu yardımcı fiili taktığımızda, genel çözümümüz (basitçe onu ifade eder):

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

Temel olarak, burada yaptığımız tek şey sorunumuzu tek bir azaltma olarak ayarlamak. Girdiyi tersine çevirmeye başlıyoruz |.ve buna ,~ası a:veya boş bir kutu ekliyoruz ki bu da nihai sonucumuzun başlangıç ​​değeri olacak:

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

Azaltmayı gerçekleştirmek için her bir öğenin arasına şu fiili yapıyorum:

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

Bu diyor ki: doğru girdiyi al ](yani sonucumuzu) ve ona doğru girişi ekle , (bu ONEilk iterasyonda, 2.'de TWOvb.) Sağ girişin wogölgesi olmadan ;(yani, daha önce bir önceki harf olmadan) kullanılmış), ancak eklemeden önce sıralama /:~ve yeniden kutulama <@.

Tüm bunların sonunda istediğimiz sonuç, bir kutu listesi, ancak hepsi büyük bir ek kutu içinde ve hala öndeki boş kutu ile olacak. Böylece dış kutusunu kaldırmak ve ilk elemanı öldürmeye açmak: }.@>.


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

Basit bir (],a.<@#~0>.-&(1#.a.=/;))/@|.de kenar davası eksik olmadıkça çalışır.
FrownyFrog

Söyleyebileceğim kadarıyla, sıralama gereksinimleri hiçbir yerde yoktur.
FrownyFrog

2
Güncelleme ve şimdi onu emmek için zamanım oldu, sadece tekrar söylemek istedim: Bu çok güzel J!
Jonah

4

JavaScript (ES6),  66  65 bayt

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

Çevrimiçi deneyin!

Yorumlananlar

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 bayt

@ Anatolyg ucu için -2 bayt, fark ettiğim küçük şeylere -2 bayt.

#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;}

açıklama

#import<random>hem ekler <string>ve <vector>yarım bayt için.

İlk önce 0'lık 91 elemanlı bir vektör (sadece 65-90 indeksleri harf oluşumlarını depolamak için kullanılır) ve aynı tipte fakat aynı değere ayarlanmamış başka bir vektör yaratır. Girdideki her öğeyi (gün) tekrarlar: şu anda sahip olunan harfleri alır, gün için gereken harfleri alır, dizindeki girdiyi gereken miktarda geçersiz kılar ve sahip olunan harfleri günceller. Geçersiz kılınan girişi döndürür.

Çevrimiçi deneyin!


Bayt sayısını 6 bayt azaltmak için yapabilir #define v std::vector<std::stringve kaldırabilirsiniz using namespace std.
anatolyg

2

C # (Visual C # Etkileşimli Derleyici) , 123 bayt

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;}

Çevrimiçi deneyin!

Bir giriş dizisini değiştirerek çıkan isimsiz fonksiyon.

// 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 bayt

-7 bayt, iki uzun işlev ismini diğer isimlendirmekten ve şimdi kullanıcı girişi scan()
-6 bayttan sadece strsplit()başında bir kez
çağırmak için alıyor.

(Daha önce hatalı bir şekilde düşük olan bayt sayısını da düzenledi)

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

Bu benim ilk PPCG sunumum. Bu yüzden hem golf hem de görgü kuralları ile ilgili olarak ne yaptığım hakkında hiçbir fikrim yok. Çıktı, zorlama şartlarını yerine getirebilen veya veremeyen bir vektör listesidir. :-P

Kodun kendisine gelince, kullanıcı girdisini scan()her yeni günün mektuplarını kullanarak alır ve diğer çözümlerde olduğu gibi kümülatif olarak sahip olunan harflerle karşılaştırır. Dizeleri dönüştürmenin unlistve bunun için daha kısa alternatifler varsa, strsplitkarakterleri tek tek karakterlerin vektörlerine dönüştürmek bilmesi hoş olacaktır. Ayrıca vsetdiff, Carl Withoft'un vecsetspaketindeki işlevi , ertesi gün için gereken harflerin ve sahip olunan mevcut harflerin farkını belirlemek için de kullandım.


1
Hayır, tamamen iyi. Kendimi dış paketleri kullanmak konusunda biraz isteksizim, ama sadece benim ... Temel R kodundaki zorluklara yaklaşmayı tercih ediyorum;)
digEmAll






2

Japt , 15 14 bayt

£Q®X=rZPPÃQ±XX

Dene

£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, lütfen bir yorum bırakma eğilimindesiniz.
Shaggy


1

PowerShell , 71 bayt

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

Çevrimiçi deneyin!

Giriş kelimeleri alır $argsve bunların üzerinden yinelenir. Her bir iterasyonda şu anki kelimeyi belirledik $w, sonra $pzaten satın aldığımız harflerin yazarımızda dolaşıyoruz. Her bir iç döngüde, -replaceşu anki $wdüzenimizde bir regex uygularız, böylece mektubun ilk örneğini bizim $pyeminizden değiştiririz. Havuzdaki tüm harfleri okuduktan sonra geriye kalanları $w(yani satın almamız gerekenleri) çıkarıp bir $p+=$wsonraki kelime için bu harfleri havuzumuza yapıştırırız .


1

Excel VBA, 127 bayt

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

Excel aralığı şeklinde girdi alır.


1

C (gcc) , 118 bayt

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);}

Çevrimiçi deneyin!

Küçük bir bonus rolarak, başlangıçta stoku bir dizi olarak alır. aBoşluklarla değiştirilen tüm önceden sahiplenmiş harflerle boş sonlandırılmış boş sonlandırılmış dizgi listesinin çıktısını alır .




1

Swift 4.2 / Xcode 10.2 , 244 242 239 238 bayt

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

Çevrimiçi deneyin!

Harfler alfabetik sıraya göre dizilmemiştir, kurallara uygun değildir.


1

Scala, 68 bayt

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

Çevrimiçi deneyin!

/: foldLeft operatörü için kısa yol, a toplama, sonuçta istediğimiz sonucu döndürür, n bir sonraki öğedir

Un-golfed

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

Kömür , 18 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

 θ                  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 farkında (253 bayt)

<?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;}





Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.