d2jsp
Log InRegister
d2jsp Forums > Off-Topic > International > Deutsch > Eulerproject
Prev123456Next
Add Reply New Topic New Poll
Member
Posts: 36,383
Joined: Dec 3 2010
Gold: 79,234.42
Warn: 10%
Mar 15 2017 03:47am
hab jetzt n (schlechten) algorithmus auf meinen server hochgeladen und gestartet.
in vllt 2-3 wochen kann ich dann das ergebnis fuer problem 260 abrufen^^
Member
Posts: 9,498
Joined: Nov 28 2005
Gold: 275.00
Mar 15 2017 04:16am
Quote (fernsehen123 @ 15 Mar 2017 10:47)
hab jetzt n (schlechten) algorithmus auf meinen server hochgeladen und gestartet.
in vllt 2-3 wochen kann ich dann das ergebnis fuer problem 260 abrufen^^


puh, das klingt nach bruteforce xD aber selbst bruteforce solltest du mit den ~10^9 konfigurationen wesentlich schneller fertig sein xD bzw sind ja nichtmal 10^9 weil die tripel geordnet sind.
Member
Posts: 36,383
Joined: Dec 3 2010
Gold: 79,234.42
Warn: 10%
Mar 15 2017 04:56am
Quote (milkYw4i @ 15 Mar 2017 11:16)
puh, das klingt nach bruteforce xD aber selbst bruteforce solltest du mit den ~10^9 konfigurationen wesentlich schneller fertig sein xD bzw sind ja nichtmal 10^9 weil die tripel geordnet sind.


wir hatten anfangs nur die geordneten berechnet. damit kam aber was falsches raus, weil unser algorithmus die berechnungen von davor nutzt um fuer neue punkte ((x,y,z)-tripel) zu berechnen, ob es eine losing configuration ist.

ja, es ist ein brute force algorithmus, der wiederum noch zum berechnen von jedem einzelnen punkt eine riesige schleife durchlaufen muss!
wir sind seit tagen dabei, das zu verbessern - mit maessigem erfolg... deshalb jetzt einfach mal den bloeden algorithmus aufn server gepackt. spaetestens in 2 wochen oder so ist der spuk dann vorbei :D
Member
Posts: 11,288
Joined: Jan 20 2007
Gold: 20.69
Mar 15 2017 08:33am
Boah du Asi, hast mich angefixt xD
Ich kann nicht glauben, dass ich jetzt 2h meiner Arbeitszeit wasted habe.
Dachte anfangs ofc es wären nur 10min Arbeit aber ich bin einfach nicht auf die "kluge Lösung" gekommen.
Denke es ist nicht ohne Grund nach der Summe gefragt. Wahrscheinlich kann man die berechnen ohne die konkreten losing configurations betrachten und addieren zu müssen.
Aber komme nciht drauf und auch kein Bock mehr

Die Lösung hier Ist nicht elegant, braucht 10GB RAM (nur dank lol pyhton, 1000^3 bools ist jetzt echt nicht die Welt)
... aber läuft in in weniger als 2 Wochen, Kappa

Code
def add_ordered(tab, x, y, z):
s = sorted([x, y, z])
tab[s[0]][s[1]][s[2]] = True


def main(n):
# Most configs should be winning -> use a dense representation as lists.
win_confs = [[[False for x in range(n + 2)] for y in range(n + 2)] for z in range(n + 2)]
sum = 0
for i in range(0, n + 1):
for j in range(i, n + 1):
for k in range(j, n + 1):
# Act as if 0, 0, 0 is a losing conf. no harm.
if not win_confs[i][j][k]:
sum += i + j + k
print('losing conf: ' + str((i, j, k)))
# This means that any other combination, where an enemy
# move leads to (i, j, k), is a winning conf.
for add in range(1, n + 1):
ia = i + add
ja = j + add
ka = k + add
if ia <= n + 1:
add_ordered(win_confs, ia, j, k)
if ja <= n + 1:
add_ordered(win_confs, i, ja, k)
if ka <= n + 1:
add_ordered(win_confs, i, j, ka)
if ia <= n + 1 and ja <= n + 1:
add_ordered(win_confs, ia, ja, k)
if ia <= n + 1 and ka <= n + 1:
add_ordered(win_confs, ia, j, ka)
if ja <= n + 1 and ka <= n + 1:
add_ordered(win_confs, i, ja, ka)
if ia <= n + 1 and ja <= n + 1 and ka <= n + 1:
add_ordered(win_confs, ia, ja, ka)
print(sum)


if __name__ == '__main__':
main(1000)


Quote
Correct

Congratulations, the answer you gave to problem 260 is correct.

You are the 958th person to have solved this problem.


Fühle mich schmutzig weil es nciht die elegante Lösung war

This post was edited by Kasiir on Mar 15 2017 08:38am
Member
Posts: 11,288
Joined: Jan 20 2007
Gold: 20.69
Mar 15 2017 08:43am
alternative sparse version. braucht wohl doch etwas wenigr ram:

Code
def add_ordered(tab, x, y, z):
s = sorted([x, y, z])
tab[s[0]][s[1]].add(s[2])


