Marquee підписувати букви


41

Кожного дня ви складаєте нове слово на маркіровому знаку з рухомими літерами , купуючи лише ті літери, які вам потрібні для написання. Коли ви повторно використовуєте куплені вами листи для попередніх слів. Враховуючи слова, які ви хочете писати кожен день, по черзі, виведіть букви, які купуєте щодня.

Приклад

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

День 1: Ви починаєте без яких - або букв, так писати ONE, ви купуєте всі свої листи E, N, O.
День 2: Наступного дня ви хочете миритися TWO (знявши ONE). У вас уже є Oвід ONE, тому ви купуєте додатковий TW.
День 3: На даний момент у вас є ENOWT. Щоб писати THREE, потрібно EHR. Зауважте, що вам потрібно придбати секунду Eна додаток до тієї, що у вас є.
День 4: Щоб писати SEVENTEEN, вам потрібно всього 4 E, з яких у вас вже є два (не три!), Тож ви купуєте ще два. Крім того, є Tі один з Nроків, так що ви купуєте залишилися літери: EENSV.

У цьому прикладі ми виводимо літери, відсортовані за алфавітом, але ви можете виводити їх у будь-якому порядку.

Введення: Непорожній список не порожніх рядків літер A-Z. Якщо ви хочете, ви можете використовувати малі регістри. Списки символів є чудовими для рядків.

Вихід: виведіть або роздрукуйте додаткові листи, які потрібно купувати щодня. Листи на день можуть виводитися в будь-якому порядку, але дні мають бути в правильному порядку.

Букви від кожного дня повинні бути відокремлені від інших днів, щоб ви могли сказати, де закінчується день. Кінцевий та / або провідний роздільник добре, як протягом доби, так і між днями. Зауважте, що в день може бути не придбано жодних листів, які повинні бути відображені у висновку (пробіл чи порожній рядок добре, навіть за останній день).

Тестові справи

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

Ось усі входи та виходи як окремі списки:

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

І як рядки, розділені пропуском (значення проміжків у вихідних даних мають значення):

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  

Табло лідерів


5
Сценарій диких лідерів з'явився у вік користувачів: o
Квінтек,

Чи можемо ми вивести як масив символів, який потрібно купувати, а не рядок усіх символів? наприклад:[['E', 'N', 'O'], ...]
Пуховик

Чи SHORTLONGOOOOOдійсний вихід для останнього виходу? AKA не використовує роздільників?
Чарівна восьминога урна

@Downgoat Так, списки є символами, які добре виводяться.
xnor

@MagicOctopusUrn Ні, вам потрібні роздільники, інакше ви не можете сказати, які букви бувають на який день.
xnor

Відповіді:


10

Haskell, 54 49 байт

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

Спробуйте в Інтернеті!

Ми будуємо список вихідних даних, обчислюючи попарно різницю списку ( \\) списку вхідних даних і сукупне додавання списку вихідних даних (починаючи з "").

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

І з обома, Data.Listі Data.Functionза сферою дії (наприклад, за допомогою середовища lambdabot) це може бути скорочено до 30 байт:

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

Редагувати: -5 байт завдяки @Sriotchilism O'Zaic.



10

Python 2 , 72 68 байт

-4 байти завдяки Джонатану Аллану.

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

Спробуйте в Інтернеті!

Прокоментував

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 байти.
Джонатан Аллан


7

Perl 6 , 44 байти

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

Спробуйте в Інтернеті!

Виводиться як список списків символів.

Пояснення

{                                      } # 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
Причину пониження було б вдячно
Джо Кінг,

Не погіршення, але я скажу, що цей формат виходу занадто далеко. Щось начебто Bag(E(2), N, S, V)потрібно було б фактично показати два E, щоб це було добре.
xnor

3
Що, справді? Це лише форматування друку за замовчуванням. Результат повернення - це не упорядкований список, який містить ці символи (і може містити кілька однакових символів). Я оновлю формат вихідного сигналу, щоб краще відобразити це, але нижня заявка здається смішною.
Джо Кінг

Далі, поясніть, будь ласка, це стосується вводу / виводу чи чогось іншого? Щодо формату сумки, я не знаю Perl, це поширене для вводу-виводу в гольфах Perl? Дивлячись на документи (кешовані через те, що сайт не працює), мені здається, вони більше схожі на дикти з підрахунками, схожі на Python, collections.Counterякі я не збирався дозволити як вихід. Чи можна легко повторювати багатогранність мішків, подавати до списку / масиву, відображати з кратністю тощо?
xnor

