[PYTHON] Ich zählte Tschüss Mann

Ich habe versucht Lass uns bye-byeman zählen. Es war mein erstes Mal, dass ich Code Golf gespielt habe, aber ich bin mit 51B (eijit) in Python an die Spitze gegangen. Es hat Spaß gemacht, durch Versuch und Irrtum zu verirren, also werde ich ein Protokoll führen.

Naiver Algorithmus

Analysieren Sie das Problem 1

Wenn Sie sich nur schwer vorstellen können, wie Sie den Bye-byeman erhöhen können, lesen Sie auch So erhöhen Sie den Bye-byeman.

Die folgende Tabelle zeigt die Anzahl und Gesamtzahl der Bye-Byemen jeder Größe für jede Generation.

Generation c(1, n) c(2, n) c(4, n) c(8, n) c(6, n) s(n)
0 1 0 0 0 0 1
1 0 1 0 0 0 1
2 0 0 1 0 0 1
3 0 0 0 1 0 1
4 1 0 0 0 1 2
5 1 2 0 0 0 3
6 0 1 2 0 0 3
7 0 0 1 2 0 3
8 2 0 0 1 2 5
9 3 4 0 0 1 8

Hier

Repräsentiert. Dann wirst du sofort verstehen

Und die Summe der Bewegung von der einen kleineren Population der vorherigen Generation (s = 6 wird als zu s = 1 verschoben angesehen) und dem "Übertrag" aus der Aufteilung der Größen 8 und 6 der vorherigen Generation Ich kann die Beziehung sehen.

[85B] Erster Code

Zuerst schrieb ich einen Code von weniger als 400B und reichte ihn ein, ohne zu bemerken, dass es Code Golf war, aber später bemerkte ich es und versuchte ihn zu verkürzen.

c=[1]+[0]*4
for i in range(100):
 print sum(c)
 c=c[4:]+c[:4]
 c[1]+=c[0]
 c[0]+=c[4]

Das war 85B. Ich habe ein Array verwendet, um die Elemente zu speichern. Ich habe es mir ausgedacht

war. Als ich mir die Ergebnisse ansah, war ich schockiert, dass ich meine Zähne nicht ausstehen konnte und begann, Code Golf zu studieren.

[71B] Erster Liner

Ich habe die Artikel im Internet durchgesehen und Folgendes gelernt.

c=[1]+[0]*4;exec"print sum(c);c=c[4:]+c[:4];c[1]+=c[0];c[0]+=c[4];"*100

Dies hat 14B geschrumpft. Aber es ist immer noch nicht genug.

[67B] Stoppen Sie das Array

Ich habe festgestellt, dass die Kosten für den Zugriff auf die Elemente des Arrays hoch sind, und habe sie daher durch fünf Variablen wie a, b, c, d und e ersetzt.

a=1;b=c=d=e=0;exec"print a+b+c+d+e;f=a+d;a=d+e;c=b;d=c;e=d;b=f"*100

Dies schrumpfte 4B weiter. Es ist jedoch nutzlos, die temporäre Variable f zu verwenden.

[64B] Tauschen ohne temporäre Variablen

Als ich Code Golf studierte, erinnerte ich mich an das Thema Tauschen ohne temporäre Variablen.

a=1
b=2
a,b=b,a

Die Syntax ist wie. Wenden Sie dies an

a=1;b=c=d=e=0;exec"print a+b+c+d+e;a,b,c,d,e=d+e,a+e,b,c,d;"*100

Es schrumpfte 3B weiter. Ich habe es geschafft, in den Bereich der Abzeichenerfassung zu gelangen, aber die Spitze ist immer noch ein verzweifelter Unterschied zu 50B.

[62B] Fassen Sie allgemeine Berechnungen zusammen

Schauen Sie sich den Code hier an

print a+b+c+d+e
a=d+e
b=a+e

Mir ist aufgefallen, dass die Berechnung doppelt vorhanden ist. Ich fragte mich, ob dies verwendet werden könnte