def main(n):
# Try a sparse setup instead
win_confs = {}
for i in range(0, n + 2):
win_confs[i] = {}
for j in range(0, n + 2):
win_confs[i][j] = set()
sum = 0
for i in range(0, n + 1):
for j in range(i, n + 1):
for k in range(j, n + 1):
# Act as if 0, 0, 0 is a losing conf. no harm.
if k not in win_confs[i][j]:
sum += i + j + k
print('losing conf: ' + str((i, j, k)))
# This means that any other combination, where an enemy
# move leads to (i, j, k), is a winning conf.
for add in range(1, n + 1):
ia = i + add
ja = j + add
ka = k + add
if ia <= n + 1:
add_ordered(win_confs, ia, j, k)
if ja <= n + 1:
add_ordered(win_confs, i, ja, k)
if ka <= n + 1:
add_ordered(win_confs, i, j, ka)
if ia <= n + 1 and ja <= n + 1:
add_ordered(win_confs, ia, ja, k)
if ia <= n + 1 and ka <= n + 1:
add_ordered(win_confs, ia, j, ka)
if ja <= n + 1 and ka <= n + 1:
add_ordered(win_confs, i, ja, ka)
if ia <= n + 1 and ja <= n + 1 and ka <= n + 1:
add_ordered(win_confs, ia, ja, ka)
print(sum)


if __name__ == '__main__':
main(1000)


Darf hier nicht mehr reinschauen. ISO PM wenn jemand die elegante Lösung findet oder wenn es wiklich interessante neue Probleme gibt

This post was edited by Kasiir on Mar 15 2017 08:44am
Member
Posts: 36,383
Joined: Dec 3 2010
Gold: 79,234.42
Warn: 10%
Mar 15 2017 09:54am
Quote (Kasiir @ 15 Mar 2017 15:33)
Boah du Asi, hast mich angefixt xD
Ich kann nicht glauben, dass ich jetzt 2h meiner Arbeitszeit wasted habe.
Dachte anfangs ofc es wären nur 10min Arbeit aber ich bin einfach nicht auf die "kluge Lösung" gekommen.


shit, ich will eig nicht gespoilert werden xD
werd mir die posts wohl erst angucken, wenn ich meine loesung abgegeben habe...

bist du denn schon fertig? ist die loesung angenommen werden?
und sorry :D :rolleyes:

aber es macht spass.... oder nicht?!
Member
Posts: 11,288
Joined: Jan 20 2007
Gold: 20.69
Mar 15 2017 09:55am
jo, aber geht sicher eleganter
Quote
Correct

Congratulations, the answer you gave to problem 260 is correct.

You are the 958th person to have solved this problem.


Quote (Kasiir @ 15 Mar 2017 15:33)

Fühle mich schmutzig weil es nicht die elegante Lösung war


Member
Posts: 36,383
Joined: Dec 3 2010
Gold: 79,234.42
Warn: 10%
Mar 15 2017 11:04am
Quote (Kasiir @ 15 Mar 2017 16:55)
jo, aber geht sicher eleganter


puh... trotzdem hut ab dafuer!
ich sitz ja seit mehreren tagen dran...

hab grad wieder n neuen algorithmus geschrieben. willst du den sehen?
koenntest ggf. n tipp geben, aber halt nicht komplett loesen fuer mich :D
Member
Posts: 11,288
Joined: Jan 20 2007
Gold: 20.69
Mar 15 2017 06:27pm
Quote (fernsehen123 @ 15 Mar 2017 18:04)
puh... trotzdem hut ab dafuer!
ich sitz ja seit mehreren tagen dran...

hab grad wieder n neuen algorithmus geschrieben. willst du den sehen?
koenntest ggf. n tipp geben, aber halt nicht komplett loesen fuer mich :D



jo, sicher. aber besser als algorithmus/code/usw wäre vielleicht:
was ist deine aktuelle idee / strategie?
Member
Posts: 36,383
Joined: Dec 3 2010
Gold: 79,234.42
Warn: 10%
Mar 16 2017 01:50am
Quote (Kasiir @ 16 Mar 2017 01:27)
jo, sicher. aber besser als algorithmus/code/usw wäre vielleicht:
was ist deine aktuelle idee / strategie?


ich gucke mir konfigurationen (x,y,z) an und gucke, ob ich mit einem "schritt" (also einmaligem wegnehmen von steinen) bei einer loser config landen kann. wenn nein, so ist (x,y,z) selbst ein neuer loser.

das dauert ziemlich lang und daher hab ich...

1. ...angefangen, nur nur im bereich 0 <= z <= y <= x <= 1000 zu suchen.
ich fuege danach aber alle permutationen des losers in mein loser-set hinzu.

2. ich gucke mir im x,y,z-loop gewisse sachen gar nicht mehr an, wenn ich weiss, dass sie durch einen geraden zug von einem loser erreichbar sind.
wenn (2,1,0) ein loser ist, so gucke ich alle (2+x,1,0) configs gar nicht mehr an

letzteres habe ich nicht wirklich fuer die anderen zuege programmiert bekommen. die "schritte" sind also noch dafuer zustaendig, herauszufinden, ob bspw. (x - k, y - k, z) ein loser ist. in dem fall waere (x,y,z) kein neuer loser...
Go Back To Deutsch Topic List
Prev123456Next
Add Reply New Topic New Poll