3
Downvote був помилкою, мав бути піднятим.
Джонатан Аллан

7

Haskell , 44 байти

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

Спробуйте в Інтернеті!

Вихід - це такий рядок, як ONE,TW,HRE,SVEENкомами між днями.


1
Яке приємне використання вихідного формату, щоб уникнути необхідності складання \`. And an unexpected базового корпусу foldl1`.
xnor

7

JavaScript (Node.js) , 59 байт

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

Спробуйте в Інтернеті!

Досить просте рішення. Для кожного слова hвидаліть букви, які ми вже маємо.

Ось пояснена версія цього коду:

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


Ви можете зберегти 1 байт , запозичивши єдиний гідний трюк з мого інакше надскладного рішення.
Арнольд

5

J , 29 байт

-29 байт завдяки FrownyFrog!

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

Спробуйте в Інтернеті!

Оригінальна публікація

J , 58 байт

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

Спробуйте в Інтернеті!

Завдяки ngn за допомогу в покращенні "віднімання літер при дотриманні частини повторень".

Не чудово підходить для J, але освітлююча вправа.

Почнемо з побудови дієслова helper wo("без"), який видаляє всі параметри в одному рядку з іншого, дотримуючись повторів.

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

Тут є цікава ідея: ми робимо кожен повторний екземпляр символу унікальним, повторюючи його необхідну кількість разів. Таким чином, якщо це наш початковий рядок, ABBAвін стає:

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

Третьою Aстане AAAта ін. Це досягається фразою ((e. <@# [) {:)\, яка бере кожен префікс \, розглядає кінцевий елемент {:його і створює маску з усіх елементів у цьому префіксі, які відповідають e.цьому кінцевому елементу, а потім фільтрує та встановлює поля лише з цими елементами <@#.

З нашими вхідними даними, "унікальними", ми можемо тепер безпечно використовувати нормальний заданий мінус -. , дотримуючись повторення.

Потім ми відкриваємо кожен результат і беремо лише перший елемент, щоб "скасувати" наші повтори: {.@>

Підключивши це допоміжне дієслово, наше загальне рішення (яке його просто підкреслює):

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

По суті, все, що ми робимо тут, - це налаштування нашої проблеми як єдиного скорочення. Ми починаємо перевертати введення |.та додавати до нього ,~туз a:або порожнє поле, яке буде початковим значенням нашого кінцевого результату, як-от так:

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

Ми вкладаємо наступне дієслово між кожним елементом, щоб здійснити зменшення:

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

Це говорить: візьміть правий вхід ](тобто наш результат) і додайте до нього , лівий вхід (це ONEна першій ітерації, TWOна 2-му і т. woД. ) Без різного ;правого вводу (тобто без жодних попередніх літер досі використовується), але перед тим, як додавати, відсортуйте його /:~та поставте його знову <@.

Наприкінці всього цього у нас буде результат, який ми хочемо, список коробок, але всередині однієї великої додаткової коробки, і все ж із порожньою коробкою на передній панелі. Таким чином , ми відкриваємо для видалення зовнішньої коробки і вбити перший елемент: }.@>.


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

Простий (],a.<@#~0>.-&(1#.a.=/;))/@|.також працює, якщо я не пропускаю крайній корпус.
FrownyFrog

Наскільки я можу сказати, сортування ніде не відповідає вимогам.
FrownyFrog

2
Оновлено, і тепер, коли я встиг поглинути це, просто хотів ще раз сказати: Це чорт приємний J!
Йона

4

JavaScript (ES6),  66  65 байт

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

Спробуйте в Інтернеті!

Прокоментував

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 байт

-5 байт завдяки підказці @ anatolyg, -2 байти до дрібниць, які я помітив.

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

Пояснення

#import<random>додає як <string>і <vector>на половину байтів.

Перший створює 91-елементний вектор 0s (лише індекси 65-90 використовуються для зберігання частоти букв), а інший вектор того ж типу, але не встановлений у значення. Ітератується через кожен елемент введення (днів): отримує літери, що належать на даний момент, отримує потрібні для дня букви, переосмислює введення в індексі на необхідну кількість та оновлює наявні літери. Повертає переоформлений вхід.

Спробуйте в Інтернеті!


Ви можете зробити #define v std::vector<std::stringі видалити, using namespace stdщоб зменшити кількість байтів на 6 байт.
anatolyg

2

C # (Visual C # Interactive Compiler) , 123 байти

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

Спробуйте в Інтернеті!

Анонімна функція, яка виводиться, змінюючи вхідний масив.

// 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 байт

-7 байтів з псевдоніму двох довших імен функцій, і тепер беруть введення користувача від scan()
-6 байт для виклику лише strsplit()один раз на початку
-3 байти, щоб знову позбутися від псевдоніму та призначити дві змінні в одному виклику

(Також відредагував кількість байтів, яка раніше була помилково низькою)

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

Це моє перше подання про PPCG будь-якого типу! Тож я поняття не маю, чим займаюсь і з точки зору гольфу, і з точки зору розміщення етикету. Вихід - це перелік векторів, які можуть або не відповідають умовам завдання. :-P

Що стосується самого коду, він вимагає введення користувачем через scan()і порівнює листи кожного нового дня з буквами, що належать сукупно, як і в інших рішеннях. Якщо існують більш короткі альтернативи unlistі strsplitдля перетворення рядків у вектори окремих символів, було б здорово знати. Я також використав цю vsetdiffфункцію в пакеті Карла Вітхофта, vecsetsщоб отримати різницю літер, необхідних для наступного дня, та поточних листів.


1
ні, це прекрасно. Я трохи неохоче використовую зовнішні пакунки, але це тільки я ... Я вважаю за краще підійти до викликів у базовому коді R;)
digEmAll






