Cada día, coloca una nueva palabra en un letrero con letras móviles , comprando solo las letras que necesita para escribirla. Reutiliza las letras que ha comprado para palabras anteriores siempre que sea posible. Dadas las palabras que desea escribir cada día en orden, envíe las letras que compra cada día.
Ejemplo
Input: ['ONE', 'TWO', 'THREE', 'SEVENTEEN']
Output: ['ENO', 'TW', 'EHR', 'EENSV']
Día 1: Se empieza con ninguna letra, por lo que a escribir ONE
, usted compra todas sus letras E
, N
, O
.
Día 2: Al día siguiente, desea aguantar TWO
(quitar el ONE
). Ya tienes una O
de ONE
, por lo que compras una adicional TW
.
Día 3: En este punto, tienes ENOWT
. Para escribir
THREE
, necesitas EHR
. Tenga en cuenta que necesita comprar un segundo E
además del que tiene.
Día 4: Para escribir SEVENTEEN
, necesita E
el total de 4
, del cual ya tiene dos (¡no tres!), Por lo que compra dos más. También tiene la T
y uno de los N
's, por lo que comprar las letras restantes:
EENSV
.
Hemos enviado letras ordenadas alfabéticamente en este ejemplo, pero puede enviarlas en cualquier orden.
Entrada: una lista no vacía de cadenas de letras no vacías A-Z
. Puede usar minúsculas si lo prefiere. Las listas de caracteres están bien para las cadenas.
Salida: Imprima o imprima las letras adicionales que necesita comprar cada día. Las letras de un día pueden aparecer en cualquier orden, pero los días deben venir en el orden correcto.
Las letras de cada día deben separarse de otros días para que pueda saber dónde termina un día. Un separador final y / o inicial está bien, tanto dentro de un día como entre días. Tenga en cuenta que un día puede no tener letras compradas, lo que debería reflejarse en la salida (un espacio o una línea vacía está bien, incluso para el último día).
Casos de prueba
['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', '', '']
Aquí están todas las entradas y salidas 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', '', '']]
Y como cadenas separadas por espacios (los espacios finales en las salidas importan):
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
Tablas de clasificación
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 la última salida? ¿AKA sin usar delimitadores?Respuestas:
Haskell,
5449 bytesPruébalo en línea!
Construimos la lista de salida calculando por pares la diferencia de lista (
\\
) de la lista de entrada y el agregado acumulativo de la lista de salida (empezando por""
).Con ambos
Data.List
yData.Function
dentro del alcance (por ejemplo, mediante el uso del entorno lambdabot), esto se puede acortar a 30 bytes:Editar: -5 bytes gracias a @Sriotchilism O'Zaic.
fuente
Python 2 ,
7268 bytes-4 bytes gracias a Jonathan Allan.
Pruébalo en línea!
Comentado
fuente
for r in input():
ahorra 4 bytes.Jalea , 7 bytes
Pruébalo en línea!
Salida:
-cadena separada.
fuente
Perl 6 , 44 bytes
Pruébalo en línea!
Salidas como una lista de listas de caracteres.
Explicación
fuente
Bag(E(2), N, S, V)
necesitaría mostrar dos E para estar bien.collections.Counter
que no tenía la intención de permitir como salida. ¿Se puede iterar fácilmente sobre bolsas con multiplicidad, emitir en una lista / matriz, mostrar con multiplicidad, etc.?Haskell , 44 bytes
Pruébalo en línea!
La salida es una cadena como
ONE,TW,HRE,SVEEN
con comas entre días.fuente
\`. And an unexpected
caso base de foldl1` también.JavaScript (Node.js) , 59 bytes
Pruébalo en línea!
Solución bastante sencilla. Para cada palabra
h
, elimine las letras que ya tenemos.Aquí hay una versión explicada de ese código:
fuente
J , 29 bytes
-29 bytes gracias a FrownyFrog!
Pruébalo en línea!
Publicación original
J , 58 bytes
Pruébalo en línea!
Gracias a ngn por ayudarme a mejorar las "restar letras respetando la parte de repetición".
No es un gran ajuste para J, sino un ejercicio esclarecedor.
Comencemos construyendo un verbo auxiliar
wo
("sin") que elimine todos los capítulos de una cadena de otra, respetando las repeticiones.Aquí hay una idea divertida: hacemos que cada instancia repetida de un personaje sea única, repitiéndola la cantidad requerida de veces. Por lo tanto, si nuestra cadena original
ABBA
se convierte en:Un tercero
A
se convertiríaAAA
y así sucesivamente. Esto se logra mediante la frase((e. <@# [) {:)\
, que toma cada prefijo\
, mira el elemento final{:
del mismo y construye una máscara de todos los elementos en ese prefijo que coinciden cone.
ese elemento final, y luego filtra y encajona solo esos elementos<@#
.Con nuestras entradas "únicas", ahora podemos usar de manera segura el conjunto normal menos
-.
respetando la repetición.Luego abrimos cada resultado y tomamos solo el primer elemento para "deshacer" nuestras repeticiones:
{.@>
Al conectar este verbo auxiliar, nuestra solución general (que simplemente lo alinea) se convierte en:
Esencialmente, todo lo que hacemos aquí es configurar nuestro problema como una reducción única. Comenzamos invirtiendo la entrada
|.
y añadiéndole,~
un asa:
, o un cuadro vacío, que será el valor inicial de nuestro resultado final, así:Pegamos el siguiente verbo entre cada elemento para efectuar la reducción:
Esto dice: tome la entrada correcta
]
(es decir, nuestro resultado) y agregue,
la entrada izquierda (esto esONE
en la primera iteración,TWO
en la segunda, etc.) sinwo
el rastro de;
la entrada derecha (es decir, sin ninguna letra anterior hasta ahora usado), pero antes de agregarlo, ordénelo/:~
y recuérdelo nuevamente<@
.Al final de todo esto, tendremos el resultado que queremos, una lista de cuadros, pero todos dentro de un cuadro adicional grande, y aún con el cuadro vacío en la parte delantera. De este modo abrimos para quitar la caja exterior y matar al primer elemento:
}.@>
.fuente
[:}.@>|.(],a.<@#~0>.-&(1#.a.=/;))&.>/@,<@a:
(],a.<@#~0>.-&(1#.a.=/;))/@|.
también funciona a menos que me falte un caso de borde.JavaScript (ES6),
6665 bytesPruébalo en línea!
Comentado
fuente
C ++ (gcc) ,
177170 bytes-5 bytes gracias a la sugerencia de @ anatolyg, -2 bytes a pequeñas cosas que noté.
Explicación
#import<random>
agrega ambos<string>
y<vector>
para la mitad de los bytes.Primero crea un vector de 91 elementos de 0s (solo los índices 65-90 se usan para almacenar las ocurrencias de letras), y otro vector del mismo tipo pero no establecido en un valor. Itera a través de cada elemento de la entrada (los días): obtiene las letras de propiedad actual, obtiene las letras que se necesitan para el día, anula la entrada en el índice con la cantidad necesaria y actualiza las letras de propiedad. Devuelve la entrada anulada.
Pruébalo en línea!
fuente
#define v std::vector<std::string
y eliminarusing namespace std
para reducir el recuento de bytes en 6 bytes.C # (compilador interactivo de Visual C #) , 123 bytes
Pruébalo en línea!
Función anónima que se genera modificando una matriz de entrada.
fuente
R,
119 112 106103 bytes-7 bytes aliasing los dos nombres de funciones más largos y ahora tomando la entrada del usuario de
scan()
-6 bytes para llamar solo
strsplit()
una vez al principio-3 bytes para deshacerse del aliasing nuevamente y asignar dos variables en una llamada
(También edité el recuento de bytes que era erróneamente bajo anteriormente)
¡Esta es mi primera presentación de PPCG de cualquier tipo! Por lo tanto, no tengo idea de lo que estoy haciendo tanto en términos de golf como en términos de publicación de etiqueta. El resultado es una lista de vectores que pueden cumplir o no los términos del desafío. :-PAGS
En cuanto al código en sí, toma la entrada del usuario a través de
scan()
y compara las letras de cada nuevo día con las letras de propiedad acumulativa, como en otras soluciones. Si hay alternativas más cortas paraunlist
ystrsplit
para convertir cadenas en vectores de caracteres individuales, sería genial saberlo. También usé lavsetdiff
función en elvecsets
paquete de Carl Withoft para obtener la diferencia establecida de las letras necesarias para el día siguiente y las letras actuales.fuente
Python 2 ,
102100bytesPruébalo en línea!
-2 bytes, gracias a Encarnación de la ignorancia
fuente
PowerShell , 71 bytes
Pruébalo en línea!
Toma palabras de entrada
$args
e itera sobre ellas. En cada iteración establecemos la palabra actual$w
, luego$p
recorremos nuestro montón de letras ya compradas. En cada bucle interno, realizamos una expresión regular-replace
en nuestro$w
ord actual , de modo que estamos reemplazando solo la primera instancia de la letra de nuestro$p
ool. Una vez que hemos revisado todas las letras en el grupo, mostramos lo que queda$w
(es decir, lo que necesitamos comprar) y luego pegamos esas letras en nuestro grupo$p+=$w
para la siguiente palabra.fuente
Japt ,
1514 bytesIntentalo
fuente
Rojo , 75 bytes
Pruébalo en línea!
fuente
Excel VBA, 127 bytes
Toma entrada en forma de un rango de Excel.
fuente
C (gcc) , 118 bytes
Pruébalo en línea!
Como un pequeño bono, toma el stock
r
al principio como una matriz. Emite la lista de entrada terminada en nulo terminada en nuloa
con todas las letras usadas reemplazadas por espacios.fuente
05AB1E , 11 bytes
-6 gracias a Kevin Cruijssen
Pruébalo en línea!
fuente
J
con»
. Además, puede guardar 4 bytes reemplazandovyð.;}ðK
conSõ.;
11 bytes .Swift 4.2 / Xcode 10.2 ,
244242239238 bytesPruébalo en línea!
Las letras no están ordenadas en orden alfabético, no está prohibido por las reglas.
fuente
Scala, 68 bytes
Pruébalo en línea!
/: es una abreviatura para el operador foldLeft, a es una agregación, finalmente devuelve el resultado que queremos, n es el siguiente elemento
Sin golf
fuente
PHP , 87 bytes
Pruébalo en línea!
fuente
Carbón , 18 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
fuente
PHP, compatible con UTF-8 (253 bytes)
fuente
C # (compilador interactivo de Visual C #) , 112 bytes
Pruébalo en línea!
fuente
Perl 5
-p
, 28 bytesPruébalo en línea!
fuente
Ruby , 52 bytes
Pruébalo en línea!
fuente
Stax , 7 bytes
Ejecutar y depurarlo
La salida está separada por una nueva línea.
fuente
K (ngn / k) , 36 bytes
Pruébalo en línea!
fuente