Cada dia, você coloca uma nova palavra em uma placa de letreiro com letras móveis , comprando apenas as letras necessárias para escrevê-la. Você reutiliza as letras que comprou para palavras anteriores sempre que possível. Dadas as palavras que você deseja escrever todos os dias em ordem, imprima as letras que compra todos os dias.
Exemplo
Input: ['ONE', 'TWO', 'THREE', 'SEVENTEEN']
Output: ['ENO', 'TW', 'EHR', 'EENSV']
Dia 1: Você começa com nenhuma letra, de modo a escrever ONE
, você compra todas as suas cartas E
, N
, O
.
Dia 2: No dia seguinte, você deseja colocar TWO
(retirar o ONE
). Você já tem um O
de ONE
e compra um adicional TW
.
Dia 3: Neste ponto, você tem ENOWT
. Para escrever
THREE
, você precisa EHR
. Observe que você precisa comprar um segundo E
além do que você possui.
Dia 4: Para escrever SEVENTEEN
, você precisa E
do total de 4
, dos quais você já tem dois (e não três!), Para comprar mais dois. Você também tem a T
e um dos N
's, então você compra as letras restantes:
EENSV
.
Produzimos letras classificadas em ordem alfabética neste exemplo, mas você pode imprimi-las em qualquer ordem.
Entrada: Uma lista não vazia de cadeias de caracteres não vazias A-Z
. Você pode usar letras minúsculas, se preferir. Listas de caracteres são boas para seqüências de caracteres.
Saída: Imprima ou imprima as letras adicionais que você precisa comprar todos os dias. As letras de um dia podem ser impressas em qualquer ordem, mas os dias devem chegar na ordem correta.
As letras de cada dia devem ser separadas de outros dias para que você possa saber onde termina o dia. Um separador à direita e / ou à esquerda é bom, dentro de um dia ou entre dias. Observe que um dia pode não ter letras compradas, o que deve ser refletido na saída (um espaço ou linha vazia está OK, mesmo no último dia).
Casos de teste
['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', '', '']
Aqui estão todas as entradas e saídas como listas separadas:
[['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', '', '']]
E como seqüências de caracteres separadas por espaço (os espaços à direita nas saídas importam):
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
Classificação
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
válida para a última saída? AKA sem delimitadores?Respostas:
Haskell,
5449 bytesExperimente online!
Construímos a lista de saída calculando em pares a diferença da lista (
\\
) da lista de entrada e o apêndice cumulativo da lista de saída (começando com""
).Com ambos
Data.List
eData.Function
no escopo (por exemplo, usando o ambiente lambdabot), isso pode ser reduzido para 30 bytes:Edit: -5 bytes graças a @Sriotchilism O'Zaic.
fonte
Python 2 ,
7268 bytes-4 bytes graças a Jonathan Allan.
Experimente online!
Comentado
fonte
for r in input():
salva 4 bytes.Geléia , 7 bytes
Experimente online!
Saída:
sequência separada.
fonte
Perl 6 , 44 bytes
Experimente online!
Saída como uma lista de listas de caracteres.
Explicação
fonte
Bag(E(2), N, S, V)
precisaria mostrar realmente dois E's para ficar OK.collections.Counter
que eu não pretendia permitir como saída. Pode-se iterar facilmente os elfos de saco com multiplicidade, converter em uma lista / matriz, exibir com multiplicidade, etc?Haskell , 44 bytes
Experimente online!
Saída é uma cadeia de caracteres como
ONE,TW,HRE,SVEEN
vírgulas entre dias.fonte
\`. And an unexpected
case base foldl1`.JavaScript (Node.js) , 59 bytes
Experimente online!
Solução bastante simples. Para cada palavra
h
, remova as letras que já temos.Aqui está uma versão explicada desse código:
fonte
J , 29 bytes
-29 bytes graças ao FrownyFrog!
Experimente online!
Correio Original
J , 58 bytes
Experimente online!
Agradecemos a ngn por ajudar a melhorar as "subtrair letras respeitando a parte da repetição".
Não é um ótimo ajuste para J, mas um exercício esclarecedor.
Vamos começar construindo um verbo auxiliar
wo
("sem") que remove todos os chacters de uma string da outra, respeitando as repetições.Há uma idéia divertida aqui: Tornamos cada instância repetida de um personagem única, repetindo-a o número necessário de vezes. Assim, se nossa string original é
ABBA
:Um terço
A
se tornariaAAA
e assim por diante. Isso é realizado pela frase((e. <@# [) {:)\
, que pega cada prefixo\
, analisa o elemento final{:
e constrói uma máscara de todos os elementos desse prefixo que correspondeme.
ao elemento final e, em seguida, filtra e encaixa esses elementos<@#
.Com nossas entradas "únicas", agora podemos usar com segurança o conjunto normal menos
-.
, respeitando a repetição.Em seguida, abrimos cada resultado e usamos apenas o primeiro elemento para "desfazer" nossas repetições:
{.@>
Ao inserir esse verbo auxiliar, nossa solução geral (que simplesmente o destaca) se torna:
Basicamente, tudo o que fazemos aqui é configurar nosso problema como uma única redução. Começamos revertendo a entrada
|.
e acrescentando a ela,~
um ása:
ou caixa vazia, que será o valor inicial do nosso resultado final, assim:Colamos o verbo a seguir entre cada elemento para efetuar a redução:
Isto diz: pegue a entrada correta
]
(ou seja, nosso resultado) e acrescente a,
entrada esquerda (isto é,ONE
na primeira iteração,TWO
no 2º, etc.) semwo
o detalhamento da;
entrada correta (ou seja, sem letras anteriores até o momento) usado), mas antes de anexá-lo, classifique-o/:~
e encaixe-o novamente<@
.No final de tudo isso, obteremos o resultado que queremos, uma lista de caixas, mas todas dentro de uma grande caixa adicional e ainda com a caixa vazia na frente. Assim que abrimos para remover a caixa exterior e matar o primeiro elemento:
}.@>
.fonte
[:}.@>|.(],a.<@#~0>.-&(1#.a.=/;))&.>/@,<@a:
(],a.<@#~0>.-&(1#.a.=/;))/@|.
também funciona, a menos que esteja faltando um caso de ponta.JavaScript (ES6),
6665 bytesExperimente online!
Comentado
fonte
C ++ (gcc) ,
177170 bytes-5 bytes graças à dica de @ anatolyg, -2 bytes a pequenas coisas que notei.
Explicação
#import<random>
adiciona ambos<string>
e<vector>
pela metade dos bytes.Primeiro, cria um vetor de 0s com 91 elementos (apenas os índices 65-90 são usados para armazenar ocorrências de letras) e outro vetor do mesmo tipo, mas não definido como um valor. Repete cada elemento da entrada (os dias): obtém as letras de propriedade atualmente, obtém as letras necessárias para o dia, substitui a entrada no índice pela quantidade necessária e atualiza as letras de propriedade. Retorna a entrada substituída.
Experimente online!
fonte
#define v std::vector<std::string
e removerusing namespace std
para reduzir a contagem de bytes em 6 bytes.C # (compilador interativo do Visual C #) , 123 bytes
Experimente online!
Função anônima que gera modificando uma matriz de entrada.
fonte
R,
119 112 106103 bytes-7 bytes usando o alias dos dois nomes de função mais longos e agora recebendo entrada do usuário de
scan()
-6 bytes para chamar apenas
strsplit()
uma vez no início-3 bytes para se livrar do aliasing novamente e atribuir duas variáveis em uma chamada
(Também editou a contagem de bytes incorretamente baixa anteriormente)
Este é o meu primeiro envio de PPCG de qualquer tipo! Portanto, não faço ideia do que estou fazendo, tanto em termos de golfe quanto em termos de etiqueta. O resultado é uma lista de vetores que podem ou não atender aos termos do desafio. :-P
Quanto ao próprio código, ele recebe a entrada do usuário
scan()
e compara as cartas de cada novo dia com as cartas de propriedade cumulativa, como em outras soluções. Se houver alternativas mais curtas paraunlist
estrsplit
para converter cadeias de caracteres em vetores de caracteres individuais, seria interessante saber. Também usei avsetdiff
função novecsets
pacote de Carl Withoft para obter a diferença definida das letras necessárias para o dia seguinte e das cartas atuais.fonte
Python 2 ,
102100 bytesExperimente online!
-2 bytes, graças à incorporação da ignorância
fonte
Japonês ,
1514 bytesTente
fonte
Vermelho , 75 bytes
Experimente online!
fonte
PowerShell , 71 bytes
Experimente online!
Pega palavras de entrada
$args
e itera sobre elas. A cada iteração, definimos a palavra atual e$w
, em seguida, fazemos um loop sobre o conjunto$p
de letras já compradas. Cada loop interno, realizamos uma regex-replace
em nosso$w
ord atual , de modo que estamos substituindo apenas a primeira instância da letra do nosso$p
ool. Depois de ler todas as letras do pool, produzimos o que resta$w
(ou seja, o que precisamos comprar) e, em seguida, colocamos essas letras no pool$p+=$w
para a próxima palavra.fonte
Excel VBA, 127 bytes
Recebe entrada na forma de um intervalo do Excel.
fonte
C (gcc) , 118 bytes
Experimente online!
Como um pequeno bônus, ele recebe o estoque no
r
início como uma matriz. Produz a lista de seqüência de caracteres terminada em nulo terminada em nuloa
com todas as letras usadas substituídas por espaços.fonte
05AB1E , 11 bytes
-6 agradecimentos a Kevin Cruijssen
Experimente online!
fonte
J
por»
. Além disso, você pode salvar 4 bytes substituindovyð.;}ðK
porSõ.;
11 bytes .Swift 4.2 / Xcode 10.2 ,
244242239238 bytesExperimente online!
As letras não estão dispostas em ordem alfabética, não é proibido pelas regras.
fonte
Scala, 68 bytes
Experimente online!
/: é abreviação de operador foldLeft, a é agregação, retorna o resultado que queremos, n é o próximo elemento
Sem golfe
fonte
PHP , 87 bytes
Experimente online!
fonte
Carvão , 18 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
fonte
PHP, UTF-8 ciente (253 bytes)
fonte
C # (compilador interativo do Visual C #) , 112 bytes
Experimente online!
fonte
Perl 5
-p
, 28 bytesExperimente online!
fonte
Ruby , 52 bytes
Experimente online!
fonte
Stax , 7 bytes
Execute e depure
A saída é separada por nova linha.
fonte
K (ngn / k) , 36 bytes
Experimente online!
fonte