<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=1121_-_p2048</id>
	<title>1121 - p2048 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=1121_-_p2048"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1121_-_p2048&amp;action=history"/>
	<updated>2026-05-01T22:36:17Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=1121_-_p2048&amp;diff=9560&amp;oldid=prev</id>
		<title>Raul: Pagină nouă:  Ada și Ben sunt pasionați de jocurile pe calculator și tocmai au descoperit cea mai recentă versiune a jocului &#039;&#039;&#039;2048&#039;&#039;&#039;.  Regulile jocului sunt foarte simple:  * se pornește de la un șir de &lt;code&gt;N&lt;/code&gt; piese pe care sunt înscrise numere din mulțimea &lt;code&gt;{2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048}&lt;/code&gt;; * piesele sunt așezate în locații numerotate consecutiv cu numerele  &lt;code&gt;1,2,…, N&lt;/code&gt;; * la fiecare pas, poate avea loc o MUTARE la STÂNGA sau...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=1121_-_p2048&amp;diff=9560&amp;oldid=prev"/>
		<updated>2024-01-31T15:43:01Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă:  Ada și Ben sunt pasionați de jocurile pe calculator și tocmai au descoperit cea mai recentă versiune a jocului &amp;#039;&amp;#039;&amp;#039;2048&amp;#039;&amp;#039;&amp;#039;.  Regulile jocului sunt foarte simple:  * se pornește de la un șir de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; piese pe care sunt înscrise numere din mulțimea &amp;lt;code&amp;gt;{2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048}&amp;lt;/code&amp;gt;; * piesele sunt așezate în locații numerotate consecutiv cu numerele  &amp;lt;code&amp;gt;1,2,…, N&amp;lt;/code&amp;gt;; * la fiecare pas, poate avea loc o MUTARE la STÂNGA sau...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
Ada și Ben sunt pasionați de jocurile pe calculator și tocmai au descoperit cea mai recentă versiune a jocului &amp;#039;&amp;#039;&amp;#039;2048&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Regulile jocului sunt foarte simple:&lt;br /&gt;
&lt;br /&gt;
* se pornește de la un șir de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; piese pe care sunt înscrise numere din mulțimea &amp;lt;code&amp;gt;{2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048}&amp;lt;/code&amp;gt;;&lt;br /&gt;
* piesele sunt așezate în locații numerotate consecutiv cu numerele  &amp;lt;code&amp;gt;1,2,…, N&amp;lt;/code&amp;gt;;&lt;br /&gt;
* la fiecare pas, poate avea loc o MUTARE la STÂNGA sau o MUTARE la DREAPTA;&lt;br /&gt;
* pentru fiecare joc este stabilit un număr maxim de mutări &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;;&lt;br /&gt;
* dacă are loc o MUTARE la DREAPTA, atunci:&lt;br /&gt;
** piesele pot fuziona la dreapta, începând cu penultima piesă din şir: dacă o piesă se află pe o poziție &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și are înscrisă valoarea &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, iar pe poziția &amp;lt;code&amp;gt;i+1&amp;lt;/code&amp;gt; se află o piesă cu aceeași valoare &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, atunci aceste piese vor “fuziona”, pe poziția &amp;lt;code&amp;gt;i+1&amp;lt;/code&amp;gt; se va obține o piesă cu valoarea &amp;lt;code&amp;gt;2•k&amp;lt;/code&amp;gt;, iar pe poziția &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; rămâne o locație liberă;&lt;br /&gt;
** după efectuarea fuzionărilor, piesele se aliniază la dreapta, astfel încât ultima piesă să se afle pe poziția n;&lt;br /&gt;
* dacă are loc o MUTARE la STÂNGA, atunci:&lt;br /&gt;
** piesele pot fuziona la stânga, începând cu a doua piesă din șir: dacă o piesă se află pe o poziție &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; și are înscrisă valoarea &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;, iar pe poziția &amp;lt;code&amp;gt;i-1&amp;lt;/code&amp;gt; se află o piesă cu aceeași valoare &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; , atunci aceste piese vor “fuziona”, pe poziția &amp;lt;code&amp;gt;i-1&amp;lt;/code&amp;gt; se va obține o piesă cu valoarea &amp;lt;code&amp;gt;2•k&amp;lt;/code&amp;gt;, iar pe poziția &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; rămâne o locație liberă;&lt;br /&gt;
** după efectuarea fuzionărilor, piesele se aliniază la stânga, astfel încât prima piesă să se afle pe poziția &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;;&lt;br /&gt;
* jocul se încheie atunci când se ajunge în una dintre următoarele situații:&lt;br /&gt;
** pe cel puțin una dintre piese se află înscrisă valoarea &amp;lt;code&amp;gt;2048&amp;lt;/code&amp;gt;;&lt;br /&gt;
** valorile înscrise nu se mai pot modifica prin mutarea pieselor;&lt;br /&gt;
** s-au efectuat toate cele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; mutări.&lt;br /&gt;
&lt;br /&gt;
= Cerinţe =&lt;br /&gt;
Scrieţi un program care să citească numerele naturale &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; (numărul inițial de piese) și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; (numărul maxim de mutări),  un șir de &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere reprezentând, în ordine, numerele înscrise pe cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; piese și cel mult &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; caractere din mulțimea &amp;lt;code&amp;gt;{S, D}&amp;lt;/code&amp;gt; ce reprezintă mutările fixate de către Ada și Ben, și care determină: &lt;br /&gt;
&lt;br /&gt;
a) numărul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; de mutări efectuate până la încheierea jocului;  &lt;br /&gt;
&lt;br /&gt;
b) numărul maxim &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; înscris pe una dintre piese la încheierea jocului;  &lt;br /&gt;
&lt;br /&gt;
c) numărul maxim &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; de fuzionări efectuate la o mutare.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Fișierul de intrare &amp;lt;code&amp;gt;p2048.in&amp;lt;/code&amp;gt; conține pe prima linie, separate  prin câte un spaţiu, numerele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;. A doua linie a fişierului conţine cele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; numere înscrise, în ordine, pe piese, separate prin câte un spaţiu. A treia linie a fișierului conține cele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; caractere, separate prin câte un spaţiu, ce reprezintă cele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; direcții de mutare.&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Fișierul de ieșire &amp;lt;code&amp;gt;p2048.out&amp;lt;/code&amp;gt; va conține pe prima linie numărul &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;, pe a doua linie numărul &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; și pe a treia linie numărul &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;2 ≤ N,M ≤ 10000&amp;lt;/code&amp;gt;;&lt;br /&gt;
* caracterul &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; indică o mutare la dreapta, iar caracterul &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; indică o mutare la stânga; pentru rezolvarea cerinţei a) se acordă 40% din punctaj, pentru cerinţa b) 40% din punctaj și pentru cerinţa c) 20% din punctaj.&lt;br /&gt;
&lt;br /&gt;
= Exemplu: =&lt;br /&gt;
&amp;lt;code&amp;gt;p2048.in&amp;lt;/code&amp;gt;&lt;br /&gt;
 7 10 &lt;br /&gt;
 16 4 4 2 2 4 8&lt;br /&gt;
 D D S D S D S S D D&lt;br /&gt;
