Każdego dnia umieszczasz nowe słowo na znaku namiotu z ruchomymi literami , kupując tylko te litery, które musisz napisać. W miarę możliwości ponownie korzystasz z zakupionych liter do wcześniejszych słów. Biorąc pod uwagę słowa, które chcesz pisać każdego dnia w kolejności, wypisz litery, które kupujesz każdego dnia.
Przykład
Input: ['ONE', 'TWO', 'THREE', 'SEVENTEEN']
Output: ['ENO', 'TW', 'EHR', 'EENSV']
Dzień 1: Aby rozpocząć bez liter, więc pisać ONE
, można kupić wszystkie swoje litery E
, N
, O
.
Dzień 2: Następnego dnia chcesz odłożyć TWO
(zdjąć ONE
). Masz już O
od ONE
, więc kupujesz dodatkowy TW
.
Dzień 3: W tym momencie masz ENOWT
. Do pisania
THREE
potrzebujesz EHR
. Pamiętaj, że musisz kupić sekundę E
oprócz tej, którą posiadasz.
Dzień 4: Aby napisać SEVENTEEN
, potrzebujesz 4
E
, z których masz już dwa (nie trzy!), Więc kupujesz dwa kolejne. Mieć również T
i jedną z N
„s, więc kupić pozostałe litery:
EENSV
.
W tym przykładzie wyprowadziliśmy litery posortowane alfabetycznie, ale możesz je wypisać w dowolnej kolejności.
Dane wejściowe: niepusta lista niepustych ciągów liter A-Z
. Jeśli wolisz, możesz użyć małych liter. Listy znaków są odpowiednie dla napisów.
Wyjście: wydrukuj lub wydrukuj dodatkowe litery, które musisz kupić każdego dnia. Listy z jednego dnia mogą być wyprowadzane w dowolnej kolejności, ale dni muszą nadejść we właściwej kolejności.
Litery z każdego dnia powinny być oddzielone od innych dni, abyś wiedział, gdzie kończy się dzień. Separator końcowy i / lub wiodący jest w porządku, zarówno w ciągu dnia, jak i między dniami. Pamiętaj, że w dniu może nie być kupionych żadnych liter, co powinno znaleźć odzwierciedlenie w wynikach (spacja lub pusta linia jest w porządku, nawet ostatniego dnia).
Przypadki testowe
['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', '', '']
Oto wszystkie dane wejściowe i wyjściowe jako osobne listy:
[['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', '', '']]
A jako ciągi rozdzielone spacjami (końcowe spacje w wyjściach mają znaczenie):
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
Liderów
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
ważne dla ostatniego wyniku? AKA nie używa ograniczników?Odpowiedzi:
Haskell,
5449 bajtówWypróbuj online!
Budujemy listę wyników, obliczając parami różnicę listy (
\\
) listy danych wejściowych i skumulowane dołączenie listy wyników (zaczynając od""
).Zarówno w zakresie, jak
Data.List
iData.Function
zakresie (np. Za pomocą środowiska lambdabot), można to skrócić do 30 bajtów:Edycja: -5 bajtów dzięki @Sriotchilism O'Zaic.
źródło
Python 2 ,
7268 bajtów-4 bajty dzięki Jonathanowi Allanowi.
Wypróbuj online!
Skomentował
źródło
for r in input():
oszczędza 4 bajty.Galaretka , 7 bajtów
Wypróbuj online!
Wyjście:
-separated string.
źródło
Perl 6 , 44 bajtów
Wypróbuj online!
Dane wyjściowe jako lista list znaków.
Wyjaśnienie
źródło
Bag(E(2), N, S, V)
musiałoby faktycznie pokazywać, że dwa E są OK.collections.Counter
których nie zamierzałem zezwalać jako wynik. Czy można z łatwością iterować po eltach torby z wielorakością, rzutować na listę / tablicę, wyświetlać z krotnością itp.?Haskell , 44 bajty
Wypróbuj online!
Dane wyjściowe to ciąg znaków podobny
ONE,TW,HRE,SVEEN
do przecinków między dniami.źródło
\`. And an unexpected
podstawowej skrzynki foldl1.JavaScript (Node.js) , 59 bajtów
Wypróbuj online!
Całkiem proste rozwiązanie. Dla każdego słowa
h
usuń litery, które już mamy.Oto wyjaśniona wersja tego kodu:
źródło
J , 29 bajtów
-29 bajtów dzięki FrownyFrog!
Wypróbuj online!
Oryginalny post
J , 58 bajtów
Wypróbuj online!
Dzięki ngn za pomoc w ulepszaniu „odejmowania liter przy jednoczesnym przestrzeganiu części powtarzania”.
Nie jest to idealne dopasowanie do J, ale rozświetlające ćwiczenie.
Zacznijmy od skonstruowania czasownika pomocniczego
wo
(„bez”), który usuwa wszystkie znaki w jednym ciągu z drugiego, przy jednoczesnym przestrzeganiu powtórzeń.Jest tutaj zabawny pomysł: sprawiamy, że każde powtarzające się wystąpienie postaci jest niepowtarzalne, powtarzając ją wymaganą liczbę razy. Zatem jeśli naszym oryginalnym ciągiem jest
ABBA
:Trzeci
A
stałby sięAAA
i tak dalej. Dokonuje tego fraza((e. <@# [) {:)\
, która bierze każdy prefiks\
, patrzy na jego ostatni element{:
i konstruuje maskę wszystkich elementów w tym prefiksie, które pasują doe.
tego ostatniego elementu, a następnie filtruje i zaznacza tylko te elementy<@#
.Dzięki naszym wejściom zarówno „unikatowymi”, możemy teraz bezpiecznie używać normalnego zestawu minus
-.
przy jednoczesnym zachowaniu powtarzalności.Następnie otwieramy każdy wynik i bierzemy tylko pierwszy element, aby „cofnąć” nasze powtórzenia:
{.@>
Po podłączeniu tego czasownika pomocniczego nasze ogólne rozwiązanie (które po prostu podkreśla):
Zasadniczo wszystko, co tutaj robimy, to ustawić nasz problem jako pojedynczą redukcję. Zaczynamy odwracać dane wejściowe
|.
i dodawać do nich,~
asaa:
lub puste pole, które będzie początkową wartością naszego końcowego wyniku, tak jak:Trzymamy następujący czasownik między każdym elementem, aby uzyskać redukcję:
Ten mówi: podjąć właściwą wejście
]
(czyli nasz wynik) i dołączyć do niego,
lewą wejście (to jestONE
na pierwszej iteracji,TWO
na 2, etc) bezwo
tej raze z;
prawego wejścia (czyli bez żadnych wcześniejszych listach do tej pory używane), ale przed dołączeniem posortuj go/:~
i zaznacz ponownie<@
.Na końcu tego wszystkiego uzyskamy pożądany wynik, listę pudeł, ale wszystko w jednym dużym dodatkowym pudełku, nadal z pustym pudełkiem z przodu. W ten sposób możemy otworzyć okno, aby usunąć zewnętrzną i zabić pierwszego elementu:
}.@>
.źródło
[:}.@>|.(],a.<@#~0>.-&(1#.a.=/;))&.>/@,<@a:
(],a.<@#~0>.-&(1#.a.=/;))/@|.
działa również, chyba że brakuje mi skrzynki krawędzi.JavaScript (ES6),
6665 bajtówWypróbuj online!
Skomentował
źródło
C ++ (gcc) ,
177170 bajtów-5 bajtów dzięki końcówce @ anatolyg, -2 bajty na małe rzeczy, które zauważyłem.
Wyjaśnienie
#import<random>
dodaje oba<string>
i<vector>
dla połowy bajtów.Najpierw tworzy 91-elementowy wektor 0 (tylko indeksy 65-90 są używane do przechowywania wystąpień liter), a inny wektor tego samego typu, ale nie ustawiony na wartość. Iteruje przez każdy element danych wejściowych (dni): pobiera aktualnie posiadane litery, pobiera litery, które są potrzebne na dany dzień, zastępuje dane wejściowe w indeksie wymaganą kwotą i aktualizuje posiadane litery. Zwraca zastąpione wejście.
Wypróbuj online!
źródło
#define v std::vector<std::string
i usunąć,using namespace std
aby zmniejszyć liczbę bajtów o 6 bajtów.C # (interaktywny kompilator Visual C #) , 123 bajty
Wypróbuj online!
Anonimowa funkcja wysyłająca dane poprzez modyfikację tablicy wejściowej.
źródło
R,
119 112 106103 bajtów-7 bajtów od aliasingu dwóch dłuższych nazw funkcji, a teraz pobieranie danych wejściowych od
scan()
-6 bajtów, aby wywoływać tylko
strsplit()
raz na początku-3 bajtów, aby pozbyć się aliasingu ponownie i przypisać dwie zmienne w jednym wywołaniu
(Edytowano również liczbę bajtów, która wcześniej była błędnie niska)
To moje pierwsze zgłoszenie PPCG dowolnego rodzaju! Więc nie mam pojęcia, co robię zarówno pod względem golfa, jak i etykiety. Dane wyjściowe to lista wektorów, które mogą, ale nie muszą spełniać warunki wyzwania. :-P
Jeśli chodzi o sam kod, pobiera dane wejściowe od użytkownika
scan()
i porównuje litery każdego dnia z literami posiadanymi łącznie, jak w innych rozwiązaniach. Jeśli istnieją krótsze alternatywyunlist
istrsplit
konwersje ciągów znaków na wektory poszczególnych znaków, byłoby fajnie wiedzieć. Użyłem równieżvsetdiff
funkcji w pakiecie Carla Withofta,vecsets
aby uzyskać różnicę między literami potrzebnymi na następny dzień a posiadanymi literami.źródło
Python 2 ,
102100 bajtówWypróbuj online!
-2 bajty, dzięki Embodiment of Ignorance
źródło
Japt ,
1514 bajtówSpróbuj
źródło
Czerwony , 75 bajtów
Wypróbuj online!
źródło
PowerShell , 71 bajtów
Wypróbuj online!
Pobiera słowa wejściowe
$args
i iteruje je. Każdej iteracji ustawiamy bieżące słowo$w
, a następnie zapętlamy nasz$p
zbiór już zakupionych liter. W każdej wewnętrznej pętli wykonujemy wyrażenie regularne-replace
na naszym bieżącym$w
zleceniu, aby zastąpić tylko pierwszą instancję litery z naszego$p
ool. Po przejrzeniu wszystkich liter w puli, wypisujemy to, co pozostało$w
(tj. To, co musimy kupić), a następnie przypinamy te litery do naszej puli,$p+=$w
aby uzyskać następne słowo.źródło
Excel VBA, 127 bajtów
Pobiera dane wejściowe w postaci zakresu programu Excel.
źródło
C (gcc) , 118 bajtów
Wypróbuj online!
Jako mały bonus przyjmuje
r
na początek zapasy jako zestaw. Zwraca wejściową listę zakończonych znakiem zerowym zakończonych znakiem zerowym,a
a wszystkie używane litery są zastąpione spacjami.źródło
05AB1E , 11 bajtów
-6 dzięki Kevin Cruijssen
Wypróbuj online!
źródło
J
z»
. Możesz także zapisać 4 bajty, zastępującvyð.;}ðK
jeSõ.;
11 bajtami .Swift 4.2 / Xcode 10.2 ,
244242239238 bajtówWypróbuj online!
Litery nie są ułożone w kolejności alfabetycznej, nie jest to zabronione przez reguły.
źródło
Scala, 68 bajtów
Wypróbuj online!
/: jest skrótem od operatora foldLeft, a jest agregacją, ostatecznie zwraca pożądany wynik, n jest kolejnym elementem
Nie grał w golfa
źródło
PHP , 87 bajtów
Wypróbuj online!
źródło
Węgiel drzewny , 18 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
źródło
Obsługa PHP, UTF-8 (253 bajtów)
źródło
C # (interaktywny kompilator Visual C #) , 112 bajtów
Wypróbuj online!
źródło
Perl 5
-p
, 28 bajtówWypróbuj online!
źródło
Ruby , 52 bajty
Wypróbuj online!
źródło
K (ngn / k) , 36 bajtów
Wypróbuj online!
źródło
Stax , 7 bajtów
Uruchom i debuguj
Wyjście jest oddzielone znakiem nowej linii.
źródło