a=1;b=c=d=e=0;exec"a,b,c,d,e=d+e,a+e,b,c,d;print b+c+d+e;"*100

Und um 2B weiter geschrumpft. Hier

Ich mache das

Optimaler (nicht) Algorithmus

Bis zu diesem Punkt dachte ich, dass diese Richtlinie den Code nicht mehr schneiden könnte, also ging ich zurück zu den Grundlagen und sah mir konkrete Beispiele an, um zu sehen, ob es eine andere Regel gibt.

Analysieren Sie das Problem 2

Dann

s(n) = s(n-1) + c(1, n)

Es schien eine Regel zu geben. In Anbetracht des Grundes war dies eine Selbstverständlichkeit. Die Bye-byeman-Populationen nehmen zu, wenn die Größen 8 und 6 in der nächsten Generation zu den Größen 16 und 12 werden und in die Größen 1, 6 und 1, 2 aufgeteilt werden. Die Personen, die zu diesem Zeitpunkt zugenommen haben, können als Personen der Größe 1 angesehen werden.

[63B] Strategischer Rückzug

Als ich es basierend auf dem Ergebnis dieser Analyse implementierte, erhöhte es sich leider um 1B aufgrund der Variablen zum Halten der Summe.

a=1;b=c=d=e=s=0;exec"s+=a;print s;a,b,c,d,e=d+e,a+e,b,c,d;"*100

Ich habe bestätigt, dass die Ergebnisse korrekt sind, daher werde ich diese Richtlinie etwas weiter verfolgen.

Angrenzende Sechs-Term-Graduierungsgleichung

Ich war mir sehr bewusst, dass es notwendig war, die verwendeten Variablen zu reduzieren, und fragte mich, ob es möglich sein würde, die Anzahl der Personen der Größe 1 bequem zu berechnen.

(Ersetzen Sie die bisher verwendeten Symbole c (1, n) usw. durch $ c_ {1, n} $)

  1. c_{1, n} = c_{6, n-1} + c_{8, n-1}
  2. c_{2, n} = c_{1, n-1} + c_{6, n-1}
  3. c_{4, n} = c_{2, n-1}
  4. c_{8, n} = c_{4, n-1}
  5. c_{6, n} = c_{8, n-1}

Denken Sie daran, dass wir davon ausgehen, dass $ c_ {1, n} = c_ {6, n-1} + c_ {8, n-1} $ in 1. nur durch den Term der Größe 1 dargestellt wird.

\begin{eqnarray*}
c_{1, n} &= c_{6, n-1} + c_{8, n-1}\\
&=c_{8, n-2} + c_{4, n-2}\\
&=c_{4, n-3} + c_{2, n-3}\\
&=c_{2, n-4} + c_{1, n-4} + c_{6, n-4}\\
&=c_{1, n-5} + c_{6, n-5} + c_{1, n-4} + c_{8, n-5}\\
&=c_{1, n-5} + c_{1, n-4} + c_{6, n-5} + c_{8, n-5}\\
&=c_{1, n-5} + c_{1, n-4} + c_{1, n-4}\\
&=c_{1, n-5} + 2c_{1, n-4}\\
\end{eqnarray*}

Wann

c_{1, n} = c_{1, n-5} + 2c_{1, n-4}

Ich fand, dass es ausgedrückt werden kann durch.

Lassen Sie uns dies nun lösen, da es sich um eine allmähliche Gleichung zwischen benachbarten sechs Termen handelt. Die charakteristische Gleichung lautet

x^5 - 2x - 1 = 0

Leider gibt es keine Lösungsformel für die Gleichung fünfter Ordnung. Aber wie Sie sehen können, ist $ x = -1 $ eine der Lösungen für diese Gleichung. Daher, wenn faktorisiert

x^5 - 2x - 1 = (x + 1)(x^4 - x^3 + x^2 - x -1)