2

Japt , 15 14 байт

£Q®X=rZPPÃQ±XX

Спробуй це

£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, будь ласка, майте пристойність, щоб залишити коментар.
Кудлатий


1

PowerShell , 71 байт

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

Спробуйте в Інтернеті!

Займає вхідні слова $argsта повторює їх. Кожну ітерацію ми встановлюємо поточним словом $w, а потім $pпереносимо петлю на нашу вже придбану букву. Кожен внутрішній цикл, ми виконуємо регулярний вираз -replaceпо поточному порядку $w, так що ми замінюємо лише перший екземпляр листа з нашого $pool. Після того, як ми переглянемо всі букви в пулі, ми виводимо те, що залишилося $w(тобто, що нам потрібно придбати), а потім торкаємося цих літер до нашого пулу $p+=$wдля наступного слова.


1

Excel VBA, 127 байт

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.


1

C (gcc) , 118 байт

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

Спробуйте в Інтернеті!

Як невеликий бонус, він бере запас rна початку як масив. Виводить вхідний null-завершений список-null-завершений рядок aз усіма попередніми літерами, заміненими пробілами.



1

05AB1E , 11 байт

-6 спасибі Кевіну Крейсейну

ćsvDysSõ.;»

Спробуйте в Інтернеті!


1
Ваш 15-byter працює, але я хотів би замінити буксирування Jз ». Також ви можете зберегти 4 байти, замінивши vyð.;}ðKна Sõ.; 11 байт .
Кевін Круїссен

Аааа ... мені знадобився S, щоб зробити його векторизованим.
Чарівний Восьминіг Урна

1

Swift 4.2 / Xcode 10.2 , 244 242 239 238 байт

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

Спробуйте в Інтернеті!

Букви не розташовані в алфавітному порядку, це не заборонено правилами.


1

Scala, 68 байт

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

Спробуйте в Інтернеті!

/: є короткою рукою для оператора foldLeft, a - це агрегація, в кінцевому рахунку повертає потрібний нам результат, n - наступний елемент

Без гольфу

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

Вугілля деревне , 18 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

 θ                  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 (253 байти)

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

0

C # (Visual C # Interactive Compiler) , 112 байт

a=>{var b="";for(int i=0;;b+=a[i++])foreach(var z in b)if(a[i].Contains(z))a[i]=a[i].Remove(a[i].IndexOf(z),1);}

Спробуйте в Інтернеті!


Хм ... Це кидає виняток?
дата

@dana Я впевнений, що функції, які нічого не повертають, можуть виходити за винятком
Embodiment of Ignorance,

Цікаво ... Я думаю, це не найдивніше правило.
дата




Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.