&amp;lt;code&amp;gt;p2048.out&amp;lt;/code&amp;gt;&lt;br /&gt;
 4&lt;br /&gt;
 32&lt;br /&gt;
 2&lt;br /&gt;
&lt;br /&gt;
= Explicație =&lt;br /&gt;
Succesiunea de mutări este reprezentată în figura de mai sus. Au fost efectuate &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; mutări până la încheierea jocului, cea mai mare valoare înscrisă pe una dintre piese fiind &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt;. Numărul maxim de fuzionări, două, a fost obținut la prima mutare.&lt;br /&gt;
&lt;br /&gt;
== Încărcare soluție ==&lt;br /&gt;
&lt;br /&gt;
=== Lipește codul aici ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python2&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
f = open(&amp;quot;p2048.in&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
g = open(&amp;quot;p2048.out&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
v = [0] * 10001&lt;br /&gt;
n, m, i, j, k, st, dr, p, X, Y, Z, z, s = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0&lt;br /&gt;
d = &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
n, m = map(int, f.readline().split())&lt;br /&gt;
values = list(map(int, f.readline().split()))&lt;br /&gt;
for i in range(n):&lt;br /&gt;
    v[i+1] = values[i]&lt;br /&gt;
    if v[i+1] == 2048:&lt;br /&gt;
        s = 1&lt;br /&gt;
&lt;br /&gt;
st = 1&lt;br /&gt;
dr = n&lt;br /&gt;
&lt;br /&gt;
for i in range(m):&lt;br /&gt;
    line = f.readline()&lt;br /&gt;
    d = line[0]&lt;br /&gt;
    z = 0&lt;br /&gt;
&lt;br /&gt;
    if d == &amp;#039;D&amp;#039;:&lt;br /&gt;
        for j in range(dr, st, -1):&lt;br /&gt;
            if v[j] == v[j-1]:&lt;br /&gt;
                v[j] *= 2&lt;br /&gt;
                if v[j] == 2048:&lt;br /&gt;
                    s = 1&lt;br /&gt;
                for k in range(j-1, st, -1):&lt;br /&gt;
                    v[k] = v[k-1]&lt;br /&gt;
                st += 1&lt;br /&gt;
                z += 1&lt;br /&gt;
    else:&lt;br /&gt;
        for j in range(st, dr):&lt;br /&gt;
            if v[j] == v[j+1]:&lt;br /&gt;
                v[j] *= 2&lt;br /&gt;
                if v[j] == 2048:&lt;br /&gt;
                    s = 1&lt;br /&gt;
                for k in range(j+1, dr):&lt;br /&gt;
                    v[k] = v[k+1]&lt;br /&gt;
                dr -= 1&lt;br /&gt;
                z += 1&lt;br /&gt;
&lt;br /&gt;
    X = i+1&lt;br /&gt;
    if z == 0:&lt;br /&gt;
        X = i&lt;br /&gt;
        i = m&lt;br /&gt;
    Z = max(Z, z)&lt;br /&gt;
    if s:&lt;br /&gt;
        i = m&lt;br /&gt;
&lt;br /&gt;
Y = v[st]&lt;br /&gt;
for i in range(st+1, dr+1):&lt;br /&gt;
    Y = max(Y, v[i])&lt;br /&gt;
&lt;br /&gt;
g.write(str(X) + &amp;#039;\n&amp;#039; + str(Y) + &amp;#039;\n&amp;#039; + str(Z) + &amp;#039;\n&amp;#039;)&lt;br /&gt;
f.close()&lt;br /&gt;
g.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
   main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Raul</name></author>
	</entry>
</feed>