Ich konnte es in Polynome erster und vierter Ordnung zerlegen. Die letztere Lösung des Polynoms vierter Ordnung = 0 enthält leider komplexe Zahlen und scheint keine einfachen rationalen Zahlen oder ganzen Zahlen zu sein. Vielleicht ist es unwahrscheinlich, dass das Lösen dieses allmählichen Ausdrucks dazu beiträgt, den Code zu verkürzen. Dieses Mal habe ich die Berechnung aufgegeben, weil ich die Mühe verloren habe, aber es kann interessant sein, die allmähliche Gleichung zu lösen und den allgemeinen Term zu finden.

[63B] Stagnation

Seit ich entgleist bin, habe ich eine Pause vom Reden gemacht, und die schrittweise Formel für die Anzahl der Elemente der Größe 1 lautet

c_{1, n} = c_{1, n-5} + 2c_{1, n-4}

Also habe ich das gehorsam umgesetzt

a=e=1;b=c=d=s=0;exec"s+=a;print s;a,b,c,d,e=b,c,d,e,a+2*b;"*100

Leider ist es das gleiche wie 63B.

[56B] Bewegen Sie sich schließlich vorwärts

Bei der Berechnung der Graduierungsformel ist mir aufgefallen, dass die Anzahl der Elemente anderer Größen auch durch dieselbe Graduierungsformel ausgedrückt werden kann.

c_{s, n} = c_{s, n-5} + 2c_{s, n-4}

Hält für alle $ s = 1, 2, 4, 8, 6 $. Nehmen Sie die Summe davon

\sum_{s} c_{s, n} = \sum_{s} c_{s, n-5} + \sum_{s} 2c_{s, n-4}

Denken Sie daran, dass die Summe die Gesamtzahl der Bye-Byemen ist

s_{n} = s_{n-5} + 2s_{n-4}

Ich konnte die Summe von bye-byeman direkt berechnen. Bei Implementierung zusammen mit der Tatsache, dass der erste Term für den allmählichen Ausdruck der Gesamtzahl von Bye-by-Man 1, 1, 1, 1, 2 ist.

a=b=c=d=1;e=2;exec"print a;a,b,c,d,e=b,c,d,e,a+2*b;"*100

Es ist endlich auf 56B geschrumpft.

[53B] Sequenz erneut

Wir brauchen noch eine Wendung, also werden wir das Array wieder verwenden. Da es höchstens 100 Generationen zu berechnen gibt, habe ich außerdem aufgehört, die Schicht zu drehen und so weiter. Dies ist nicht der Fall, wenn Sie so tun, als ob Sie es wären.

a=[1]*4+[2];exec"print a[-5];a+=[a[-5]+2*a[-4]];"*100

Sie haben jetzt 53B erreicht. das ist

1, 1, 1, 1, 2, 3, 3, 3, 5, 8, ...

In einem Array, das unbegrenzt wächst, indem die Gesamtzahl der nächsten Generation gemäß der Graduierungsformel addiert wird, wird die Position -5 vom Ende als Gesamtzahl der aktuellen Generation ausgegeben.

[51B] Letzte Idee

Der 53B-Code verwendet einen negativen Wert für den Index des Arrays und verliert nur ein '-'. Sie können die Reihenfolge dieses Arrays umkehren, die '-' drei kürzen und stattdessen + = durch = und + a ersetzen, was einer Reduzierung von 2B entspricht.

a=[2]+[1]*4;exec"print a[4];a=[a[4]+2*a[3]]+a;"*100

Dies war diesmal meine Antwort.

Schließlich

Ich frage mich, ob ich noch ein Byte schneiden kann

Ich habe darüber nachgedacht, aber keiner von ihnen hat funktioniert. Ich freue mich auf die veröffentlichten Python-Antworten und Antworten in anderen Sprachen.

Abschließend möchten wir uns bei Ozy für die Bereitstellung eines so interessanten Themas und bei CodeIQ für die Bereitstellung des Veranstaltungsortes bedanken.

Recommended Posts

Ich zählte Tschüss Mann
Ich habe die Körner gezählt