Каждый день вы помещаете новое слово на маркировочный знак с подвижными буквами , покупая только те буквы, которые вам нужны, чтобы написать его. Вы повторно используете буквы, которые вы купили для более ранних слов, когда это возможно. Учитывая слова, которые вы хотите писать каждый день по порядку, выводите буквы, которые вы покупаете каждый день.
пример
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
Leaderboards
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
действительным для последнего вывода? АКА, не используя разделители?Ответы:
Haskell,
5449 байтПопробуйте онлайн!
Мы строим выходной список, вычисляя попарно разницу в списке (
\\
) входного списка и кумулятивное добавление выходного списка (начиная с""
).В обоих случаях
Data.List
иData.Function
в области видимости (например, с помощью среды lambdabot) это можно сократить до 30 байт:Изменить: -5 байт благодаря @Sriotchilism O'Zaic.
источник
Python 2 ,
7268 байт-4 байта благодаря Джонатану Аллану.
Попробуйте онлайн!
комментарии
источник
for r in input():
экономит 4 байта.Желе , 7 байт
Попробуйте онлайн!
Вывод:
-отделенная строка.
источник
Perl 6 , 44 байта
Попробуйте онлайн!
Выходы в виде списка списков персонажей.
объяснение
источник
Bag(E(2), N, S, V)
что на самом деле нужно показать две буквы Э, чтобы быть в порядке.collections.Counter
которые я не собирался допускать в качестве вывода. Можно ли легко перебирать сумку elts с множественностью, приводить к списку / массиву, отображать с множественностью и т. Д.?Haskell , 44 байта
Попробуйте онлайн!
Вывод - это строка
ONE,TW,HRE,SVEEN
с запятыми между днями.источник
\`. And an unexpected
базовый регистр foldl1`.JavaScript (Node.js) , 59 байт
Попробуйте онлайн!
Довольно простое решение. Для каждого слова
h
удалите буквы, которые у нас уже есть.Вот объясненная версия этого кода:
источник
J , 29 байт
-29 байт благодаря FrownyFrog!
Попробуйте онлайн!
Оригинальный пост
J , 58 байт
Попробуйте онлайн!
Спасибо ngn за помощь в улучшении «вычитания букв при соблюдении повторяющейся части».
Не очень подходит для J, но осветительное упражнение.
Давайте начнем с создания вспомогательного глагола
wo
(«без»), который удаляет все разделы в одной строке из другой, соблюдая при этом повторения.Здесь есть забавная идея: мы делаем каждый повторяющийся экземпляр персонажа уникальным, повторяя его необходимое количество раз. Таким образом, если наша оригинальная строка
ABBA
это становится:Третье
A
станетAAA
и так далее. Это достигается с помощью фразы((e. <@# [) {:)\
, которая берет каждый префикс\
, просматривает его последний элемент{:
и создает маску всех элементов в этом префиксе, которые соответствуютe.
этому конечному элементу, а затем фильтрует и блокирует только эти элементы<@#
.С нашими входами как «уникально-ified» мы теперь можем безопасно использовать нормальный набор минус,
-.
сохраняя при этом повторение.Затем мы открываем каждый результат и выбираем только первый элемент для «отмены» наших повторений:
{.@>
Включив этот вспомогательный глагол, наше общее решение (которое просто указывает на него) становится:
По сути, все, что мы здесь делаем, это настраиваем нашу проблему как единое сокращение. Мы начинаем реверсировать ввод
|.
и добавляем к нему,~
тузa:
или пустое поле, которое будет начальным значением нашего конечного результата, например так:Мы вставляем следующий глагол между каждым элементом, чтобы произвести сокращение:
Это говорит: взять правильный вход
]
(то есть, наш результат) и добавить к нему,
левый вход (этоONE
на первой итерации,TWO
на 2 - й и т.д.) безwo
в разе от;
правого входа (то есть, без каких - либо предыдущих писем до сих пор используется), но перед добавлением отсортируйте его/:~
и вставьте снова<@
.В конце всего этого у нас будет результат, который мы хотим, список ящиков, но все внутри одного большого дополнительного ящика, и все еще с пустым ящиком спереди. Таким образом , мы открываем для удаления внешней коробки и убить первый элемент:
}.@>
.источник
[:}.@>|.(],a.<@#~0>.-&(1#.a.=/;))&.>/@,<@a:
(],a.<@#~0>.-&(1#.a.=/;))/@|.
также работает, если я не пропущу крайний случай.JavaScript (ES6),
6665 байтПопробуйте онлайн!
комментарии
источник
C ++ (gcc) ,
177170 байт-5 байт благодаря подсказке @ anatolyg, -2 байта для мелких вещей, которые я заметил.
объяснение
#import<random>
добавляет оба<string>
и<vector>
для половины байтов.Сначала создается 91-элементный вектор из 0 (для хранения вхождений букв используются только индексы 65-90), а другой - вектор того же типа, но значение которого не установлено. Выполняет итерацию по каждому элементу ввода (дням): получает буквы, которыми владеют в настоящий момент, получает буквы, необходимые для дня, заменяет ввод в индексе необходимой суммой и обновляет имеющиеся буквы. Возвращает переопределенный ввод.
Попробуйте онлайн!
источник
#define v std::vector<std::string
и удалить,using namespace std
чтобы уменьшить количество байтов на 6 байтов.C # (интерактивный компилятор Visual C #) , 123 байта
Попробуйте онлайн!
Анонимная функция, которая выводит путем изменения входного массива.
источник
Р,
119 112 106103 байта-7 байт от наложения псевдонимов двух более длинных имен функций и теперь от пользователя
scan()
-6 байт для вызова только
strsplit()
один раз в начале-3 байта, чтобы снова избавиться от алиасинга и назначить две переменные в одном вызове
(Также отредактировал количество байтов, которое ранее было ошибочно низким)
Это моя самая первая подача PPCG любого вида! Поэтому я понятия не имею, что я делаю, как с точки зрения игры в гольф, так и с точки зрения публикации этикета. Вывод представляет собой список векторов, которые могут соответствовать или не соответствовать условиям задачи. :-П
Что касается самого кода, он принимает пользовательский ввод через
scan()
и сравнивает буквы каждого нового дня с совокупно принадлежащими буквами, как и в других решениях. Если есть более короткие альтернативыunlist
иstrsplit
для преобразования строк в векторы отдельных символов, это было бы здорово узнать. Я также использовалvsetdiff
функцию в пакете Carl Withoft,vecsets
чтобы получить заданную разницу букв, необходимых на следующий день, и текущих принадлежащих букв.источник
Python 2 ,
102100 байтПопробуйте онлайн!
-2 байта, благодаря Embodiment of Ignorance
источник
PowerShell , 71 байт
Попробуйте онлайн!
Принимает входные слова
$args
и перебирает их. Каждую итерацию мы устанавливаем текущее слово$w
, а затем перебираем наши$p
уши уже купленных букв. В каждом внутреннем цикле мы выполняем регулярное выражение-replace
для нашего текущего$w
ord, поэтому мы заменяем только первый экземпляр письма из нашего$p
ool. После того, как мы проверили все буквы в пуле, мы выводим то, что осталось$w
(то есть, что нам нужно купить), а затем прикрепляем эти буквы в наш пул$p+=$w
для следующего слова.источник
Japt ,
1514 байтовПопытайся
источник
Красный , 75 байт
Попробуйте онлайн!
источник
Excel VBA, 127 байт
Принимает вклад в виде диапазона Excel.
источник
C (gcc) , 118 байт
Попробуйте онлайн!
В качестве небольшого бонуса он принимает запас в
r
начале как массив. Выводит входной список строкa
с нулевым символом в конце со всеми прежними буквами, замененными пробелами.источник
05AB1E , 11 байт
-6 спасибо Кевину Круйссену
Попробуйте онлайн!
источник
J
на»
. Также вы можете сохранить 4 байта, заменив ихvyð.;}ðK
наSõ.;
11 байтов .Swift 4.2 / Xcode 10.2 ,
244242239238 байтПопробуйте онлайн!
Буквы расположены не в алфавитном порядке, это не запрещено правилами.
источник
Скала, 68 байт
Попробуйте онлайн!
/: сокращение от оператора foldLeft, a агрегация, в конечном итоге возвращает желаемый результат, n следующий элемент
Un-golfed
источник
PHP , 87 байт
Попробуйте онлайн!
источник
Древесный уголь , 18 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
источник
Поддержка PHP, UTF-8 (253 байта)
источник
C # (интерактивный компилятор Visual C #) , 112 байт
Попробуйте онлайн!
источник
Perl 5
-p
, 28 байтПопробуйте онлайн!
источник
Рубин , 52 байта
Попробуйте онлайн!
источник
Stax , 7 байт
Запустите и отладьте его
Выход разделен новой строкой.
источник
К (нгн / к) , 36 байт
Попробуйте онлайн!
источник