Universe Sandbox

General Category => Everything Else => Topic started by: vh on June 09, 2012, 02:04:23 PM

Title: Coding
Post by: vh on June 09, 2012, 02:04:23 PM
Post python code, python stuff, maybe even a python.

Title: Re: Python
Post by: vh on June 09, 2012, 02:05:30 PM
current work on a darvincian name generator, there's probably a way to optimize this way better, but i'm lazy
Title: Re: Python
Post by: Bla on June 09, 2012, 02:53:20 PM
My "building image generator" or whatever it's generating.
Title: Re: Python
Post by: FiahOwl on June 09, 2012, 03:27:44 PM
Looks like a warped staircase to hell.
Title: Re: Python
Post by: vh on June 09, 2012, 05:01:47 PM
Darvincian Name Generator

It's not perfect, but the best i can do :P, sometimes, too many of the same letter shows up but it usually works well.

Haven't figured out how to use a while loop on the seperate blocks of code so i just made 2 programs one with 1 name out put another with 10 and i'll do one with 100 if anyone wants
Title: Re: Python
Post by: atomic7732 on June 11, 2012, 04:59:53 AM
lolidunno

Code: [Select]
health = 100
matthealth = 100

def promptaction():
act = raw_input("Wat do?") #run, fight
act.strip("\n")
return act

def action(thing):
modify = "%s" % thing
uppercase = modify.upper()
print "USER used %s!" % uppercase
if uppercase == "TAIL WHIP":
matthealth = matthealth - 20
return "MATTY takes 20 damage."
elif uppercase == "PONY":
matthealth = matthealth - 50
return "MATTY takes 50 damage."
elif uppercase == "MUD SLAP":
matthealth = matthealth - 15
return "MATTY takes 15 damage."
elif uppercase == "CHAT":
matthealth = matthealth - 45
return "MATTY takes 45 damage."
else:
print "Not a valid move."

print "A wild MATTY appeared!"

action = promptaction()

if action == "fight":
move = raw_input("TAIL WHIP, PONY, MUD SLAP, CHAT: ")
move.strip("\n")
print action(move)
if matthealth < 1:
print "MATTY fainted!"
else:
action = promptaction()
elif action == "run":
print "You got away!"
else:
print "fsjfkdsjfkdsk"

Did it in like 30 mins and it really doesn't work as intended yet, maybe I'll mess with it later

It should work if you paste and save the code... I didn't test it though, so no guarantees.

I really wanted it to be more of a surprise but that would require me NOT SHARING SOMETHING or not going to sleep.
Title: Re: Python
Post by: vh on June 18, 2012, 02:13:28 PM
asdf

*takes about 15 seconds to run so be patient*
Title: Re: Python
Post by: vh on August 06, 2012, 02:46:52 AM
When i code, it's a contest between me pressing the prtsc sysrq button as fast as humanly can, and that evil little black box of error messages trying to hide from me :P
Title: Re: Python
Post by: atomic7732 on August 06, 2012, 11:04:56 AM
When i code, it's a contest between me pressing the prtsc sysrq button as fast as humanly can, and that evil little black box of error messages trying to hide from me :P
open cmd and type C:\<python directory> file.py
Title: Re: Python
Post by: vh on October 05, 2012, 07:34:35 PM
the following code lets you measure the time elapsed since you last ran the function that resets the time. it works even when closed out and restarted because the time data is stored in a save.txt in the same directory as the .py
In addition, it will not be messed up even if you change your computer system time, the time is pulled from the internet. (you need the internet for this to work at all)


import ntplib
import time
import sys
import os

def tme():
    global realtime
    global computertime
    global timeoff
    c = ntplib.NTPClient()
    response = c.request('europe.pool.ntp.org', version=3)
    timeoff = response.offset
    computertime = time.time()
    realtime = timeoff+computertime

def wryte():
    tme()
    file = open ('save.txt', 'r+')
    print file
    wrytestring = repr(realtime)
    file.write(wrytestring)
    file.close()
    os.system('cls')
    print 'Time Reset'

def interval():
    tme()
    file = open ('save.txt', 'r+')
    print file
    lasttime = float(file.readline())
    os.system('cls')
    print 'Time elapsed:',realtime-lasttime
    file.close()
    
def run():
    choice = int(input('1=reset, 2=elapsed time, 3=quit'))
    if choice == 1:
        wryte()
    if choice == 2:
        interval()
    if choice ==3:
        sys.exit()

x = 0
while (x == 0):
    run()
  
  
Title: Re: Python
Post by: atomic7732 on October 07, 2012, 10:33:45 PM
I'm using your code above to download and display tropical product updates.
Title: Re: Python
Post by: Darvince on October 07, 2012, 10:48:27 PM
on dargen100: too much x, nawt enuf w.
Title: Re: Python
Post by: atomic7732 on October 08, 2012, 12:29:59 AM
Code: [Select]
import ntplib #http://pypi.python.org/pypi/ntplib/
import time
import sys
import os
import urllib2
from datetime import datetime

def tme():
    global realtime
    global computertime
    global timeoff
    c = ntplib.NTPClient()
    response = c.request('europe.pool.ntp.org', version=3)
    timeoff = response.offset
    computertime = time.time()
    realtime = timeoff+computertime

def wryte():
    tme()
    file = open ('save.txt', 'r+')
    print file
    wrytestring = repr(realtime)
    file.write(wrytestring)
    file.close()
    os.system('cls')
    print 'Time Reset'
    print 'Time now:',realtime
    d2 = datetime.fromtimestamp( int(float(realtime) ) )
    print d2

def dfilewtpq():
file = urllib2.urlopen("http://weather.noaa.gov/pub/data/raw/wt/wtpq20.rjtd..txt")
output = open('wtpq20_1.txt','w+b')
output.write(file.read())
output.seek(0)
header = output.read(6)
output.seek(12)
newproducttime = output.read(6)
output.close()
output = open('wtpq20.txt','rb')
output.seek(12)
producttime = output.read(6)
output.close()
if newproducttime == producttime:
return "none"
elif newproducttime != producttime:
output = open('wtpq20.txt','w+b')
copy = open('wtpq20_1.txt','rb')
output.write(copy.read())
output.close()
copy.seek(56)
name = copy.readline()
name = name.strip('\n')
copy.seek(108)
location = copy.readline()
location = location.strip('\n')
copy.seek(132)
dir = copy.readline()
dir = dir.strip('\n')
copy.seek(145)
pres = copy.readline()
pres = pres.strip('\n')
copy.seek(158)
wind = copy.readline()
wind = wind.strip('\n')
update = "WTPQ20 %s %s %s %s %s" % (name, location, dir, pres, wind)
copy.close()
print "File updated."
return update

def checkfiles():
status = dfilewtpq()
tme()
d2 = datetime.fromtimestamp( int(float(realtime) ) )
if status != "none":
print "%s %s" % (d2,status)
else:
print d2,"checked"

def continual():
i = 0
while(i == 0):
checkfiles()
time.sleep(300)
    
def run():
    wryte()
    choice = int(input('1 - time, 2 - quit, 3 - download WTPQ, 4 - continual mode: '))
    if choice == 1:
        wryte()
    if choice == 2:
        sys.exit()
    if choice == 3:
        dfilewtpq()
    if choice == 4:
        os.system('cls')
        continual()

x = 0
while (x == 0):
    run()

I will add the ability for more products to be checked later.

Attatched: what a product looks like when caught
Title: Re: Python
Post by: Darvince on October 08, 2012, 12:31:09 AM
(http://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Ball_python_lucy.JPG/220px-Ball_python_lucy.JPG)
Title: Re: Python
Post by: Hellpotatoe on October 08, 2012, 04:15:13 AM
(http://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Ball_python_lucy.JPG/220px-Ball_python_lucy.JPG)
AAAAAAAAaaaaawwww Yeeeeaaaahhhh!!!11
Title: Re: Python
Post by: vh on October 08, 2012, 11:45:49 AM
you had to install ntplib to get it working right?
Title: Re: Python
Post by: atomic7732 on October 08, 2012, 12:28:53 PM
Yes.

darscript

(it was called comeon.py because it was my testing script for my cyclone thing and I was mad lol)
Title: Re: Python
Post by: atomic7732 on October 08, 2012, 05:49:26 PM
Version 1

It searches for west pacific, east pacific, and atlantic discussions and advisories.

Basically if there's a cyclone active, it prints relevant information from the advisory in the cmd, and it will display "...see text" for updated discussions.

(requires ntplib - http://pypi.python.org/pypi/ntplib/ (http://pypi.python.org/pypi/ntplib/) )
Title: Re: Python
Post by: Darvince on October 08, 2012, 06:09:24 PM
Yes.

darscript

(it was called comeon.py because it was my testing script for my cyclone thing and I was mad lol)
no it must post in ctam
Title: Re: Python
Post by: blotz on October 14, 2012, 11:23:26 AM
http://www.learnpython.org/page/Loops (http://www.learnpython.org/page/Loops)

must complete exercise!

but how
Title: Re: Python
Post by: atomic7732 on October 20, 2012, 12:09:44 AM
.gif me ideas for a random text game with forumers in it.
Title: Re: Python
Post by: Hellpotatoe on October 20, 2012, 03:09:19 AM
1º Great Rule: Bla
2º Great Rule: Communism
3º Great Rule: Fiah Hate's Hellpotatoe Nations
4º Great Rule: Cyclones
Title: Re: Python
Post by: vh on October 22, 2012, 01:08:28 PM
ok someone can pretty up the time bars if they want to :P

this python script lets you input a time, and then shows a time bar, which slowly fills up and notifies you with a message of your choice when the time is completed.

input is in seconds
Title: Re: Python
Post by: tuto99 on October 22, 2012, 01:13:56 PM
Since when do you guys specialize in python!?
I wouldn't mind learning XD
Title: Re: Python
Post by: vh on October 22, 2012, 01:17:42 PM
if you want to learn there are many sites that teach python; or you can just explore the documentation online.
Title: Re: Python
Post by: vh on October 22, 2012, 01:18:38 PM
this version makes a beeping noise when finished with timer (no additional installs needed other than python)

if anyone wants i'll make a version where you can select beep or not.
Title: Re: Python
Post by: atomic7732 on October 23, 2012, 07:50:36 PM
Code: [Select]
import random

i = 0
x = 100
file = open('file.txt', 'w+b')

while (x > 0):
i = i + 1
die1 = int(random.random()*5)
die2 = int(random.random()*5)
die3 = int(random.random()*5)
die4 = int(random.random()*5)
die5 = int(random.random()*5)
die6 = int(random.random()*5)
if die1 == die2:
if die1 == die3:
if die1 == die4:
if die1 == die5:
if die1 == die6:
print i
j = str(i) + "\n"
i = 0
x = x - 1
file.write(j)
else:
pass
else:
pass
else:
pass
else:
pass
else:
pass


For kip.
Title: Re: Python
Post by: vh on October 23, 2012, 09:58:11 PM
and why the hell is the length of blockx increasing by more than 1 each time?

Code: [Select]
import random
import os

#counts stuck attempts
arrayfinish=[]

def setup():
    global n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz, xn, xp, yn, yp, zn, zp, n
    #position of bot
    posx=0
    posy=0
    posz=0
    #array for occupied spaces
    blockx=[]
    blocky=[]
    blockz=[]
    #n_x, n_y, n_z
    n_x = 0
    n_y = 0
    n_z = 0
    #step count
    n=0
    #directions = none
    xn=0
    xp=0
    yn=0
    yp=0
    zn=0   
    zp=0

#setting xn, xp, yn, yp, zn, and zp
def direct(n_x, n_y, n_z):
    global xn, xp, yn, yp, zn, zp
    if (n_x < len(blockx) or n_y < len(blocky) or n_z < len(blockz)):       
        #check x n-egative and p-ositive side
        if posx - blockx[n_x] == 1 and posy == blocky[n_y] and posz == blockz[n_z]:
            xn = 1
        if posx - blockx[n_x] == -1 and posy == blocky[n_y] and posz == blockz[n_z]:
            xp = 1
        #check y n-egative and p-ositive side
        if posy - blockx[n_y] == 1 and posx == blocky[n_x] and posz == blockz[n_z]:
            yn = 1
        if posy - blockx[n_y] == -1 and posx == blocky[n_x] and posz == blockz[n_z]:
            yp = 1
        #check z n-egative and p-ositive side
        if posz - blockx[n_z] == 1 and posy == blocky[n_y] and posy == blockz[n_y]:
            zn = 1
        if posz - blockx[n_z] == -1 and posy == blocky[n_y] and posy == blockz[n_y]:
            zp = 1
        #advance one position and redo
        n_x=n_x+1
        n_y=n_y+1
        n_z=n_z+1
        print n_x, 'n_x'
        print len(blockx), 'len'
        #^should increase by 1, but it doesn't!
        direct(n_x, n_y, n_x)
    else: bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z)
       

#bot movement
def bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z):
    #generate random direction
    direction=random.randint(0,5)
    #the directions
    if xn == 1 and xp == 1 and yn == 1 and yp == 1 and zn == 1 and zp == 1:
        finished(n)
    #check if direction is blocked, if not, move there.
    if direction == 0 and xn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx-1
        n=n+1   
    if direction == 1 and xp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx+1
        n=n+1
    if direction == 2 and yn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy-1
        n=n+1
    if direction == 3 and yp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy+1
        n=n+1
    if direction == 4 and zn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz-1
        n=n+1
    if direction == 5 and zp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz+1
        n=n+1
    #if the space is blocked, rerun
    else:
        bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z)
    xn=0
    xp=0
    yn=0
    yp=0
    zn=0
    zp=0
    n_x=0
    n_y=0
    n_z=0
    direct(n_x, n_y, n_z)


    #after bot is stuck
def finished(steps):
    global posx, posy, posz, n
    arrayfinish.append(steps)
    posx=0
    posy=0
    posz=0
    n=0

def mainloop():
    global xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z
    setup()
    direct(n_x, n_y, n_z)
    #bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z)
    finished(n)
    print arrayfinish

mainloop()

os.system('pause')
Title: Re: Python
Post by: vh on October 23, 2012, 10:02:21 PM
ok now this one gets stuck in an endless recursion on line 56

Code: [Select]
import random
import os

#counts stuck attempts
arrayfinish=[]

def setup():
    global n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz, xn, xp, yn, yp, zn, zp, n
    #position of bot
    posx=0
    posy=0
    posz=0
    #array for occupied spaces
    blockx=[]
    blocky=[]
    blockz=[]
    #n_x, n_y, n_z
    n_x = 0
    n_y = 0
    n_z = 0
    #step count
    n=0
    #directions = none
    xn=0
    xp=0
    yn=0
    yp=0
    zn=0   
    zp=0

#setting xn, xp, yn, yp, zn, and zp
def direct(n_x, n_y, n_z):
    global xn, xp, yn, yp, zn, zp
    if (n_x < len(blockx) or n_y < len(blocky) or n_z < len(blockz)):       
        #check x n-egative and p-ositive side
        if posx - blockx[n_x] == 1 and posy == blocky[n_y] and posz == blockz[n_z]:
            xn = 1
        if posx - blockx[n_x] == -1 and posy == blocky[n_y] and posz == blockz[n_z]:
            xp = 1
        #check y n-egative and p-ositive side
        if posy - blockx[n_y] == 1 and posx == blocky[n_x] and posz == blockz[n_z]:
            yn = 1
        if posy - blockx[n_y] == -1 and posx == blocky[n_x] and posz == blockz[n_z]:
            yp = 1
        #check z n-egative and p-ositive side
        if posz - blockx[n_z] == 1 and posy == blocky[n_y] and posy == blockz[n_y]:
            zn = 1
        if posz - blockx[n_z] == -1 and posy == blocky[n_y] and posy == blockz[n_y]:
            zp = 1
        #advance one position and redo
        n_x=n_x+1
        n_y=n_y+1
        n_z=n_z+1
        print n_x, 'n_x'
        print len(blockx), 'len'
        direct(n_x, n_y, n_x)
    else: bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z)
       

#bot movement
def bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z):
    #generate random direction
    direction=random.randint(0,5)
    #the directions
    if xn == 1 and xp == 1 and yn == 1 and yp == 1 and zn == 1 and zp == 1:
        finished(n)
    #check if direction is blocked, if not, move there.
    if direction == 0 and xn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx-1
        n=n+1   
    elif direction == 1 and xp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx+1
        n=n+1
    elif direction == 2 and yn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy-1
        n=n+1
    elif direction == 3 and yp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy+1
        n=n+1
    elif direction == 4 and zn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz-1
        n=n+1
    elif direction == 5 and zp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz+1
        n=n+1
    #if the space is blocked, rerun
    else:
        bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z)
    xn=0
    xp=0
    yn=0
    yp=0
    zn=0
    zp=0
    n_x=0
    n_y=0
    n_z=0
    direct(n_x, n_y, n_z)


    #after bot is stuck
def finished(steps):
    global posx, posy, posz, n
    arrayfinish.append(steps)
    posx=0
    posy=0
    posz=0
    n=0

def mainloop():
    global xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z
    setup()
    direct(n_x, n_y, n_z)
    #bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z)
    finished(n)
    print arrayfinish

mainloop()

os.system('pause')
Title: Re: Python
Post by: vh on October 23, 2012, 10:22:46 PM
in this version i've figured that the problem is caused by the if statements in direct not working properly

Code: [Select]
import random
import os

os.sys.setrecursionlimit(9000)

#counts stuck attempts
arrayfinish=[]

def setup():
    global n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz, xn, xp, yn, yp, zn, zp, n
    #position of bot
    posx=0
    posy=0
    posz=0
    #array for occupied spaces
    blockx=[]
    blocky=[]
    blockz=[]
    #n_x, n_y, n_z
    n_x = 0
    n_y = 0
    n_z = 0
    #step count
    n=0
    #directions = none
    xn=0
    xp=0
    yn=0
    yp=0
    zn=0   
    zp=0

#setting xn, xp, yn, yp, zn, and zp
def direct(n_x, n_y, n_z):
    global xn, xp, yn, yp, zn, zp
    if (n_x < len(blockx) or n_y < len(blocky) or n_z < len(blockz)):       
        #check x n-egative and p-ositive side
        if posx - blockx[n_x] == 1 and posy == blocky[n_y] and posz == blockz[n_z]:
            xn = 1
        if posx - blockx[n_x] == -1 and posy == blocky[n_y] and posz == blockz[n_z]:
            xp = 1
        #check y n-egative and p-ositive side
        if posy - blockx[n_y] == 1 and posx == blocky[n_x] and posz == blockz[n_z]:
            yn = 1
        if posy - blockx[n_y] == -1 and posx == blocky[n_x] and posz == blockz[n_z]:
            yp = 1
        #check z n-egative and p-ositive side
        if posz - blockx[n_z] == 1 and posy == blocky[n_y] and posy == blockz[n_y]:
            zn = 1
        if posz - blockx[n_z] == -1 and posy == blocky[n_y] and posy == blockz[n_y]:
            zp = 1
        #advance one position and redo
        n_x=n_x+1
        n_y=n_y+1
        n_z=n_z+1
        print n_x, 'n_x'
        print len(blockx), 'len'
        print xn, xp, yn, yp, zn, zp, 'list'
        #^always stays as zero
        direct(n_x, n_y, n_x)
    else: bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z)
       

#bot movement
def bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z):
    #generate random direction
    direction=random.randint(0,5)
    #the directions
    if xn == 1 and xp == 1 and yn == 1 and yp == 1 and zn == 1 and zp == 1:
        finished(n)
    #check if direction is blocked, if not, move there.
    elif direction == 0 and xn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx-1
        n=n+1   
    elif direction == 1 and xp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx+1
        n=n+1
    elif direction == 2 and yn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy-1
        n=n+1
    elif direction == 3 and yp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy+1
        n=n+1
    elif direction == 4 and zn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz-1
        n=n+1
    elif direction == 5 and zp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz+1
        n=n+1
    #if the space is blocked, rerun
    else:
        bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z)
    xn=0
    xp=0
    yn=0
    yp=0
    zn=0
    zp=0
    n_x=0
    n_y=0
    n_z=0
    direct(n_x, n_y, n_z)


    #after bot is stuck
def finished(steps):
    global posx, posy, posz, n
    arrayfinish.append(steps)
    posx=0
    posy=0
    posz=0
    n=0

def mainloop():
    global xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z
    setup()
    direct(n_x, n_y, n_z)
    #bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z)
    finished(n)
    os.system('pause')
    print arrayfinish
    os.system('pause')


mainloop()

os.system('pause')
Title: Re: Python
Post by: Darvince on October 23, 2012, 10:24:38 PM
according to kip he is not going to learn java because
python can withstand my shitty syntax and programming stype
   >make ALL the variables global
[22:09]   Darvince   kol vh
   vh   >arrays? pffft just use 1000000 variables
Title: Re: Python
Post by: vh on October 23, 2012, 10:28:32 PM
in this version the change -- sometimes

Code: [Select]
import random
import os

os.sys.setrecursionlimit(9000)

#counts stuck attempts
arrayfinish=[]

def setup():
    global n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz, xn, xp, yn, yp, zn, zp, n
    #position of bot
    posx=0
    posy=0
    posz=0
    #array for occupied spaces
    blockx=[]
    blocky=[]
    blockz=[]
    #n_x, n_y, n_z
    n_x = 0
    n_y = 0
    n_z = 0
    #step count
    n=0
    #directions = none
    xn=0
    xp=0
    yn=0
    yp=0
    zn=0   
    zp=0

#setting xn, xp, yn, yp, zn, and zp
def direct(n_x, n_y, n_z, posx, posy, posz):
    global xn, xp, yn, yp, zn, zp
    if (n_x < len(blockx) or n_y < len(blocky) or n_z < len(blockz)):       
        #check x n-egative and p-ositive side
        if posx - blockx[n_x] == 1 and posy == blocky[n_y] and posz == blockz[n_z]:
            xn = 1
        if posx - blockx[n_x] == -1 and posy == blocky[n_y] and posz == blockz[n_z]:
            xp = 1
        #check y n-egative and p-ositive side
        if posy - blockx[n_y] == 1 and posx == blocky[n_x] and posz == blockz[n_z]:
            yn = 1
        if posy - blockx[n_y] == -1 and posx == blocky[n_x] and posz == blockz[n_z]:
            yp = 1
        #check z n-egative and p-ositive side
        if posz - blockx[n_z] == 1 and posy == blocky[n_y] and posy == blockz[n_y]:
            zn = 1
        if posz - blockx[n_z] == -1 and posy == blocky[n_y] and posy == blockz[n_y]:
            zp = 1
        #advance one position and redo
        n_x=n_x+1
        n_y=n_y+1
        n_z=n_z+1
        print n_x, 'n_x'
        print len(blockx), 'len'
        print xn, xp, yn, yp, zn, zp, 'list'
        print posx, posy, posz
        #^always stays as zero
        direct(n_x, n_y, n_z, posx, posy, posz)
    else: bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z)
       

#bot movement
def bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z):
    #generate random direction
    direction=random.randint(0,5)
    #the directions
    if xn == 1 and xp == 1 and yn == 1 and yp == 1 and zn == 1 and zp == 1:
        finished(n)
    #check if direction is blocked, if not, move there.
    elif direction == 0 and xn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx-1
        n=n+1   
    elif direction == 1 and xp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx+1
        n=n+1
    elif direction == 2 and yn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy-1
        n=n+1
    elif direction == 3 and yp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy+1
        n=n+1
    elif direction == 4 and zn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz-1
        n=n+1
    elif direction == 5 and zp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz+1
        n=n+1
    #if the space is blocked, rerun
    else:
        bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z)
    xn=0
    xp=0
    yn=0
    yp=0
    zn=0
    zp=0
    n_x=0
    n_y=0
    n_z=0
    direct(n_x, n_y, n_z, posx, posy, posz)


    #after bot is stuck
def finished(steps):
    global posx, posy, posz, n
    arrayfinish.append(steps)
    posx=0
    posy=0
    posz=0
    n=0

def mainloop():
    global xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z
    setup()
    direct(n_x, n_y, n_z, posx, posy, posz)
    #bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z)
    finished(n)
    os.system('pause')
    print arrayfinish
    os.system('pause')


mainloop()

os.system('pause')
Title: Re: Python
Post by: vh on October 23, 2012, 10:33:58 PM
still not working

Code: [Select]
import random
import os

os.sys.setrecursionlimit(9000)

#counts stuck attempts
arrayfinish=[]

def setup():
    global n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz, xn, xp, yn, yp, zn, zp, n
    #position of bot
    posx=0
    posy=0
    posz=0
    #array for occupied spaces
    blockx=[]
    blocky=[]
    blockz=[]
    #n_x, n_y, n_z
    n_x = 0
    n_y = 0
    n_z = 0
    #step count
    n=0
    #directions = none
    xn=0
    xp=0
    yn=0
    yp=0
    zn=0   
    zp=0

#setting xn, xp, yn, yp, zn, and zp
def direct(n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz):
    global xn, xp, yn, yp, zn, zp
    if (n_x < len(blockx) or n_y < len(blocky) or n_z < len(blockz)):       
        #check x n-egative and p-ositive side
        if posx - blockx[n_x] == 1 and posy == blocky[n_y] and posz == blockz[n_z]:
            xn = 1
        if posx - blockx[n_x] == -1 and posy == blocky[n_y] and posz == blockz[n_z]:
            xp = 1
        #check y n-egative and p-ositive side
        if posy - blockx[n_y] == 1 and posx == blocky[n_x] and posz == blockz[n_z]:
            yn = 1
        if posy - blockx[n_y] == -1 and posx == blocky[n_x] and posz == blockz[n_z]:
            yp = 1
        #check z n-egative and p-ositive side
        if posz - blockx[n_z] == 1 and posy == blocky[n_y] and posy == blockz[n_y]:
            zn = 1
        if posz - blockx[n_z] == -1 and posy == blocky[n_y] and posy == blockz[n_y]:
            zp = 1
        #advance one position and redo
        n_x=n_x+1
        n_y=n_y+1
        n_z=n_z+1
        print n_x, 'n_x'
        print len(blockx), 'len'
        print xn, xp, yn, yp, zn, zp, 'list'
        print posx, posy, posz
        #^always stays as constant!
        direct(n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz)
    else: bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z)
       

#bot movement
def bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z):
    #generate random direction
    direction=random.randint(0,5)
    #the directions
    if xn == 1 and xp == 1 and yn == 1 and yp == 1 and zn == 1 and zp == 1:
        finished(n)
    #check if direction is blocked, if not, move there.
    elif direction == 0 and xn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx-1
        n=n+1   
    elif direction == 1 and xp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx+1
        n=n+1
    elif direction == 2 and yn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy-1
        n=n+1
    elif direction == 3 and yp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy+1
        n=n+1
    elif direction == 4 and zn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz-1
        n=n+1
    elif direction == 5 and zp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz+1
        n=n+1
    #if the space is blocked, rerun
    else:
        bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z)
    xn=0
    xp=0
    yn=0
    yp=0
    zn=0
    zp=0
    n_x=0
    n_y=0
    n_z=0
    direct(n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz)


    #after bot is stuck
def finished(steps):
    global posx, posy, posz, n
    arrayfinish.append(steps)
    posx=0
    posy=0
    posz=0
    n=0

def mainloop():
    global xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z
    setup()
    direct(n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz)
    #bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z)
    finished(n)
    os.system('pause')
    print arrayfinish
    os.system('pause')


mainloop()

os.system('pause')
Title: Re: Python
Post by: vh on October 23, 2012, 10:37:26 PM
worse, but better in a way

Code: [Select]
import random
import os

os.sys.setrecursionlimit(9000)

#counts stuck attempts
arrayfinish=[]

def setup():
    global n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz, xn, xp, yn, yp, zn, zp, n
    #position of bot
    posx=0
    posy=0
    posz=0
    #array for occupied spaces
    blockx=[]
    blocky=[]
    blockz=[]
    #n_x, n_y, n_z
    n_x = 0
    n_y = 0
    n_z = 0
    #step count
    n=0
    #directions = none
    xn=0
    xp=0
    yn=0
    yp=0
    zn=0   
    zp=0

#setting xn, xp, yn, yp, zn, and zp
def direct(xn, xp, yn, yp, zn, zp, n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz):
    if (n_x < len(blockx) or n_y < len(blocky) or n_z < len(blockz)):       
        #check x n-egative and p-ositive side
        if posx - blockx[n_x] == 1 and posy == blocky[n_y] and posz == blockz[n_z]:
            xn = 1
        if posx - blockx[n_x] == -1 and posy == blocky[n_y] and posz == blockz[n_z]:
            xp = 1
        #check y n-egative and p-ositive side
        if posy - blockx[n_y] == 1 and posx == blocky[n_x] and posz == blockz[n_z]:
            yn = 1
        if posy - blockx[n_y] == -1 and posx == blocky[n_x] and posz == blockz[n_z]:
            yp = 1
        #check z n-egative and p-ositive side
        if posz - blockx[n_z] == 1 and posy == blocky[n_y] and posy == blockz[n_y]:
            zn = 1
        if posz - blockx[n_z] == -1 and posy == blocky[n_y] and posy == blockz[n_y]:
            zp = 1
        #advance one position and redo
        n_x=n_x+1
        n_y=n_y+1
        n_z=n_z+1
        print n_x, 'n_x'
        print len(blockx), 'len'
        print xn, xp, yn, yp, zn, zp, 'list'
        print posx, posy, posz
        #^always stays as constant!
        direct(xn, xp, yn, yp, zn, zp, n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz)
    else: bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z)
       

#bot movement
def bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z):
    #generate random direction
    direction=random.randint(0,5)
    #the directions
    if xn == 1 and xp == 1 and yn == 1 and yp == 1 and zn == 1 and zp == 1:
        finished(n)
    #check if direction is blocked, if not, move there.
    elif direction == 0 and xn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx-1
        n=n+1   
    elif direction == 1 and xp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx+1
        n=n+1
    elif direction == 2 and yn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy-1
        n=n+1
    elif direction == 3 and yp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy+1
        n=n+1
    elif direction == 4 and zn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz-1
        n=n+1
    elif direction == 5 and zp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz+1
        n=n+1
    #if the space is blocked, rerun
    else:
        bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z)
    xn=0
    xp=0
    yn=0
    yp=0
    zn=0
    zp=0
    n_x=0
    n_y=0
    n_z=0
    direct(xn, xp, yn, yp, zn, zp, n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz)


    #after bot is stuck
def finished(steps):
    global posx, posy, posz, n
    arrayfinish.append(steps)
    posx=0
    posy=0
    posz=0
    n=0

def mainloop():
    global xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z
    setup()
    direct(xn, xp, yn, yp, zn, zp, n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz)
    finished(n)
    os.system('pause')
    print arrayfinish
    os.system('pause')


mainloop()

os.system('pause')
Title: Re: Python
Post by: vh on October 23, 2012, 10:52:40 PM
Code: [Select]
import random
import os

os.sys.setrecursionlimit(9000)

#counts stuck attempts
arrayfinish=[]

def setup():
    global n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz, xn, xp, yn, yp, zn, zp, n
    #position of bot
    posx=0
    posy=0
    posz=0
    #array for occupied spaces
    blockx=[]
    blocky=[]
    blockz=[]
    #n_x, n_y, n_z
    n_x = 0
    n_y = 0
    n_z = 0
    #step count
    n=0
    #directions = none
    xn=0
    xp=0
    yn=0
    yp=0
    zn=0   
    zp=0

#setting xn, xp, yn, yp, zn, and zp
def direct(xn, xp, yn, yp, zn, zp, n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz):
    if n_x < len(blockx) and n_y < len(blocky) and n_z < len(blockz):       
        #check x n-egative and p-ositive side
        if (posx - blockx[n_x] == 1 and posy == blocky[n_y] and posz == blockz[n_z]):
            xn = 1
        if (posx - blockx[n_x] == -1 and posy == blocky[n_y] and posz == blockz[n_z]):
            xp = 1
        #check y n-egative and p-ositive side
        if (posy - blockx[n_y] == 1 and posx == blocky[n_x] and posz == blockz[n_z]):
            yn = 1
        if (posy - blockx[n_y] == -1 and posx == blocky[n_x] and posz == blockz[n_z]):
            yp = 1
        #check z n-egative and p-ositive side
        if (posz - blockx[n_z] == 1 and posy == blocky[n_y] and posy == blockz[n_y]):
            zn = 1
        if (posz - blockx[n_z] == -1 and posy == blocky[n_y] and posy == blockz[n_y]):
            zp = 1
        #advance one position and redo
        n_x=n_x+1
        n_y=n_y+1
        n_z=n_z+1
        print n_x, 'n_x'
        print len(blockx), 'len'
        print xn, xp, yn, yp, zn, zp, 'list'
        print posx, posy, posz
        #^always stays as constant!
        direct(xn, xp, yn, yp, zn, zp, n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz)
    else: bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z)
       

#bot movement
def bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z):
    #generate random direction
    direction=random.randint(0,5)
    #the directions
    if xn == 1 and xp == 1 and yn == 1 and yp == 1 and zn == 1 and zp == 1:
        finished(n)
    #check if direction is blocked, if not, move there.
    elif direction == 0 and xn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx-1
        n=n+1   
    elif direction == 1 and xp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx+1
        n=n+1
    elif direction == 2 and yn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy-1
        n=n+1
    elif direction == 3 and yp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy+1
        n=n+1
    elif direction == 4 and zn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz-1
        n=n+1
    elif direction == 5 and zp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz+1
        n=n+1
    #if the space is blocked, rerun
    else:
        bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z)
    xn=0
    xp=0
    yn=0
    yp=0
    zn=0
    zp=0
    n_x=0
    n_y=0
    n_z=0
    direct(xn, xp, yn, yp, zn, zp, n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz)


    #after bot is stuck
def finished(steps):
    global posx, posy, posz, n
    arrayfinish.append(steps)
    posx=0
    posy=0
    posz=0
    n=0

def mainloop():
    global xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z
    setup()
    direct(xn, xp, yn, yp, zn, zp, n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz)
    finished(n)
    os.system('pause')
    print arrayfinish
    os.system('pause')


mainloop()

os.system('pause')
Title: Re: Python
Post by: vh on October 23, 2012, 11:03:52 PM
what i'm seeing is that xn = 1 does not seem to be effective.
Title: Re: Python
Post by: vh on October 24, 2012, 12:03:50 PM
ok the cubes seem to have been working properly, they've moved in this order:

start
go left
to up
go left
go back
go back
go down
go right
go right
go right
Title: Re: Python
Post by: vh on October 24, 2012, 12:08:46 PM
hmm this is strange:

blockx position changes 10 times (expected 6)
blocky position changes 4 times (expected 6)
blockz position changes 3 times (expected 6)
coincidence?
Title: Re: Python
Post by: vh on October 24, 2012, 01:03:45 PM
updated version

Code: [Select]
import random
import os

#os.sys.setrecursionlimit(9000)
import pdb; pdb.set_trace()


#counts stuck attempts
arrayfinish=[]

def setup():
    global n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz, xn, xp, yn, yp, zn, zp, n, finish
    #position of bot
    posx=0
    posy=0
    posz=0
    #array for occupied spaces
    blockx=[]
    blocky=[]
    blockz=[]
    #n_x, n_y, n_z
    n_x = 0
    n_y = 0
    n_z = 0
    #step count
    n=0
    #directions = none
    xn=0
    xp=0
    yn=0
    yp=0
    zn=0   
    zp=0
    finish = False

#setting xn, xp, yn, yp, zn, and zp
def direct(xn, xp, yn, yp, zn, zp, n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz):
    #check x n-egative and p-ositive side
    if (posx - blockx[n_x] == 1 and posy == blocky[n_y] and posz == blockz[n_z]):
        print '---------------------------------------'
        xn = 1
        print xn
        print '||||||||||||||||||||||||||||||||||||||||||||||||'
    if (posx - blockx[n_x] == -1 and posy == blocky[n_y] and posz == blockz[n_z]):
        print '---------------------------------------'
        xp = 1
        print xp
        print '||||||||||||||||||||||||||||||||||||||||||||||||'
    #check y n-egative and p-ositive side
    if (posy - blockx[n_y] == 1 and posx == blocky[n_x] and posz == blockz[n_z]):
        print '---------------------------------------'
        yn = 1
        print yn
        print '||||||||||||||||||||||||||||||||||||||||||||||||'
    if (posy - blockx[n_y] == -1 and posx == blocky[n_x] and posz == blockz[n_z]):
        print '---------------------------------------'
        yp = 1
        print '||||||||||||||||||||||||||||||||||||||||||||||||'
    #check z n-egative and p-ositive side
    if (posz - blockx[n_z] == 1 and posy == blocky[n_y] and posy == blockz[n_y]):
        print '---------------------------------------'
        zn = 1
        print zn
        print '||||||||||||||||||||||||||||||||||||||||||||||||'
    if (posz - blockx[n_z] == -1 and posy == blocky[n_y] and posy == blockz[n_y]):
        print '---------------------------------------'
        zp = 1
        print zp
        print '||||||||||||||||||||||||||||||||||||||||||||||||'
    #advance one position and redo
    n_x=n_x+1
    n_y=n_y+1
    n_z=n_z+1
    print n_x, 'n_x'
    print len(blockx), 'len'
    print xn, xp, yn, yp, zn, zp, 'list'
   
#bot movement
def bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,finish):
    #generate random direction
    direction=random.randint(0,5)
    #the directions
    if xn == 1 and xp == 1 and yn == 1 and yp == 1 and zn == 1 and zp == 1:
        finish = True
    #check if direction is blocked, if not, move there.
    elif direction == 0 and xn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx-1
        n=n+1   
    elif direction == 1 and xp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx+1
        n=n+1
    elif direction == 2 and yn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy-1
        n=n+1
    elif direction == 3 and yp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy+1
        n=n+1
    elif direction == 4 and zn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz-1
        n=n+1
    elif direction == 5 and zp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz+1
        n=n+1
    else:
        #if error, rerun
        bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,finish)
    #reset variables
    xn = 0
    xp = 0
    yn = 0
    yp = 0
    zn = 0
    zp = 0
    n_x = 0
    n_y = 0
    n_z = 0

    #after bot is stuck
def finished(steps):
    global posx, posy, posz, n
    arrayfinish.append(steps)
    posx=0
    posy=0
    posz=0
    n=0

def mainloop():
    global xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z,finish
    setup()
    while finish == False:
        bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,finish)
        while n_x < len(blockx) and n_y < len(blocky) and n_z < len(blockz):
            direct(xn, xp, yn, yp, zn, zp, n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz)
    finished(n)
    print arrayfinish


mainloop()

os.system('pause')
Title: Re: Python
Post by: vh on October 24, 2012, 02:11:41 PM
strange

when i run:

Code: [Select]
   while finish == False:
        print 'start loop'
        bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,finish)
        print 'finished bot'    
        while n_x < len(blockx) and n_y < len(blocky) and n_z < len(blockz):
            print 'start direct'
            direct(xn, xp, yn, yp, zn, zp, n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz)
            print 'finish direct'

start direct and finish direct are printed but start loop and finished bot don't. any help?


vvv full version of code vvv
Code: [Select]
import random
import os

#os.sys.setrecursionlimit(9000)
#import pdb; pdb.set_trace()


#counts stuck attempts
arrayfinish=[]

def setup():
    global n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz, xn, xp, yn, yp, zn, zp, n, finish
    #position of bot
    posx=0
    posy=0
    posz=0
    #array for occupied spaces
    blockx=[]
    blocky=[]
    blockz=[]
    #n_x, n_y, n_z
    n_x = 0
    n_y = 0
    n_z = 0
    #step count
    n=0
    #directions = none
    xn=0
    xp=0
    yn=0
    yp=0
    zn=0    
    zp=0
    finish = False

#setting xn, xp, yn, yp, zn, and zp
def direct(xn, xp, yn, yp, zn, zp, n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz):
    #check x n-egative and p-ositive side
    if (posx - blockx[n_x] == 1 and posy == blocky[n_y] and posz == blockz[n_z]):
        print '---------------------------------------'
        xn = 1
        print xn
        print '||||||||||||||||||||||||||||||||||||||||||||||||'
    if (posx - blockx[n_x] == -1 and posy == blocky[n_y] and posz == blockz[n_z]):
        print '---------------------------------------'
        xp = 1
        print xp
        print '||||||||||||||||||||||||||||||||||||||||||||||||'
    #check y n-egative and p-ositive side
    if (posy - blockx[n_y] == 1 and posx == blocky[n_x] and posz == blockz[n_z]):
        print '---------------------------------------'
        yn = 1
        print yn
        print '||||||||||||||||||||||||||||||||||||||||||||||||'
    if (posy - blockx[n_y] == -1 and posx == blocky[n_x] and posz == blockz[n_z]):
        print '---------------------------------------'
        yp = 1
        print '||||||||||||||||||||||||||||||||||||||||||||||||'
    #check z n-egative and p-ositive side
    if (posz - blockx[n_z] == 1 and posy == blocky[n_y] and posy == blockz[n_y]):
        print '---------------------------------------'
        zn = 1
        print zn
        print '||||||||||||||||||||||||||||||||||||||||||||||||'
    if (posz - blockx[n_z] == -1 and posy == blocky[n_y] and posy == blockz[n_y]):
        print '---------------------------------------'
        zp = 1
        print zp
        print '||||||||||||||||||||||||||||||||||||||||||||||||'
    #advance one position and redo
    n_x=n_x+1
    n_y=n_y+1
    n_z=n_z+1
    print n_x, 'n_x'
    print len(blockx), 'len'
    print xn, xp, yn, yp, zn, zp, 'list'
    
#bot movement
def bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,finish):
    #generate random direction
    direction=random.randint(0,5)
    #the directions
    print 'line 83'
    if xn == 1 and xp == 1 and yn == 1 and yp == 1 and zn == 1 and zp == 1:
        finish = True
        #check if direction is blocked, if not, move there.
    elif direction == 0 and xn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx-1
        n=n+1
        print 'line 93'
    elif direction == 1 and xp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx+1
        n=n+1
        print 'line 100'
    elif direction == 2 and yn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy-1
        n=n+1
        print 'line 107'
    elif direction == 3 and yp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy+1
        n=n+1
        print 'line 114'
    elif direction == 4 and zn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz-1
        n=n+1
        print 'line 121'
    elif direction == 5 and zp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz+1
        n=n+1
        print 'line 128'
    else:
        #if error, rerun
        bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,finish)
    #reset variables
    xn = 0
    xp = 0
    yn = 0
    yp = 0
    zn = 0
    zp = 0
    n_x = 0
    n_y = 0
    n_z = 0

    #after bot is stuck
def finished(steps):
    global posx, posy, posz, n
    arrayfinish.append(steps)
    posx=0
    posy=0
    posz=0
    n=0

def mainloop():
    global xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z,finish
    setup()
    print 'completed setup'
    while finish == False:
        print 'start loop'
        bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,finish)
        print 'finished bot'    
        while n_x < len(blockx) and n_y < len(blocky) and n_z < len(blockz):
            print 'start direct'
            direct(xn, xp, yn, yp, zn, zp, n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz)
            print 'finish direct'
    finished(n)
    print arrayfinish


mainloop()

os.system('pause')
Title: Re: Python
Post by: vh on October 24, 2012, 06:33:14 PM
posx, posy, posz refuses to change

Code: [Select]
import random
import os

#os.sys.setrecursionlimit(9000)
#import pdb; pdb.set_trace()


#counts stuck attempts
arrayfinish=[]

def setup():
    global n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz, xn, xp, yn, yp, zn, zp, n, finish
    #position of bot
    posx=0
    posy=0
    posz=0
    #array for occupied spaces
    blockx=[]
    blocky=[]
    blockz=[]
    #n_x, n_y, n_z
    n_x = 0
    n_y = 0
    n_z = 0
    #step count
    n=0
    #directions = none
    xn=0
    xp=0
    yn=0
    yp=0
    zn=0   
    zp=0
    finish = False

#setting xn, xp, yn, yp, zn, and zp
def direct(xn, xp, yn, yp, zn, zp, n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz):
    #check x n-egative and p-ositive side
    if (posx - blockx[n_x] == 1 and posy == blocky[n_y] and posz == blockz[n_z]):
        print '---------------------------------------'
        xn = 1
        print xn
        print '||||||||||||||||||||||||||||||||||||||||||||||||'
    if (posx - blockx[n_x] == -1 and posy == blocky[n_y] and posz == blockz[n_z]):
        print '---------------------------------------'
        xp = 1
        print xp
        print '||||||||||||||||||||||||||||||||||||||||||||||||'
    #check y n-egative and p-ositive side
    if (posy - blockx[n_y] == 1 and posx == blocky[n_x] and posz == blockz[n_z]):
        print '---------------------------------------'
        yn = 1
        print yn
        print '||||||||||||||||||||||||||||||||||||||||||||||||'
    if (posy - blockx[n_y] == -1 and posx == blocky[n_x] and posz == blockz[n_z]):
        print '---------------------------------------'
        yp = 1
        print '||||||||||||||||||||||||||||||||||||||||||||||||'
    #check z n-egative and p-ositive side
    if (posz - blockx[n_z] == 1 and posy == blocky[n_y] and posy == blockz[n_y]):
        print '---------------------------------------'
        zn = 1
        print zn
        print '||||||||||||||||||||||||||||||||||||||||||||||||'
    if (posz - blockx[n_z] == -1 and posy == blocky[n_y] and posy == blockz[n_y]):
        print '---------------------------------------'
        zp = 1
        print zp
        print '||||||||||||||||||||||||||||||||||||||||||||||||'
   
#bot movement
def bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,finish):
    #generate random direction
    direction=random.randint(0,5)
    #the directions
    print 'line 83'
    if xn == 1 and xp == 1 and yn == 1 and yp == 1 and zn == 1 and zp == 1:
        finish = True
        #check if direction is blocked, if not, move there.
    elif direction == 0 and xn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx-1
        n=n+1
        print 'line 93'
    elif direction == 1 and xp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx+1
        n=n+1
        print 'line 100'
    elif direction == 2 and yn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy-1
        n=n+1
        print 'line 107'
    elif direction == 3 and yp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy+1
        n=n+1
        print 'line 114'
    elif direction == 4 and zn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz-1
        n=n+1
        print 'line 121'
    elif direction == 5 and zp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz+1
        n=n+1
        print 'line 128'
    else:
        #if error, rerun
        bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,finish)
    #reset variables
    xn = 0
    xp = 0
    yn = 0
    yp = 0
    zn = 0
    zp = 0
    n_x = 0
    n_y = 0
    n_z = 0

    #after bot is stuck
def finished(steps):
    global posx, posy, posz, n
    arrayfinish.append(steps)
    posx=0
    posy=0
    posz=0
    n=0

def mainloop():
    global xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,n_x,n_y,n_z,finish
    setup()
    print 'completed setup'
    #os.system('pause')
    while finish == False:
        print 'start loop'
        #os.system('pause')
        bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,finish)
        print 'finished bot'   
        while n_x < len(blockx) and n_y < len(blocky) and n_z < len(blockz):
            print 'start direct'
            direct(xn, xp, yn, yp, zn, zp, n_x, n_y, n_z, posx, posy, posz, blockx, blocky, blockz)
            #advance one position and redo
            n_x=n_x+1
            n_y=n_y+1
            n_z=n_z+1
            print n_x, 'n_x'
            print len(blockx), 'len'
            print xn, xp, yn, yp, zn, zp, 'list'
            print 'finish direct'
            print blockx, 'blockx'
            print blocky, 'blocky'
            print blockz, 'blockz'

    finished(n)
    print arrayfinish


mainloop()

os.system('pause')
Title: Re: Python
Post by: vh on October 24, 2012, 06:36:15 PM
* the reason they're doing that is because block_move is not being run
Title: Re: Python
Post by: vh on October 24, 2012, 06:38:19 PM
edit: ok block_move IS running but it isn't working right. this is block_move.

Code: [Select]
def bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,finish):
    #generate random direction
    direction=random.randint(0,5)
    #the directions
    print 'line 83'
    if xn == 1 and xp == 1 and yn == 1 and yp == 1 and zn == 1 and zp == 1:
        finish = True
        #check if direction is blocked, if not, move there.
    elif direction == 0 and xn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx-1
        n=n+1
        print 'line 93'
    elif direction == 1 and xp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posx=posx+1
        n=n+1
        print 'line 100'
    elif direction == 2 and yn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy-1
        n=n+1
        print 'line 107'
    elif direction == 3 and yp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posy=posy+1
        n=n+1
        print 'line 114'
    elif direction == 4 and zn == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz-1
        n=n+1
        print 'line 121'
    elif direction == 5 and zp == 0:
        blockx.append(posx)
        blocky.append(posy)
        blockz.append(posz)
        posz=posz+1
        n=n+1
        print 'line 128'
    else:
        #if error, rerun
        bot_move(xn,xp,yn,yp,zn,zp,n,posx,posy,posz,blockx,blocky,blockz,finish)
    #reset variables
    xn = 0
    xp = 0
    yn = 0
    yp = 0
    zn = 0
    zp = 0
    n_x = 0
    n_y = 0
    n_z = 0
Title: Re: Python
Post by: Darvince on October 24, 2012, 06:40:34 PM
ok when you're done with that you should code a bot that i can ctam with
Title: Re: Python
Post by: vh on October 24, 2012, 06:49:56 PM
no this is my python queue:

bot simulation (current)
byetech (some sort of game)
collisions simulator (what the parabola problem was for)
n-dimensional n-body fundamental force simulator
evolution simulator
ctambot (if i get bored enough)
Title: Re: Python
Post by: atomic7732 on October 24, 2012, 07:03:45 PM
my python no-particualr-order queue:

weather model
atlantic hurricane simulator (real time, possibly internet-based)
gravity simulator

Title: Re: Python
Post by: Darvince on October 24, 2012, 07:07:05 PM
avg time for kip projects: 1 week, done

avg time for kalaprojects: 1 month
no, this is too hard: 3 months
dammit: never
Title: Re: Python
Post by: atomic7732 on October 24, 2012, 07:08:19 PM
I've gotten several done though, like my cyclone product catcher...

Or at least to a functioning state. It's not really done.
Title: Re: Python
Post by: vh on October 25, 2012, 12:44:06 PM
for darvince

(warning; single player only)

200 seconds for me
Title: Re: Python
Post by: vh on October 25, 2012, 12:54:45 PM
this program; which does not have to print every single number it counts; can count to a billion in about 4 minutes


seriously, read the code, it actually does count.
Title: Re: Python
Post by: vh on October 25, 2012, 01:26:29 PM
def asdf():
    s=time.time()
    randomfunction()
    a=time.time()
    print (a-s)*1000

useful to time stuff

however, if the function you are running is very short; like print 'hello world', i would run it 10 times + to get a accurate time, or else it'll come out very strange

time is in miliseconds.
Title: Re: Python
Post by: vh on October 25, 2012, 01:32:05 PM
from the above^:

it takes about 410 milliseconds to square root 632 one million times with math.sqrt

it takes 100 milliseconds to square root 632 one million times with the ** power operator

conclusion: use power operator
Title: Re: Python
Post by: blotz on October 25, 2012, 01:35:18 PM
okok, can you stop saying how fast it goes or whatever?
Title: Re: Python
Post by: vh on October 25, 2012, 01:54:28 PM
no
Title: Re: Python
Post by: vh on October 25, 2012, 02:45:40 PM
Code: [Select]
import os
import random
import math

#defines all the variables
emitter_xpos = 0
emitter_ypos = 0
emitter_zpos = 0
emitter_turnx = 0
emitter_turny = 0
emitter_moved = 0

#moves emitter forwards
def emitter_move_distance():
    global emitter_moved
    emitter_moved = (random.randint(50,100))/1000
    
#turns the emitter up down right or left
def emitter_turn_x():
    global emitter_turnx
    emitter_turnx = emitter_turnx + (random.randint(-500,500))/1000
def emitter_turn_y():
    global emitter_turny
    emitter_turny = emitter_turny + (random.randint(-500,500))/1000
#calculates new position of emitter
def emitter_pos():
    global emitter_xpos, emitter_ypos, emitter_zpos
    emitter_xpos = emitter_moved*math.sin(-(emitter_turny)+math.pi/2)*math.cos(emitter_turnx)+emitter_xpos
    emitter_ypos = emitter_moved*math.sin(-(emitter_turny)+math.pi/2)*math.sin(emitter_turnx)+emitter_ypos
    emitter_zpos = emitter_moved*math.cos(-(emitter_turny)+math.pi/2)+emitter_zpos

#runs entire thing
def move_emitter():
    emitter_move_distance()
    emitter_turn_x()
    emitter_turn_y()
    emitter_pos()



move_emitter()
    
print emitter_xpos
print emitter_ypos
print emitter_zpos

os.system('pause')
Title: Re: Python
Post by: vh on October 25, 2012, 02:59:50 PM
working version (everything needs to be floated)
Code: [Select]
import time
import os
import random
import math

#defines all the variables
emitter_xpos = 0
emitter_ypos = 0
emitter_zpos = 0
emitter_turnx = 0
emitter_turny = 0
emitter_moved = 0

#moves emitter forwards
def emitter_move_distance():
    global emitter_moved
    emitter_moved_1000 = random.randint(50,100)
    emitter_moved = float(emitter_moved_1000)/1000
#turns the emitter up down right or left
def emitter_turn_x():
    global emitter_turnx
    emitter_turnx_1000 = random.randint(-500,500)
    emitter_turnx = float(emitter_turnx_1000)/1000 + emitter_turnx
def emitter_turn_y():
    global emitter_turny
    emitter_turny_1000 = random.randint(-500,500)
    emitter_turny = float(emitter_turny_1000)/1000 + emitter_turny
#calculates new position of emitter
def emitter_pos():
    global emitter_xpos, emitter_ypos, emitter_zpos
    emitter_xpos = emitter_moved*math.sin(-(emitter_turny)+math.pi/2)*math.cos(emitter_turnx)+emitter_xpos
    emitter_ypos = emitter_moved*math.sin(-(emitter_turny)+math.pi/2)*math.sin(emitter_turnx)+emitter_ypos
    emitter_zpos = emitter_moved*math.cos(-(emitter_turny)+math.pi/2)+emitter_zpos

#runs entire thing
def move_emitter():
    emitter_move_distance()
    emitter_turn_x()
    emitter_turn_y()
    emitter_pos()


x=0
while x<1000:
    move_emitter()
    x=x+1
   
print emitter_xpos
print emitter_ypos
print emitter_zpos

os.system('pause')
Title: Re: Python
Post by: atomic7732 on October 25, 2012, 03:14:23 PM
for darvince

(warning; single player only)

200 seconds for me
74.72s

working version (everything needs to be floated)
Code: [Select]
import time
import os
import random
import math

#defines all the variables
emitter_xpos = 0
emitter_ypos = 0
emitter_zpos = 0
emitter_turnx = 0
emitter_turny = 0
emitter_moved = 0

#moves emitter forwards
def emitter_move_distance():
    global emitter_moved
    emitter_moved_1000 = random.randint(50,100)
    emitter_moved = float(emitter_moved_1000)/1000
#turns the emitter up down right or left
def emitter_turn_x():
    global emitter_turnx
    emitter_turnx_1000 = random.randint(-500,500)
    emitter_turnx = float(emitter_turnx_1000)/1000 + emitter_turnx
def emitter_turn_y():
    global emitter_turny
    emitter_turny_1000 = random.randint(-500,500)
    emitter_turny = float(emitter_turny_1000)/1000 + emitter_turny
#calculates new position of emitter
def emitter_pos():
    global emitter_xpos, emitter_ypos, emitter_zpos
    emitter_xpos = emitter_moved*math.sin(-(emitter_turny)+math.pi/2)*math.cos(emitter_turnx)+emitter_xpos
    emitter_ypos = emitter_moved*math.sin(-(emitter_turny)+math.pi/2)*math.sin(emitter_turnx)+emitter_ypos
    emitter_zpos = emitter_moved*math.cos(-(emitter_turny)+math.pi/2)+emitter_zpos

#runs entire thing
def move_emitter():
    emitter_move_distance()
    emitter_turn_x()
    emitter_turn_y()
    emitter_pos()


x=0
while x<1000:
    move_emitter()
    x=x+1
   
print emitter_xpos
print emitter_ypos
print emitter_zpos

os.system('pause')
what does it do
Title: Re: Python
Post by: vh on October 25, 2012, 03:45:48 PM
i'm working on a game/simulation thingy.

there will be objects called bots inside a three dimensional space (although the physics in this space will be different). instead position being speed*time and speed being acceleration*time etc, there will be only position.)

the emitter is an object in this three dimensional space which randomly moves around (it's movement right now is a bit jerky and sudden atm, but that'll be fixed) Most importantly, the emitter is a source of energy for these bots. the energy from this emitter decreases as the square root of distance, 1/sqrt(x) as opposed to the usual 1/x^2

each bot has a laser, scanner, energy storage (capacitor), energy collection (some solar-panel-like device), a propulsion unit, and armor. more advances versions of these items will result in a more energy expensive and powerful bot, while some other bots might have a version 0 for these items (nonexistant). to prevent bots from gathering too close to the emitter to gain large quantities of energy and become invincible; getting too close to the emitter will damage a bot. the laser of a bot lessens it's power as 1/x (a bot twice as far as another will be half as damaging assuming the same laser level)

each bot is also preset with behavioral parameters such as hostility, when to attack depending on various parameters and scanners, how and if to cooperate, when to build more of themselves, and etc.

the scanner unit on a bot lets one bot determine all the parameters and settings of another bot.

energy is used when thrusting, shooting laser, activating armor, scanning, or giving energy to another bot, or constructing a new bot.
if a bot destroys another bot it will gain all the energy that the other bot had in it's energy storage unit. in addition energy can be gained with the energy collection units or given by another bot.

bots will also slowly lose energy over time; this provides incentive for not drifting off into isolation

a bot will be removed from the program if its structural integrity or energy is reduced to zero. a bot who has between 0 and full structural integrity will very slowly increase it's SI if it has energy.

the bot's parameters will be stored as an int; as well as the bot's preferred distance and location relative to the emitter. this way everyone can create a bot and compete.

i also might make it so that new bots being created will be mutated so as to have an evolution simulator
Title: Re: Python
Post by: atomic7732 on October 25, 2012, 04:07:50 PM
Wow that sounds interesting.
Title: Re: Python
Post by: vh on October 26, 2012, 01:38:27 PM
object1=[1,2,3]
object2=[3,4,5]
object3=[6,2,8]
allobjects=[object1, object2, object3]

how get the number 8 in this?
Title: Re: Python
Post by: vh on October 26, 2012, 01:43:34 PM
oh i figured it out
allobjects[2][2]
Title: Re: Python
Post by: vh on October 26, 2012, 02:32:18 PM
someone tell me:

def countline():
    count=0
    for line in open('save.txt', 'r+'):
        count = count + 1
    return count

yeah so what name does python use to reference the file so i can close it  like
Code: [Select]
f.close()
Title: Re: Python
Post by: vh on October 26, 2012, 04:21:36 PM
if i take lines from a text file and append them to an array, they come out as strings.

for example if i have array
allobjects=[]

and then the line in my save.txt is [0,320,40,51]
allobjects.append(save.readline().rstrip())

print allobjects
['[0,320,40,51]']

i want it to be
[[0,320,40,51]]
Title: Re: Python
Post by: blotz on October 26, 2012, 05:37:04 PM
why post question if no one but you can solve them?
Title: Re: Python
Post by: vh on October 26, 2012, 05:53:27 PM
why post question asking "why post question if no one but you can solve them" if other people can solve them.

your logic is like saying that if you don't know if people have the answer to your question, don't ask it.
Title: Re: Python
Post by: blotz on October 26, 2012, 06:19:29 PM
because you might not have the answer and other ppl might.
Title: Re: Python
Post by: vh on October 26, 2012, 06:34:42 PM
why post question if no one but you can solve them?
because you might not have the answer and other ppl might.


you have just answered your own question.
Title: Re: Python
Post by: blotz on October 26, 2012, 06:36:42 PM
i know, but no one else here knows python good enought to solve your python problems
Title: Re: Python
Post by: vh on October 26, 2012, 06:37:14 PM
proof?
Title: Re: Python
Post by: Darvince on October 26, 2012, 06:39:25 PM
godstab, greenland
Title: Re: Python
Post by: vh on October 27, 2012, 05:08:35 AM
updated code

and i figurd out the for statement :P
Code: [Select]
import time
import os
import random
import math

#defines all the variables
emitter_xpos = 0
emitter_ypos = 0
emitter_zpos = 0
emitter_turnx = 0
emitter_turny = 0
emitter_moved = 0

#moves emitter forwards
def emitter_move_distance():
    global emitter_moved
    emitter_moved_1000 = random.randint(50,100)
    emitter_moved = float(emitter_moved_1000)/1000
#turns the emitter up down right or left
def emitter_turn_x():
    global emitter_turnx
    emitter_turnx_1000 = random.randint(-500,500)
    emitter_turnx = float(emitter_turnx_1000)/1000 + emitter_turnx
def emitter_turn_y():
    global emitter_turny
    emitter_turny_1000 = random.randint(-500,500)
    emitter_turny = float(emitter_turny_1000)/1000 + emitter_turny
#calculates new position of emitter
def emitter_pos():
    global emitter_xpos, emitter_ypos, emitter_zpos
    emitter_xpos = emitter_moved*math.sin(-(emitter_turny)+math.pi/2)*math.cos(emitter_turnx)+emitter_xpos
    emitter_ypos = emitter_moved*math.sin(-(emitter_turny)+math.pi/2)*math.sin(emitter_turnx)+emitter_ypos
    emitter_zpos = emitter_moved*math.cos(-(emitter_turny)+math.pi/2)+emitter_zpos

#runs entire thing
def move_emitter():
    emitter_move_distance()
    emitter_turn_x()
    emitter_turn_y()
    emitter_pos()

allobjects=[]

#opening objects
def load_obj():
    global allobjects
    for line in open('save.txt', 'r+'):
        derp = [int(x) for x in line.rstrip().split(",")]
        allobjects.append(derp)

load_obj()

#collecting energy
def energy_collection(emitter_xpos, emitter_ypos, emitter_zpos):
    global allobjects
    for list in allobjects:
        #list[4] is the distance
        #list[5] is the energy collection unit
        #list[6] is the enery stored
        #list[7] is the maximum value of the energy storage unit
        list[4] = ((list[0]-emitter_xpos)**2+(list[1]-emitter_ypos)**2+(list[2]-emitter_zpos)**2)**0.5
        list[6] = list[6]+list[5]/list[4]**0.5
        if list[6] > list[7]:
            list[6] = list[7]

energy_collection(emitter_xpos, emitter_ypos, emitter_zpos)
print allobjects
    

    


os.system('pause')
Title: Re: Python
Post by: vh on October 28, 2012, 07:22:10 PM
testplz
Title: Re: Python
Post by: vh on November 02, 2012, 06:39:59 PM
i've been busy

code for primality testing using the miller-rabin probabilistic test:
Code: [Select]
import random

def primality(number, iterations): #insert a number and the amount of iterations for a return of True or False for primality
    n = number
    k = iterations
    n_=n-1 #supposed to write n-1 as 2^s*d later; so substitute this instead
    s=0
    d=0
    if n <= 1:
        return False
    if n == 3 or n == 2: #filters out numbers <= 3 because the primality test can't
        return True
    if n % 2 == 0:
        return False
    while n_ % 2 == 0: #making n_ into 2^s*d
        s = s + 1
        n_= n_/ 2
    d = n_
    while k != 0: #corresponds to line : LOOP: repeat k times:
        k = k - 1
        a = random.randint(2, n-2) # corresponds to : pick a random integer a in the range from 2 to n minus 2
        x = pow(a,d,n)           # corresponds to : x = a^d mod n
        if x == 1 or x == n - 1: #corresponds to : if x = 1 or x = n - 1 then do next loop
            continue            # if this is true then go back to the while k!=0 loop
        r = 1
        for r in xrange (1,s): #do this from r = 1 to r = s - 1
            x = pow(x, 2, n)       #corresponds to x = x^2 mod n
            if x == 1:            #corresponds to if x = 1 then return composite
                return False
            elif x == n - 1:          #if x = n - 1, then it will ignore the if and break and go back to while k!=0 loop
                break
        else:
            return False #composite
    return True                   #return prime

code that factors smallest integer out of a number using a pollard-brent method, partly taken from comeoncodeon blog/wordpress thingy:
Code: [Select]
import random
import fractions

#come on code on wordpress blog

def pollard_brent(number): #returns a factor of an integer where number > 1 is True
    if number %  2 == 0:
        return 2
    y = random.randint(1,number-1)
    c = random.randint(1,number-1)
    m = random.randint(1,number-1)
    g = 1
    r = 1
    q = 1
    while g == 1:
        x = y
        for i in range(r):
            y = (pow(y,2,number)+c) % number
        k = 0
        while k < r and g == 1:
            ys = y
            for i in range(min(m, r-k)):
                y = (pow(y,2,number)+c) % number
                q = q*(abs(x-y)) % number
            g = fractions.gcd(q, number)
            k = k + m
        r = r * 2
    if g == number:
        while True:
            ys = (pow(ys, 2, number)+c) % number
            g = fractions.gcd(abs(x-ys), number)
            if g > 1:
                break
    return g
i'm not sure how the above code works so don't ask me :P

and this is a prime factorization code; returns an array with (hopefully) all the prime factors of a number:
Code: [Select]
import random
import fractions
import os

def primality(number, iterations):
    n = number
    k = iterations
    n_=n-1
    s=0
    d=0
    if n <= 1:
        return False
    if n == 3 or n == 2:
        return True
    if n % 2 == 0:
        return False
    while n_ % 2 == 0:
        s = s + 1
        n_= n_/ 2
    d = n_
    while k != 0:
        k = k - 1
        a = random.randint(2, n-2)
        x = pow(a,d,n)
        if x == 1 or x == n - 1:
            continue
        r = 1
        for r in xrange (1,s):
            x = pow(x, 2, n)
            if x == 1:
                return False
            elif x == n - 1:
                break
        else:
            return False
    return True

def pollard_brent(number): #returns a factor of an integer where number > 1 is True
    if number % 2 == 0:
        return 2
    y = random.randint(1,number-1)
    c = random.randint(1,number-1)
    m = random.randint(1,number-1)
    g = 1
    r = 1
    q = 1
    while g == 1:
        x = y
        for i in range(r):
            y = (pow(y,2,number)+c) % number
        k = 0
        while k < r and g == 1:
            ys = y
            for i in range(min(m, r-k)):
                y = (pow(y,2,number)+c) % number
                q = q*(abs(x-y)) % number
            g = fractions.gcd(q, number)
            k = k + m
        r = r * 2
    if g == number:
        while True:
            ys = (pow(ys, 2, number)+c) % number
            g = fractions.gcd(abs(x-ys), number)
            if g > 1:
                break
    return g

def prime_factorization(number, iterations):
    n = number
    primefactors = []
    while primality(number, iterations) == False:
        if number == 1:
            break
        factor = pollard_brent(number)
        primefactors.append(int(factor))
        number = number / factor
    if number != 1 and n != number:
        primefactors.append(int(number))
    return primefactors

os.system('pause')

attached is a prime.py and a primefactorization.py

prime.py will tell you if a number is prime or even given an input. you may input through the terminal or by entering a number in a number.txt in the same directory as the prime.py file. i strongly suggest using notepad++ to input the number; notepad incorrectly warps large numbers.

the only input for primefactorization.py is with the terminal. a sorted array with all the prime factors should be returned. entering a number beyond 50 digits may result in several minutes of computation. it took my computer 5 minutes to calculate the prime factorizations for all the numbers from 2 to 1000000 excluding.

*A note on accuracy:
since the miller-rabin test is probabilistic -- that means, it relies on probability; there is a chance that when you run one of the scripts, you will get an incorrect result.

the probability that prime.py will result in a false positive; meaning that a composite number is designated prime is:
 4^(-k) where k is the amount of iterations running. running 10 iterations, which means a wrong result chance of 1 in 10,000 should be enough for most applications, but if necessary, you can run a thousand or a million trials which will give a false positive rate of one in a trillion or one in a septillion respectively. a prime number will never be mistakenly labeled as composite.

**the actual probability is significantly less than 4^(-k), read here for further maths:
http://www.math.dartmouth.edu/~carlp/PDF/paper88.pdf (http://www.math.dartmouth.edu/~carlp/PDF/paper88.pdf)

because primefactorization.py relies on the miller-rabin test, it will also have a chance of miscalculation; although the probability is a bit more complex to calculate it should be on the same order of magnitude as the false positive rate of the primality.py algorithm.

and post if you notice any bugs.
Title: Re: Python
Post by: blotz on November 02, 2012, 07:05:27 PM
i just read the program names and not the post. :)
Title: Re: Python
Post by: Hellpotatoe on November 03, 2012, 05:08:24 AM
i ignore python things because idk how to work with 'em
Title: Re: Python
Post by: vh on November 03, 2012, 05:16:15 AM
ok you can download and install from here http://www.python.org/getit/releases/2.7.3/ (http://www.python.org/getit/releases/2.7.3/) (pick any one)
and then i recommend you install this: http://sourceforge.net/projects/pywin32/files/pywin32/Build%20218/pywin32-218.win-amd64-py2.7.exe/download (http://sourceforge.net/projects/pywin32/files/pywin32/Build%20218/pywin32-218.win-amd64-py2.7.exe/download)

then open python interpreter and you can try some basic commands like
print 'hello world'
or
print 5*3
etc
Title: Re: Python
Post by: Hellpotatoe on November 03, 2012, 05:23:04 AM
no thanks, this pc kant run python
Title: Re: Python
Post by: vh on November 03, 2012, 05:24:02 AM
really? have you tried? i'm pretty sure python can run on any computer that can run a browser :P
Title: Re: Python
Post by: Hellpotatoe on November 03, 2012, 05:25:49 AM
this pc kan't run a browser
Title: Re: Python
Post by: vh on November 03, 2012, 05:26:45 AM
then how are you on universe sandbox! what program do you use to search the internet
Title: Re: Python
Post by: Hellpotatoe on November 03, 2012, 05:35:58 AM
i'm using ms-dos -kolno
this pc kant run internet
Title: Re: Python
Post by: vh on November 03, 2012, 05:39:43 AM
yes it can thats why you're posting herez1!
Title: Re: Python
Post by: Hellpotatoe on November 03, 2012, 05:41:32 AM
NO, THATS A DREAM!
i wonder if bla will delete our random posts or if he will make one topic with them...
Title: Re: Python
Post by: vh on November 03, 2012, 05:43:19 AM
^

yes bu go install pyfon
Title: Re: Python
Post by: Hellpotatoe on November 03, 2012, 05:53:31 AM
no, because i kant use internet
Title: Re: Python
Post by: vh on November 03, 2012, 05:54:53 AM
yes you can and that post above just prove it!
Title: Re: Python
Post by: Hellpotatoe on November 03, 2012, 05:57:09 AM
IM USING A PROXYPAPER!!!
Title: Re: Python
Post by: vh on November 03, 2012, 05:59:37 AM
YOU CANNOT USE THAT TO CONNECT TO BLACRAFT
Title: Re: Python
Post by: vh on November 03, 2012, 08:00:49 PM
semi working code

Code: [Select]
import random
import fractions

def primality(number, iterations): #converted from http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test#Algorithm_and_running_time
    n = number       #number to test for primality
    k = iterations   #corresponds to line 'k, a parameter that determines the accuracy of the test
    n_=n-1           #n-1 is substituted by n_, for later use when i need to write n - 1 as 2**s * d,
    s=0
    d=0
    if n == 3 or n == 2:
        return True
    if n % 2 == 0:
        return False
    while n_ % 2 == 0: #writes n - 1 aka n_ as 2**s * d by dividing by two and checking if n_ is still even
        s = s + 1
        n_= n_/ 2
    d = n_
    while k != 0:                   #corresponds to line in pseudocode | Loop: repeat k times:
        k = k - 1                   
        a = random.randint(2, n-2)  #picks random integer in range 2, n-2
        x = pow(a,d,n)              # sets x to a^d mod n
        if x == 1 or x == n - 1:    # corresponds to line in pseudocode| if x = 1 or x = n - 1 then do next Loop
            continue
        for r in xrange (1,s):      #corresponds to line in pseudocode | for r = 1...s-1 
            x = pow(x, 2, n)       #sets x to x^2 mod n
            if x == 1:              #corresponds to line | if x = 1 then return composite
                return False
            elif x == n - 1:     #corresponds to line | if x = n - 1 then do next Loop
                break
        else:                   #corrresponds to line | return composite
            return False
    return True                 #corresponds to line | return probably prime

def pollard_brent(number): #returns a factor of an integer: code from http://comeoncodeon.wordpress.com/2010/09/18/pollard-rho-brent-integer-factorization/#viewSource
    if number % 2 == 0:
        return 2
    y = random.randint(1,number-1)
    c = random.randint(1,number-1)
    m = random.randint(1,number-1)
    g = 1
    r = 1
    q = 1
    while g == 1:
        x = y
        for i in range(r):
            y = (pow(y,2,number)+c) % number
        k = 0
        while k < r and g == 1:
            ys = y
            for i in range(min(m, r-k)):
                y = (pow(y,2,number)+c) % number
                q = q*(abs(x-y)) % number
            g = fractions.gcd(q, number)
            k = k + m
        r = r * 2
    if g == number:
        while True:
            ys = (pow(ys, 2, number)+c) % number
            g = fractions.gcd(abs(x-ys), number)
            if g > 1:
                break
    return g

def prime_factorization(number, iterations):            #returns list of prime factors of a number
    n = number
    primefactors = []
    while primality(number, iterations) == False: # if number is not a prime number
        if number == 1:                         # and if number is not 1
            break
        factor = pollard_brent(number)          #factor the number
        if factor != number and primality(factor, 10) == True: #if the factor is composite or equal to number then try again.
            primefactors.append(int(factor))                # if factor is composite and not equal to number then add it to the list of prime factors
            number = number / factor                            #set number to number/factor
    if number != 1 and n != number:                         #if number is not 1 or n, then
        primefactors.append(int(number))                    #append it
    return primefactors                                     #return array with all the prime factors

def divisorlist(num):                                       #returns list of proper divisors when given prime factors
#all the divisors of a number can be generated by multiplying the prime factors of the number in all possible ways
    divisors=[]
    f = lambda l: reduce(lambda z, x: z + [y + [x] for y in z], l, [[]]) #returns the set of all subsets of its argument http://wiki.python.org/moin/Powerful%20Python%20One-Liners
    for list in f(prime_factorization(num,10)):                         #for all lists in the set of subsets that can be created from the list of the prime factors of num
        n=1                                                             #set n to one
        for int in list:                                                #then multiply all the numbers in each list
            n = n * int
        divisors.append(n)                                              #and that is one possible divisor of num
    if num in divisors:                                                 #remove num if it exists because only proper divisors needed
        divisors.remove(num)
    divisors_=[]
    for int in divisors:                                                #remove duplicates
        if int not in divisors_:
            divisors_.append(int)
    divisors = divisors_
    return divisors                         #return all the proper divisors
       

def subset(num):                                                            #figure out if a number is semiperfect or not
    semiperfect = False                                         
    f = lambda l: reduce(lambda z, x: z + [y + [x] for y in z], l, [[]])    #creates all possible subsets,
    for list in f(divisorlist(num)):                                        #of the list of proper divisors
        if sum(list) == num:                                                #if the sum any list is equal to the number
            semiperfect = True                                              #then the number is semiperfect
    return semiperfect

#weird number is both NOT semiperfect and abundant
for num in xrange(2,1000000):
    if sum(divisorlist(num)) > num:     #if the sum of proper divisors of num is larger than num then the number is abundant
        if subset(num) is False:        # if the num is NOT semiperfect subset(num) should be False
            print num                   #if both of the above are true then the number is weird and print it.
Title: Re: Python
Post by: Darvince on November 03, 2012, 09:54:49 PM
at the beginning of every python code:
import alphabet
import dictionary
import english
import python
import x, y, z
Title: Re: Python
Post by: atomic7732 on November 14, 2012, 06:07:04 PM
Code: [Select]
import math
#http://www.onlineconversion.com/julian_date.htm

curtime = raw_input("Current Julian Date:")
curtime = float(curtime.strip("\n"))
we1399 = 2232023.896169

year = (curtime-we1399)/365.256363004
day = (year-math.floor(year))*365 #actual days in the year, 616 being the year with 366
grade1 = (day-math.floor(day))*100
grade2 = (grade1-math.floor(grade1))*1000

print "%d.%d %d %d" % (math.floor(year), math.floor(day), math.floor(grade1), math.floor(grade2)) #example 613.328 85 417

Soleani calendar date and time calculator

at the time of this post it was 613.320 27 520
Title: Re: Python
Post by: vh on November 14, 2012, 07:35:24 PM
ok now make it take take time.time() to find the current soleani date
Title: Re: Python
Post by: atomic7732 on November 14, 2012, 07:59:51 PM
I prefer to use Julian Date... because it's consistent... It didn't jump 11 days like the Gregorian.

unless time.time() is a JD or Unix time?
Title: Re: Python
Post by: vh on November 14, 2012, 08:01:13 PM
yeah unix time.
Title: Re: Python
Post by: vh on November 14, 2012, 08:01:39 PM
oh unix time doesn't count leap seconds this makes things to much simpler
Title: Re: Python
Post by: atomic7732 on November 14, 2012, 08:04:08 PM
well then if you want that I'll have to do a calculation of JD at the UNIX epoch

and then add a certain amount of Soleani years and that's kind of lame actually.
Title: Re: Python
Post by: vh on November 14, 2012, 08:05:42 PM
well i do want it and if you won't do it i will when i have time in the far future :P
Title: Re: Python
Post by: vh on November 18, 2012, 05:20:59 PM
this will generate a white png file, given the size you want it to be. the goal is to make a completely text based image editor
(jk)

oh you need the pypng module

import png
n = int(input('columns?'))
y = int(input('rows?'))
pixels = [[] for x in xrange(0,n)]
for x in xrange(0,y):
    for list in pixels:
        list.append(255)
png.from_array(pixels, 'L').save('image.png')
Title: Re: Python
Post by: vh on November 23, 2012, 12:12:04 PM
i've written something that will generate cryptographically strong prime numbers, generated from random noise and entropy from your computer

(if anyone wants me to make this print the primes to a file i'll do that too because theres's no copy in the python terminal)

a note about accuracy: an input of n will yield a false positive of a prime once in n^4. for example a value of 10 will yield once mistake per 10,000 trials. an input of 1000 will yield a mistake in 1 trillion trials.

average times to generate and print primes with an accuracy of 10 on a laptop: (times in miliseconds)
length 10: 2.5
length 50: 70
length 100: 500
length 200: 5400


YOU don't need any additional modules just python 2.7 to run this
Title: Re: Python
Post by: vh on November 27, 2012, 07:27:52 PM
with the attached file, figure out to add the text in all the population tags IF and only if the nation is in a certain region

notes:
derp = open('derp.xml', 'r')
derp = etree.parse(derp)
derp = derp.getroot()
print derp[n][n].text #where n is index to extract text from given location
Title: Re: Python
Post by: vh on November 27, 2012, 07:52:17 PM
Code: [Select]
haven't tested this code yet; if it works i will be elated

import os
from lxml import etree
derp = (etree.parse(open('derp.xml ','r'))).getroot()
pop1, pop2, pop3, pop4, pop5, pop6, pop7, pop8, pop9 = 0,0,0,0,0,0,0,0,0
for x in xrange(0,len(derp)):
    if derp[x][7].text == 'The Pacific':
        pop1 = pop1 + derp[x][8]
    if derp[x][7].text == 'The North Pacific':
        pop2 = pop2 + derp[x][8]
    if derp[x][7].text == 'The South Pacific':
        pop3 = pop3 + derp[x][8]
    if derp[x][7].text == 'The East Pacific':
        pop4 = pop4 + derp[x][8]
    if derp[x][7].text == 'The West Pacific':
        pop5 = pop5 + derp[x][8]
    if derp[x][7].text == 'The Rejected Realms':
        pop6 = pop6 + derp[x][8]
    if derp[x][7].text == 'Balder':
        pop7 = pop7 + derp[x][8]
    if derp[x][7].text == 'Osiris':
        pop8 = pop8 + derp[x][8]
    if derp[x][7].text == 'Lazarus':
        pop9 = pop9 + derp[x][8]
print pop1, 'The Pacific'
print pop2, 'The North Pacific'
print pop3, 'The South Pacific'
print pop4, 'The East Pacific'
print pop5, 'The West Pacific'
print pop6, 'The Rejected Realms'
print pop7, 'Balder'
print pop8, 'Osiris'
print pop9, 'Lazarus'
print pop1+pop2+pop3+pop4+pop5+pop6+pop7+pop8+pop9, 'Total'
os.system('pause')
os.system('pause')
os.system('pause')
Title: Re: Python
Post by: vh on November 27, 2012, 07:55:05 PM
OMG THIS IS THE FIRST significant (if you call 30 lines significant) piece of code that has ever run perfectly on the first try with no issues i am so happy. now going to run it on the 5.5 million line daily data dump and hope it works equally well
Title: Re: Python
Post by: vh on November 27, 2012, 07:55:46 PM
this python topic: me talking to myself. if anyone else reads this reply please reply to it so i know this topic hasn't just become a notepad for myself
Title: Re: Python
Post by: vh on November 27, 2012, 08:08:39 PM
two erros in the above program, which were forgetting the .text and to int() the entire thing
Title: Re: Python
Post by: vh on November 27, 2012, 08:08:50 PM
fixed version

Code: [Select]
import os
from lxml import etree
derp = (etree.parse(open('nations.xml ','r'))).getroot()
pop1, pop2, pop3, pop4, pop5, pop6, pop7, pop8, pop9 = 0,0,0,0,0,0,0,0,0
for x in xrange(0,len(derp)):
    if derp[x][7].text == 'The Pacific':
        pop1 = pop1 + int(derp[x][8].text)
    if derp[x][7].text == 'The North Pacific':
        pop2 = pop2 + int(derp[x][8].text)
    if derp[x][7].text == 'The South Pacific':
        pop3 = pop3 + int(derp[x][8].text)
    if derp[x][7].text == 'The East Pacific':
        pop4 = pop4 + int(derp[x][8].text)
    if derp[x][7].text == 'The West Pacific':
        pop5 = pop5 + int(derp[x][8].text)
    if derp[x][7].text == 'The Rejected Realms':
        pop6 = pop6 + int(derp[x][8].text)
    if derp[x][7].text == 'Balder':
        pop7 = pop7 + int(derp[x][8].text)
    if derp[x][7].text == 'Osiris':
        pop8 = pop8 + int(derp[x][8].text)
    if derp[x][7].text == 'Lazarus':
        pop9 = pop9 + int(derp[x][8].text)
print pop1, 'The Pacific'
print pop2, 'The North Pacific'
print pop3, 'The South Pacific'
print pop4, 'The East Pacific'
print pop5, 'The West Pacific'
print pop6, 'The Rejected Realms'
print pop7, 'Balder'
print pop8, 'Osiris'
print pop9, 'Lazarus'
print pop1+pop2+pop3+pop4+pop5+pop6+pop7+pop8+pop9, 'Total'
os.system('pause')
os.system('pause')
os.system('pause')
Title: Re: Python
Post by: atomic7732 on November 27, 2012, 08:42:34 PM
this python topic: me talking to myself. if anyone else reads this reply please reply to it so i know this topic hasn't just become a notepad for myself
I read it. So the program above finds out the population of a region?
Title: Re: Python
Post by: vh on November 27, 2012, 08:47:24 PM
yeah, based on the nations.xml daily dump.
Title: Re: Python
Post by: blotz on November 28, 2012, 05:08:09 AM
i have reeded it
Title: Re: Python
Post by: vh on November 28, 2012, 02:02:43 PM
well it turns out that the code can't load the entire 5.5 million line xml file at once so i manually split the file into 6 million line chunks. the code runs through each one. I also optimized the code and reduced the amount of time needed by looking through the region.xml file for that day which i also downloaded. since nations are grouped by regions, i can search put region if statements in the order that they appear in the xml file to save time. also i put a counter in there that causes the program to ignore the if statement if all the nations in that region have already been counted.

it took about 3 hours to go through 1.1 million lines with my previous script, lets see about this one.

Code: [Select]
import os
import time
start = time.time()
from lxml import etree
p1,p2,p3,p4,p5,p6,p7,p8,p9 = 0,0,0,0,0,0,0,0,0
pop1, pop2, pop3, pop4, pop5, pop6, pop7, pop8, pop9 = 0,0,0,0,0,0,0,0,0
def count():
    global p1,p2,p3,p4,p5,p6,p7,p8,p9,pop1,pop2,pop3,pop4,pop5,pop6,pop7,pop8,pop9,derp
    for x in xrange(0,len(derp)):
        if p2 < 5590 and derp[x][7].text == 'The North Pacific':
            pop2 = pop2 + int(derp[x][8].text)
            p2 = p2 + 2
        elif p4 < 5100 and derp[x][7].text == 'The East Pacific':
            pop4 = pop4 + int(derp[x][8].text)
            p4 = p4 + 4
        elif p5 < 4929 and derp[x][7].text == 'The West Pacific':
            pop5 = pop5 + int(derp[x][8].text)
            p5 = p5 + 5
        elif p9 < 3299 and derp[x][7].text == 'Lazarus':
            pop9 = pop9 + int(derp[x][8].text)
            p9 = p9 + 9
        elif p1 < 4928 and derp[x][7].text == 'The Pacific':
            pop1 = pop1 + int(derp[x][8].text)
            p1 = p1 + 1
        elif p8 < 2774 and derp[x][7].text == 'Osiris':
            pop8 = pop8 + int(derp[x][8].text)
            p8 = p8 + 8
        elif p3 < 4963 and derp[x][7].text == 'The South Pacific':
            pop3 = pop3 + int(derp[x][8].text)
            p3 = p3 + 3
        elif p6 < 1424 and derp[x][7].text == 'The Rejected Realms':
            pop6 = pop6 + int(derp[x][8].text)
            p6 = p6 + 6
        elif p7 < 2779 and derp[x][7].text == 'Balder':
            pop7 = pop7 + int(derp[x][8].text)
            p7 = p7 + 7
        print pop2/1000,pop4/1000,pop5/1000,pop9/1000,pop1/1000,pop8/1000,pop3/1000,pop6/1000,pop7/1000
for x in xrange(1,7):
    filename = 'nations'+str(x)+'.xml'
    herp = open(filename, 'r')
    derp = (etree.parse(herp)).getroot()
    herp.close()
    count()
print pop1, 'The Pacific'
print pop2, 'The North Pacific'
print pop3, 'The South Pacific'
print pop4, 'The East Pacific'
print pop5, 'The West Pacific'
print pop6, 'The Rejected Realms'
print pop7, 'Balder'
print pop8, 'Osiris'
print pop9, 'Lazarus'
print pop1+pop2+pop3+pop4+pop5+pop6+pop7+pop8+pop9, 'Total'
print 'time', time.time()-start
derp = None
os.system('pause')
os.system('pause')
os.system('pause')
/me congratulates self on nifty for loop that runs through each file automatically.
Title: Re: Python
Post by: vh on November 28, 2012, 03:02:36 PM
revised version:

Code: [Select]
import os
import time
start = time.time()
from lxml import etree
p1,p2,p3,p4,p5,p6,p7,p8,p9 = 0,0,0,0,0,0,0,0,0
pop1, pop2, pop3, pop4, pop5, pop6, pop7, pop8, pop9 = 0,0,0,0,0,0,0,0,0
def count(p):
    global p1,p2,p3,p4,p5,p6,p7,p8,p9,pop1,pop2,pop3,pop4,pop5,pop6,pop7,pop8,pop9,derp
    for x in xrange(0,len(derp)):
        if p2 < 5590 and derp[x][7].text == 'The North Pacific':
            pop2 = pop2 + int(derp[x][8].text)
            p2 = p2 + 2
        elif p4 < 5100 and derp[x][7].text == 'The East Pacific':
            pop4 = pop4 + int(derp[x][8].text)
            p4 = p4 + 4
        elif p5 < 4929 and derp[x][7].text == 'The West Pacific':
            pop5 = pop5 + int(derp[x][8].text)
            p5 = p5 + 5
        elif p6 < 1424 and derp[x][7].text == 'The Rejected Realms':
            pop6 = pop6 + int(derp[x][8].text)
            p6 = p6 + 6
        elif p9 < 3299 and derp[x][7].text == 'Lazarus':
            pop9 = pop9 + int(derp[x][8].text)
            p9 = p9 + 9
        elif p1 < 4928 and derp[x][7].text == 'The Pacific':
            pop1 = pop1 + int(derp[x][8].text)
            p1 = p1 + 1
        elif p8 < 2774 and derp[x][7].text == 'Osiris':
            pop8 = pop8 + int(derp[x][8].text)
            p8 = p8 + 8
        elif p3 < 4963 and derp[x][7].text == 'The South Pacific':
            pop3 = pop3 + int(derp[x][8].text)
            p3 = p3 + 3
        elif p7 < 2779 and derp[x][7].text == 'Balder':
            pop7 = pop7 + int(derp[x][8].text)
            p7 = p7 + 7
        print pop2/1000,pop4/1000,pop5/1000,pop6/1000,pop9/1000,pop1/1000,pop8/1000,pop3/1000,pop7/1000, p
for x in xrange(1,7):
    filename = 'nations'+str(x)+'.xml'
    herp = open(filename, 'r')
    derp = (etree.parse(herp)).getroot()
    herp.close()
    p = x
    count(p)
print pop1, 'The Pacific'
print pop2, 'The North Pacific'
print pop3, 'The South Pacific'
print pop4, 'The East Pacific'
print pop5, 'The West Pacific'
print pop6, 'The Rejected Realms'
print pop7, 'Balder'
print pop8, 'Osiris'
print pop9, 'Lazarus'
print pop1+pop2+pop3+pop4+pop5+pop6+pop7+pop8+pop9, 'Total'
print 'time', time.time()-start
derp = None
os.system('pause')
os.system('pause')
os.system('pause')
Title: Re: Python
Post by: vh on November 28, 2012, 03:31:02 PM
well fail, nsdossier already lists this info. edit: ah-ha, it can't process regions with 2k+ nations i win!
Title: Re: Python
Post by: vh on November 28, 2012, 03:32:22 PM
welp, after removing all bugs, i have started the first test run
Title: Re: Python
Post by: vh on November 28, 2012, 03:39:09 PM
absolution ns tracker seems to have gone down
Title: Re: Python
Post by: vh on November 28, 2012, 03:39:17 PM
now on part 2/6
Title: Re: Python
Post by: vh on November 28, 2012, 03:58:17 PM
damnit, i ran it, and it came up with a bunch of wrong answers
Title: Re: Python
Post by: vh on November 28, 2012, 07:37:12 PM
well its not working so i've simplified it to test one region at a time and see what was wrong.
Title: Re: Python
Post by: blotz on November 28, 2012, 08:04:25 PM
how long does it take for 1 nation about? and how many nations total?
Title: Re: Python
Post by: vh on November 28, 2012, 08:09:13 PM
>nations?

i'm adding up regions
Title: Re: Python
Post by: vh on December 01, 2012, 03:28:08 AM
this is pretty epic

Code: [Select]
import os
import itertools as it
import networkx as nx
import matplotlib.pyplot as plt
derp = list(range(100))
def findsubsets(s,m):
    return list(set(it.combinations(s,m)))
herp = findsubsets(derp,2)
for list in herp:
    list = tuple(list)   
G=nx.Graph()
G.add_nodes_from(derp)
G.add_edges_from(herp)
nx.draw_spring(G)
plt.show()
Title: Re: Python
Post by: vh on December 01, 2012, 04:27:44 AM
WIP, this prints out a list of all the embassy connections in nationstates

Code: [Select]
import os
import itertools as it
import networkx as nx
import matplotlib.pyplot as plt
from lxml import etree
herp = open('regions.xml', 'r')
derp = (etree.parse(herp)).getroot()
herp.close()
embassylist = []
for element in derp:
    if len(element[9]) > 0:
        name = element[0].text
        length = len(element[9])
        for x in xrange(0,length):
            emb = element[9][x].text
            perp = [name, emb]
            embassylist.append(tuple(perp))
dictsort = {}
for x in embassylist:
    dictsort[x]=1
embassylist = list(dictsort.keys())
print len(embassylist)
print embassylist
Title: Re: Python
Post by: Darvince on December 01, 2012, 10:05:37 AM
holykute
Title: Re: Python
Post by: vh on December 07, 2012, 12:55:27 PM
problem: networkx's graph layout doesn't work well -- all nodes are locked on the origin for some reason

plan:

first use lxml to parse the nationstates region files
use networkx to create a graph with nodes as regions and edges as embassies
use networkx to convert the thing to graphml
since graphml is in xml format, somehow save it.
using jython, open graphml file
somehow import it into gephi and display it.
Title: Re: Python
Post by: blotz on December 08, 2012, 12:14:24 PM
when will you update baitech? i am getting
BORED OUT OF MY

MIND!!!!!!!!!!!
Title: Re: Python
Post by: vh on December 12, 2012, 01:03:59 PM
hmm i've got python to trim out the [time] thing in the chatlog easily, but how to find spam and filter that out? i don't want darvince saying j8453hjfg3ovrrtes in the wordle 1 million times
Title: Re: Python
Post by: Darvince on December 12, 2012, 04:10:41 PM
<+what about usernames>
Title: Re: Python
Post by: vh on December 12, 2012, 04:23:27 PM
i can split at the '>'
Title: Re: Python
Post by: vh on January 11, 2013, 08:52:57 PM
derp
Title: Re: Python
Post by: atomic7732 on February 08, 2013, 07:03:36 PM
senary converter

dec to base/base to dec converter
Title: Re: Python
Post by: blotz on February 08, 2013, 07:52:46 PM
*downloads so it doesn't say 0 downloaded times*
hmm what is dec and base?
Title: Re: Python
Post by: atomic7732 on February 08, 2013, 09:06:24 PM
decimal

base
Title: Re: Python
Post by: vh on February 08, 2013, 09:09:38 PM
ok so i was interested in how nations would be split into two alliance groups like the axis and allied in ww2 or something. so i wrote a script that generated optimal alliances based on relations data from here: https://docs.google.com/spreadsheet/ccc?key=0AqXNpALRcpv9dEptQVhHZWVNdlVqWTlDMHB2bUpUU0E

if all the nations are put into one alliance, the integrity value is 0, so it could break apart easily. using python i ran through all the 256 combinations and found the optimal sorting of

alliance 1: blaland + aeridani + ska + kallisto
with an integrity value of 266

alliance 2: aeridani + bielosia + ethanthova + kaeshar
with an integrity value of 218

integrity value is basically just all the relations of all the nations with all the other nations in the same alliance combined.

this uses brute-force search but it takes like under a millisecond so i don't even care.

if you want to run a test with modified relations you can edit the file yourself or ask if you have any questions
Title: Re: Python
Post by: Bla on February 09, 2013, 03:59:12 AM
It would be cool if you could make something extracting data points from selected nations' economy graphs and using it for some economic model like "Blaist NS GDP calculation".

http://universesandbox.com/forum/index.php/topic,5461.msg77727.html#msg77727 (http://universesandbox.com/forum/index.php/topic,5461.msg77727.html#msg77727)
Title: Re: Python
Post by: vh on February 09, 2013, 04:42:50 AM
it would. i'm trying something with that right now...^
Title: Re: Python
Post by: vh on February 09, 2013, 05:46:03 AM
well i made something that prints out numbers to make it easier to input into your economic model. it could be adjusted to print out into a text file where you could copy and paste straight into the spreadsheet cells directly. you should mess around with the files to adjust which nations are extracted or not. also you should leave the time.sleep(10) in because there's a rate limit of 10 requests per minute on ns. (so you could lower it to 6 or something i guess)

oh and if you change the display value to too high it'll break

luckily since ns keeps the economy data for like several months you can just run it once in a long while and plug
Title: Re: Python
Post by: Bla on February 09, 2013, 07:35:43 AM
Nice, on the graph page it stores all the data points though. If there was a way to extract that it would be nicer.

Atm I can't edit Python code it seems, my IDLE must be broken or something. Idk.
Title: Re: Python
Post by: vh on February 09, 2013, 07:45:23 AM
notepad also works
and yes, the script takes the numbers from the data from the graph page. i don't get what you want to 'extract' exactly.
Title: Re: Python
Post by: Bla on February 09, 2013, 07:49:55 AM
Got IDLE to work now.

From
luckily since ns keeps the economy data for like several months you can just run it once in a long while and plug
it just sounded like old graph data was deleted from whereever you got it from. I see that's not the case.

If you put this thing in
    if display > 0:
        for x in range(2,2+display):
            print str(content[-x]),
            time.sleep(0.05)
    print '\n'
you can see that it crashes when it reaches the amount of days the nation has existed. If there were a way to extract that number and ensure that "display" wouldn't be used if it were higher...

If there is a method to count commas in the "content" data, that should work.
Title: Re: Python
Post by: vh on February 09, 2013, 08:13:56 AM
content is a list so len(content) will tell you the amount of values stored and you can add an if statement to prevent that from happening.
Title: Re: Python
Post by: blotz on February 09, 2013, 08:15:22 AM
vh is off. a python expert
Title: Re: Python
Post by: Bla on February 09, 2013, 08:30:32 AM
I made it automatically extract all the numbers by using the comma count method.
Title: Re: Python
Post by: vh on February 09, 2013, 08:43:38 AM
instead of doing
Code: [Select]
    display = int(str(content).count(",")) #Number of commas in data.
    print element+': '+str(content[-1])
    print 'previous days',
    if display > 0:
        for x in range(2,2+display):
            print str(content[-x]),
    print '\n'

maybe a better way would be

Code: [Select]
    print element+': '+str(content[-1])
    print 'previous days',
    for int in content:
        print str(int),
    print '\n'
because you're going to iterate over all the stuff in content anyways
Title: Re: Python
Post by: blotz on February 09, 2013, 08:53:23 AM
i was going spend forever, but then i used python's calculator!
Title: Re: Python
Post by: Bla on February 09, 2013, 08:56:08 AM
Ok.
Title: Re: Python
Post by: blotz on February 09, 2013, 09:02:40 AM
hmm...

okay, long conversation with kip and it turned out that i read the problem wrong.


[11:02] <+Gunner55555> i read the question wrong
[11:02] <+Gunner55555> ops


so 3 to the power of negative 2 would be
3**-2
right?"



so how do you make it so that the calculator does not round? because
684/41 does not equal 683/41
Title: Re: Python
Post by: atomic7732 on February 09, 2013, 10:12:54 AM
it's not a 'calculator'

You need to use non-integers (684.0/41.0)
Title: Re: Python
Post by: blotz on February 09, 2013, 12:57:49 PM
ok.
but i mainly use it as a calculator, so
and, it saves a lot more time than typing 'interpeter'
Title: Re: Python
Post by: FiahOwl on February 20, 2013, 07:20:04 PM
nsfw
Title: Re: Python
Post by: FiahOwl on February 20, 2013, 08:06:48 PM
final update for tonight
Title: Re: Python
Post by: atomic7732 on February 20, 2013, 08:25:29 PM
putting this here because if I need it in the future I'm more likely to find it here than in the NS map and roleplay

Soleani Word Generator

Disclaimer: Do not use this for Soleani words. I am very picky about what is a word these are all POTENTIAL words, though not all words are canon. Some of them suck. Badly. Ask atomic before use.

this code is free to use if you want to generate words with a similar structure

In case you find yourself running over your tounge this might help... or make it harder idk:

j is an english y consonant sound (like in scandinavian languages)
and ii is eye-eh
ai is eye
ei is ay
ie is ee
ae is another ay
Title: Re: Python
Post by: vh on February 20, 2013, 08:45:08 PM
added more strings.

now prints long and short words
Title: Re: Python
Post by: atomic7732 on February 21, 2013, 04:47:45 PM
gives rectangular coordinates that draw a circle
outputs at circle_draw.txt
Title: Re: Python
Post by: atomic7732 on February 25, 2013, 09:34:00 PM
Code: [Select]
from Tkinter import *

value = " "

class App:

def __init__(self, master):

frame = Frame(master)
frame.pack()

self.button = Button(frame, text="delete", fg="red", command=self.delete)
self.button.grid(row=1, column=0)

self.w = Canvas(frame, height=300, width=600)
self.w.grid(row=0, column=0, columnspan=2)

self.hi_there = Button(frame, text="Submit", command=self.update)
self.hi_there.grid(row=1, column=1)

self.input = Entry(frame)
self.input.grid(row=2, column=0, columnspan=2)

def update(self):
value = self.input.get()

value = value.split(" ") #how to put in XXX YYY TEXT
#load positions from a text file and put it in a picture on the canvas
#instead of value[2] paste an image
#be able to pan and scale the picture in the canvas
#convert an input of lat long to x y on the canvas

id = self.w.create_text(value[0], value[1], text=value[2])
print "Generated text %d." % id

def delete(self):
self.w.delete(ALL)

root = Tk()

app = App(root)

root.mainloop()

for ircclient-making kips
Title: Re: Python
Post by: blotz on February 26, 2013, 05:34:31 AM
Tkinter?
Title: Re: Python
Post by: atomic7732 on February 26, 2013, 03:35:38 PM
content of this message: http://pastebin.com/U99v45h0 (http://pastebin.com/U99v45h0)
Title: Re: Python
Post by: blotz on February 26, 2013, 03:51:38 PM
woah did you learn that by tutorials or by asking kip?
Title: Re: Python
Post by: blotz on February 26, 2013, 04:06:03 PM
/// dump http://ubuntuforums.org/showthread.php?t=1493702 (http://ubuntuforums.org/showthread.php?t=1493702)


#!/usr/bin/env python

import sys
import socket
import string

HOST="irc.freenode.net"
PORT=6667
NICK="asdf"
IDENT="asdf"
REALNAME="asdf"
CHAN="#asdf"
readbuffer=""

s=socket.socket( )
s.connect((HOST, PORT))
s.send("NICK %s\r\n" % NICK)
s.send("USER %s %s bla :%s\r\n" % (IDENT, HOST, REALNAME))
s.send("JOIN :%s\r\n" % CHAN)
s.send("PRIVMSG %s :%s\r\n" % (CHAN, "Hello There!"))
s.send("PRIVMSG %s :%s\r\n" % (CHAN, "I am a bot"))

while 1:
    readbuffer=readbuffer+s.recv(1024)
    temp=string.split(readbuffer, "\n")
    readbuffer=temp.pop( )

    for line in temp:
        line=string.rstrip(line)
        line=string.split(line)

        if(line[0]=="PING"):
            s.send("PONG %s\r\n" % line[1])
Title: Re: Python
Post by: blotz on February 26, 2013, 04:07:35 PM
dump http://www.madsoft.org/2008/05/09/easily-create-irc-bots-in-python-with-pybotlib/ (http://www.madsoft.org/2008/05/09/easily-create-irc-bots-in-python-with-pybotlib/)
Title: Re: Python
Post by: atomic7732 on February 26, 2013, 04:21:41 PM
woah did you learn that by tutorials or by asking kip?
I used a bot tutorial and used prior python knowledge and googling for the rest. Also I forgot it needs three imports which I will add when I get home.
Title: Re: Python
Post by: blotz on February 26, 2013, 05:11:20 PM
soket sys and string right?
Title: Re: Python
Post by: atomic7732 on February 26, 2013, 05:44:11 PM
import socket
import random
import urllib2
Title: Re: Python
Post by: blotz on February 26, 2013, 05:55:52 PM
so do you make the stuff you're importing (modules, i tihnk) or is it already in python or do you download it off the internet?
Title: Re: Python
Post by: atomic7732 on February 26, 2013, 08:13:32 PM
modules yes

some you have to download but the creator will tell you if you need to, most are built-in
Title: Re: Python
Post by: vh on February 28, 2013, 05:43:50 PM
eu3 province generator

http://pastebin.com/aNMLARVK (http://pastebin.com/aNMLARVK)

it just prints out strings to the terminal and doesn't have a history section yet but i'll fix that
Title: Re: Python
Post by: vh on March 07, 2013, 03:21:19 PM
alliance (which is a list) contains lists of tags. this script prints out all possible alliances between the members of each list.

Code: [Select]

alliances = []

alliance1 = ['tag','doo','poo']

alliance2 =['forever','alone']

alliances.append(alliance1)
alliances.append(alliance2)


def create_alliance(tag1,tag2):
    return 'alliance = {' +'\n'+'\t'+'first = ' + tag1 + '\n'+'\t'+'second = ' + tag2+'\n'+'\t'+'start_date = 1399.1.1'+'\n'+'\t'+'end_date = 1822.1.1'+'\n'+'}'

for list in alliances:
    alllist = []
    for x in xrange(0,len(list)):
        for y in xrange(0,len(list)):
            if x != y:
                temp = [x,y]
                temp.sort()
                alllist.append(tuple(temp))
    for element in alllist:
        print create_alliance(list[element[0]],list[element[1]])
Title: Re: Python
Post by: vh on March 07, 2013, 03:34:40 PM
til if you have a list with type1, type2, and type3 objects and you do
for type1 in list:
    print list
it'll print all the items of any type
Title: Re: Python
Post by: blotz on March 07, 2013, 04:10:57 PM
write a

<title of program> for n00bs

guide
Title: Re: Python
Post by: atomic7732 on March 11, 2013, 04:37:06 PM
a thing that i will use in the future

updated code for kips:

Code: [Select]
def char_replace(syl, fulltxt, rep):
j = 0
for i in fulltxt:
if fulltxt[j] == syl:
fulltxt[j] = rep
else:
pass
j += 1
return fulltxt

def conv_to_out(txt):
out = ""
j = 0
for i in txt:
out += i
return out

text = raw_input("Enter text: ")
text = text.split(' ')

#things to change
text = char_replace('ka', text, unichr(57344))
# most likely always the last 2
text = char_replace(' ', text, '')
text = char_replace('/', text, ' ')
text = conv_to_out(text)
text = text.encode('utf-8')

#print text

f = open('pony.txt','w+b')
f.write(text)
Title: Re: Python
Post by: atomic7732 on March 11, 2013, 06:03:37 PM
wow 5 characters what a pro
Title: Re: Python
Post by: atomic7732 on March 12, 2013, 05:25:05 PM
n-body 2d gravity simulator in the works

Code: [Select]
g = 6.67384
list = []

def calc_grav(m1, m2, r):
f = g*((m1*m2)/r**2)
return f

class object:
lx = 0
ly = 0
lr = 0
lt = 0
mass = 0
vx = 0
vy = 0
vr = 0
vt = 0
def __init__(self, x, y, r, t, m, vx, vy, vr, vt):
self.lx = x
self.ly = y
self.lr = r
self.lt = t
self.mass = m
self.vx = vx
self.vy = vy
self.vr = vr
self.vt = vt

#generate two test objects
sun = object(0.0, 0.0, 0.0, 0.0, 1000.0, 0.0, 0.0, 0.0, 0.0)
pl1 = object(1000.0, 0.0, 1000.0, 0.0, 10.0, 0.0, 40.0, 40.0, 90.0)
pl2 = object(2000.0, 0.0, 2000.0, 0.0, 15.0, 0.0, 15.0, 15.0, 90.0)

list.append(sun)
list.append(pl1)
list.append(pl2)

#calculate distance
#insert method thing here
d = sun.lx - pl1.lx #temporary

#calculate gravitational force
i = 0
combos = []
for o in list:
j = 0
for p in list:
# print "%s, %s" % (i, j)
if i >= j:
pass
else:
print calc_grav(o.mass, p.mass, d)
j += 1
i += 1
Title: Re: Python
Post by: vh on March 16, 2013, 03:41:21 PM
sfdjkasl
Title: Re: Python
Post by: blotz on March 16, 2013, 04:14:18 PM
i spy redit
Title: Re: Python
Post by: blotz on March 27, 2013, 06:39:19 AM
damn i lost like 6 links to ircbots
now i have to look them up again
Title: Re: Python
Post by: blotz on March 27, 2013, 06:46:04 AM
what is my port
Title: Re: Python
Post by: blotz on March 27, 2013, 07:21:49 AM
help

while 1: # Be careful with these! it might send you to an infinite loop
  ircmsg = ircsock.recv(2048) # receive data from the server
  ircmsg = ircmsg.strip('\n\r') # removing any unnecessary linebreaks.
  print(ircmsg) # Here we print what's coming from the server

  if ircmsg.find(":Hello "+ botnick) != -1: # If we can find "Hello Mybot" it will call the function hello()
    hello()

  if ircmsg.find("PING :") != -1: # if the server pings us then we've got to respond!
    ping()
   
   if data.find ( 'PING' ) != -1:
      irc.send ( 'PONG ' + data.split() [ 1 ] + '\r\n' )
   if data.find ( '!kolok quit' ) != -1:
      irc.send ( 'PRIVMSG ##Universesandbox :Fine, if you dont want me\r\n' )
      irc.send ( 'QUIT\r\n' )
Title: Re: Python
Post by: atomic7732 on March 27, 2013, 07:42:23 AM
the indents are spaces either indent with spaces or change them all to tabs
Title: Re: Python
Post by: blotz on March 27, 2013, 07:48:23 AM
so do i like tab after the colon or??
Title: Re: Python
Post by: atomic7732 on March 27, 2013, 08:04:07 AM
everywhere there is an indent, remove it, and tab
Title: Re: Python
Post by: vh on March 28, 2013, 07:45:19 PM
it's a prototype for god's sake!
Title: Re: Python
Post by: FiahOwl on March 28, 2013, 07:51:37 PM
cute
Title: Re: Python
Post by: atomic7732 on March 28, 2013, 09:42:03 PM
wow that's amazing
Title: Re: Python
Post by: Hellpotatoe on March 29, 2013, 03:09:40 AM
wow that's amazing
Title: Re: Python
Post by: vh on March 29, 2013, 04:49:40 AM
wow that's amazing
why did that sound sarcastic
Title: Re: Python
Post by: vh on March 29, 2013, 06:14:25 AM
i'm done.

the image takes a few minutes to generate. (a bit less than 10)

the number of provinces increases the time needed linearly
the map size increases the time quadratically, but changing the map size increases the provinces too which means it's really n^3
Title: Re: Python
Post by: atomic7732 on March 29, 2013, 06:41:31 AM
wow that's amazing
why did that sound sarcastic
probably because you always percieve my sarcasm as non-sarcastic

because that wasn't sarcasm
Title: Re: Python
Post by: vh on March 29, 2013, 06:57:14 AM
here's an image that was generated and i resized to 10%
Title: Re: Python
Post by: blotz on March 29, 2013, 07:04:46 AM
ispythecolorsofbla
Title: Re: Python
Post by: atomic7732 on March 29, 2013, 07:12:34 AM
that works

i will work on the file generation this weekend

you might have to remind me, and not today, on saturday please
Title: Re: Python
Post by: karakris on March 29, 2013, 09:15:57 AM
Lame Curves

Circular Arcs are just ONE Form of the Lame Curves.

I "Invented" these in 1992 - but found out two weeks back, that they had already been invented
Boo Hoo :( :( :( :(.

To generate ONE Quadrant - where X and Y are both Positive with respect to the "centre" of the figure ( 0,0 ).
And using a "normalised" Figure - 1 Wide, 1 High.

Pythagorus gives us that any point on a Circular sweep will be given by Y = ( 1^2 -  x^2 )^0.5.
Where 1 is the Hypotenuse ( Radius ).

To alter the "normalised" figure to an Oval, the Values of XScale and YScale should be different.
In creasing both Xscale and Yscale by the same amount gives simply a larger figure.   

For X = 0 to 1 Step 0.000001
Y = SQRT ( 1 - X^2 ):
XPlot = X*Xscale: YPlot = Y*YScale:
Plot Xplot, YPlot:
Next X

For the Full Circle, we need to "handle" Negative X and Y Values.

So - we get -

For X = 0 to 1 Step 0.000001
Y = SQRT ( ABS ( 1 - X^2 ):
XPlot = X*Xscale: YPlot = Y*YScale:
Plot Xplot, YPlot:
Next X
For X = 0 to 1 Step 0.000001
Y = SQRT ( ABS ( X^2 - 1 ):
XPlot = X*Xscale: YPlot = Y*-YScale:
Plot Xplot, YPlot:
Next X
For X = 0 to 1 Step 0.000001
Y = SQRT ( ( 1 - X^2 ):
XPlot = X*-Xscale: YPlot = Y*-YScale:
Plot Xplot, YPlot:
Next X
For X = 0 to 1 Step 0.000001
Y = SQRT ( ABS ( X^2 - 1 ):
XPlot = X*-Xscale: YPlot = Y*YScale:
Plot Xplot, YPlot:
Next X

Now - What use is that ??

Well - for a CIRCLE - Not a LOT.

However - the critical change is if we place the Circle in "distorted" 3-D Space.

If instead of SQRT ( Square Root ) and ^2 ( Square ) which are true for a Circle - we substitute
The "Power" of 1/N  and the "Power" of N.
Then strange things happen to our curved figure.

The "program" for the First Quadrant then becomes -

For X = 0 to 1 Step 0.000001
Y = ( 1 - X^N )^1/N:
XPlot = X*Xscale: YPlot = Y*YScale:
Plot Xplot, YPlot:
Next X

As N is reduced to a little less than 2 - the curves start to "flatten" in each Quadrant, although the Rate of Change of Curvature remains consistent.  They also become a little "sharper" at the meeting of Quadrants
As N is increased to a liitle more than 2 - the curves become "sharper"in each Quadrant, although the Rate of change of Curvature remains consistent.  They also become "flatter" at the meeting of Quadrants.

The Lame Curves are ALWAYS Transition Curves - with no points of sudden acceleration or sudden develeration of curvature.
At modest values of N - they could be used to lay out Roads or the curves of Railway Track.

How about bigger changes in the value of N -

At exactly N =1 - we get a diamond shape, a square rotated by 45 degrees.

At truly Massive values of N ( up to 10^30 ) - we get an almost Square, with very slightlty curved sides asnd nearly sharp, curved corners.

At truly Miniscule values of N ( down to 1/10^30 ) - we get an almost cross ( or crux ) - except that the middle is slighty fatter than the intersection of two straight lines, it actually comprises a very slightly curving line in each Quadrant, which turns through 90 degrees in an incredibly tight curve, very near to the centre.

A wide range of these Curves can be used for Transition Curves with different "orders" of Curvature, in a number of applications.

For example - to create a range of "Ship Curves" for laying-out a Scale Drawing of a Ship's Hull - the Values of Xscale ( length ) and YScale ( half beam ) can be set to the desired values for the Drawing.
By changing the values of N through a range of values the - both "convex" and "concave" transition curves or useful Ship Curves can be generated.

Okay - this all sounds like fancy theory.
However - I have tried this, and it does work.

I Ran this as a Program, many times in 1992 on the Mainframe Computer at Thames Polytechnic.
With Step Values as small as 1/10^12 and values of 'N' from 10^40 down to 1/10^40 -
in both directions ( massive and miniscule values of 'N' ).
As I have already implied - Values of 'N' ( the "order" of the Curves ) between 10 and 1/10 are more useful than the more extreme examples.

I have also Run this as a Program on my BBC Microcomputer - although the range of values of 'N' and the maximum number of Steps had to be reduced seriously.

In all cases, the Program worked exactly as Predicted, and as Described above.                 
 


   

 
Title: Re: Python
Post by: karakris on March 29, 2013, 09:18:45 AM
Re: A Random Word Generator -

One of those would immensely useful.

I am running a Sci Fi Game - some Human Star Systems, some Alien Star Systems.
The Names of Planets, Continents, Cities all have to be "Invented" in many cases -
a Random Word Generator may help makr my Job easier.   
Title: Re: Python
Post by: vh on March 29, 2013, 11:48:50 AM
cute

the wikipedia page on the curves you described in general is here

http://en.wikipedia.org/wiki/Superellipse (http://en.wikipedia.org/wiki/Superellipse)
Title: Re: Python
Post by: FiahOwl on March 29, 2013, 12:08:55 PM
Now I'm not usually one to say this but, karakris you have waayyyyy too much time on your hands :P
Title: Re: Python
Post by: vh on March 29, 2013, 12:35:10 PM
don't we all
Title: Re: Python
Post by: Darvince on March 29, 2013, 01:22:04 PM
TIL god has a sake
Title: Re: Python
Post by: atomic7732 on March 29, 2013, 02:29:13 PM
Re: A Random Word Generator -

One of those would immensely useful.

I am running a Sci Fi Game - some Human Star Systems, some Alien Star Systems.
The Names of Planets, Continents, Cities all have to be "Invented" in many cases -
a Random Word Generator may help makr my Job easier.   
kip and I both made different generators but they only generate words based on our conlangs, if you could even call Kip's that
Title: Re: Python
Post by: vh on March 31, 2013, 02:50:12 PM
before
Title: Re: Python
Post by: vh on March 31, 2013, 02:50:52 PM
after
Title: Re: Python
Post by: blotz on March 31, 2013, 03:36:51 PM
ispythecolorsofbla
Title: Re: Python
Post by: atomic7732 on April 02, 2013, 09:56:50 PM
partially finished thing

i will probably do python all week because i do not productive on weekends at all
Title: Re: Python
Post by: vh on April 05, 2013, 11:22:03 PM
i fixed the memory error by splitting the gigabyte list into it's elements and pickling each

you can see all the times when the program crashed here, it's currently running smoothly

(http://i.snag.gy/VyncH.jpg)
Title: Re: Python
Post by: blotz on April 06, 2013, 01:39:53 AM
whats up with the red line
Title: Re: Python
Post by: atomic7732 on April 10, 2013, 10:18:33 AM
Code: [Select]
import random
import math

all = []

class particle:
x = 0.0
y = 0.0
def __init__(self, x, y):
self.x = x
self.y = y

def distance(x1, x2, y1, y2)
x = math.fabs(x2 - x1)
y = math.fabs(y2 - y1)
math.hypot(x, y)

def interact(obj1, obj2):
force = 1/(distance(obj1.x, obj2.x, obj1.y, obj2.y) ** 2)
#find the direction both objects are going somehow and then make them attract
w = "%s\t%s\t\n" % () #bakjfdsjk
f.write(w)

n = int(raw_input("Number of particles: "))

for x in xrange(0,n):
all.append(particle(random.random()*7, random.random()*7))

i = 0
f = open('data.txt', 'w')
for x in all:
w = "%s\t%s\t%s\t" % (i, x.x, x.y)
f.write(w)
i += 1

f.write("\n")

i = 0
for x in all:
j = 0
for y in all:
if i <= j:
interact(x, y)
else:
pass
j += 1
i += 1

f.close()

print "done"
stupid particle kind of like the stupid other simulator actually i stopped at the same point, finding out which direction the object are going using arccos/sin because that only spans from 0 to pi radians or -pi/2 to pi/2 would i just add pi to get the other object? and then which object is the one's value i am actually getting?
Title: Re: Python
Post by: vh on April 10, 2013, 12:15:32 PM
i'm going to suggest not using trig because that is slow

an example on how i would figure out the force of b acting on a

keep everything in component form vectors
so if you have bodies A and B

Av is the velocity vector of a. something like <0,0>.

force = mass*constant/distance^2
don't actually compute the distance by square rooting because you'll square it anyways in the end
if the position of A is <ax,ay> and the position of B is <bx,by>, then find the offset <bx-ax,by-ay>
then suppose the mass * constant = 8 and distance = 4, so force is 2

multiply the offset <bx-ax,by-ay> by 2 to get the force vector called Bf

force = mass*distance/time^2
divide by mass
acceleration = distance/time^2
multiply by time
velocity = distance/time

use the mass of A, the time is the length of your timestep

so Bf/mass*time = velocity

add the velocity vector to Av which is the velocity vector of object A

for every object you add their velocity vector to the velocity vector of A

then if you end up with the velocity vector <3,-2>, you move A right 3 units and down 2 units



Title: Re: Python
Post by: atomic7732 on April 10, 2013, 02:23:40 PM
I didn't get a chance to read the whole post yet, but I already have the force part down.
Title: Re: Python
Post by: vh on April 10, 2013, 03:16:01 PM
ok thats nice

although i wanted to note that you were finding the distance with math.hypot which uses a square root. since you're going to square the distance afterwards, you should probably not bother with the square root operation which takes a bit of time.
Title: Re: Python
Post by: atomic7732 on April 10, 2013, 03:28:37 PM
Ok all the post explained to me was what I already knew about simulating the stuff... and then you throw vectors in the last 3 lines. How do you suggest I do the vectors as I can't figure out the inverse trig functions and how that would work, and you say it'd be slow?
Title: Re: Python
Post by: vh on April 10, 2013, 03:59:00 PM
vector = [thing1,thing2]
Title: Re: Python
Post by: atomic7732 on April 10, 2013, 04:15:15 PM
I'm talking about you know, instead of using trig to get an angle and a magnitude (polar coordinates), how else you expect me to calculate where the thing is to move. Start from having the magnitude (distance calculated from acceleration and timestep).

Like... the part you skipped here:

for every object you add their velocity vector to the velocity vector of A

here

then if you end up with the velocity vector <3,-2>, you move A right 3 units and down 2 units
Title: Re: Python
Post by: vh on April 10, 2013, 04:18:40 PM
ok i was mistaken you actually have to calculate the distance

there are objects x and y

object x is at position  with mass 6 and a velocity of 0,5
object y is at position 5,-3 with mass 7 and a velocity of -1,-2
the gravitational constant is 2

calculating the effect
the force is (6+7)*2/((5-2)^2+(3--3)^2) = 0.5777....

the movement of x:
relative to x, object y is at 3, -6 (5-2,-3-3)
the magnitude is sqrt(45) from sqrt(3^2+-6^2), however we want to make it 0.5777 because that is the force
0.577.../sqrt(45) * (3,-6) gives us (0.2583, -0.5168)

pretend the time step is 5 units of time
we multiply by 5 because the force is sustained for that long
(1.2915, -2.583)
then divide by the mass of object x since we are calculating the movement of object x
(0.2152,-0.4305)
by dividing by mass we've converted force to acceleration since
f = ma
f/m = a
now multiply by the lenght of the time step again
(1.076, 2.153)
acceleration = velocity/time (as in meters per second per second)
so (1.076, 2.153) is the velocity of motion that object y causes to object x

since there are no other objects which gravitationally pull x
(0,5) + (1.076, 2.153) = (1.076, 7.153) is the current velocity of object x

add velocity to position (2,3)
(3.076, 10.153)

repeat for y


disclaimer: i haven't taken physics so i have no idea what i'm talking about this all comes from one week of vectors in math
Title: Re: Python
Post by: atomic7732 on April 10, 2013, 04:23:53 PM
yeah I think I'll just figure out the trig...
Title: Re: Python
Post by: vh on April 15, 2013, 05:53:43 PM
i have  dictionaries with the values of the dictionary keys being a list, and the keys are strings

i want to count how many objects i have in the lists combined

strategy 1:
sum = 0
for key in dict:
    sum += len(dict[key])
>gets result of around 120,000

strategy 2:
sum = 0
for key in dict:
    for object in dict[key]:
        sum += 1
>get a result of 76,000

wtf
Title: Re: Python
Post by: vh on April 15, 2013, 06:01:57 PM
wait actually that wasn't the problem, this is:


sum = 0
for key in dict:
    for object in dict[key]:
        sum += 1
>sum of 120,000

sum = 0
for key in dict:
    for object in dict[key]:
        sum += 1
        if something:
            delete from the list
>sum of 76000


ok i'm suspecting the deleting is screwing with the list
Title: Re: Python
Post by: vh on April 15, 2013, 06:07:26 PM
^it was i've fixed it
Title: Re: Python
Post by: vh on April 15, 2013, 06:11:32 PM
example of problem:
count = 0
derp = range(1000)
import random
for int in derp:
    count +=1
        if random.random() < 0.5:
            derp.remove(int)
print count
>>>667
thats not a thousand ponies, thats 667, and that's a problem >.<
Title: Re: Python
Post by: vh on April 17, 2013, 02:18:08 PM
.
Title: Re: Python
Post by: atomic7732 on May 06, 2013, 09:37:02 PM
idk if i posted this here but i need this

Code: [Select]
import math

g = 6.67384
list = []
gravity = []
thetas = []

def calc_grav(m1, m2, r):
f = g*((m1*m2)/r**2)
return f

def calc_rt(x1, y1, x2, y2):
x = x2 - x1
y = y2 - y1
c = math.sqrt(x**2 + y**2)
theta = math.degrees(math.acos(x/c))
return c, theta

class object:
lx = 0
ly = 0
lr = 0
lt = 0
mass = 0
vx = 0
vy = 0
vr = 0
vt = 0
def __init__(self, x, y, r, t, m, vx, vy, vr, vt):
self.lx = x
self.ly = y
self.lr = r
self.lt = t
self.mass = m
self.vx = vx
self.vy = vy
self.vr = vr
self.vt = vt

#generate two test objects
sun = object(0.0, 0.0, 0.0, 0.0, 1000.0, 0.0, 0.0, 0.0, 0.0)
pl1 = object(1000.0, 0.0, 1000.0, 0.0, 10.0, 0.0, 40.0, 40.0, 90.0)
pl2 = object(2000.0, 0.0, 2000.0, 0.0, 15.0, 0.0, 15.0, 15.0, 90.0)

list.append(sun)
list.append(pl1)
list.append(pl2)

#calculate gravitational force
i = 0
for o in list:
j = 0
for p in list:
# print "%s, %s" % (i, j)
if i >= j:
pass
else:
d = calc_rt(o.lx, o.ly, p.lx, p.ly)
gravity.append(calc_grav(o.mass, p.mass, d[0])) #do i really need arrays yet?
# thetas.append(d[1])
j += 1
i += 1

print gravity
#print thetas

#--TO DO--
#calculate magnitude of force ^^^^^^^^^^^^^^^
#calculate direction of force ^
#calculate x, y of the force
#add to initial motion vector (x, y)
#store this final vector so that it can be used next iteration, and multiply the vector by the timestep to get the new location of all objects

#add config file for custom simulations
#add output file
Title: Re: Python
Post by: Darvince on May 06, 2013, 10:14:07 PM
what is this?
Title: Re: Python
Post by: vh on May 07, 2013, 03:28:37 AM
what is this?

http://forum.nationstates.net/viewtopic.php?f=12&t=238623 (http://forum.nationstates.net/viewtopic.php?f=12&t=238623)
Title: Re: Python
Post by: vh on May 09, 2013, 06:27:45 PM
1 dimensional fourier transform implementation

Code: [Select]
e = 2.7182818
pi = 3.1415926
i = 1j

def summation(bottom, bign, function, m, x):
    sum = 0
    for n in xrange(0, bign):
        sum = sum + function(m, x, n, bign)
    return sum

def sumfun(m, k, smalln, bign):
    return e**(-i*2*pi*k*smalln/bign)*m[smalln]

def fft(m): #list
    bign = len(m)
    r = [0]*bign
    for x in xrange(0,bign):
        r[x] = summation(0, bign, sumfun, m, x) #xn and k
    return r

m = [3,2,0,1]

print fft(m)/code]
Title: Re: Python
Post by: atomic7732 on June 12, 2013, 03:10:24 AM
you need pygame (module) for this

a test game thing

oh wait you need my car file too (put it in the same folder as the script is)
Title: Re: Python
Post by: vh on June 12, 2013, 03:36:14 AM
gneiss

worst name ever though

ok i've figured out how to turn
Title: Re: Python
Post by: atomic7732 on June 12, 2013, 03:38:51 AM
you might want directions

up arrow - 'gas'
down arrow - 'brake' (i want to make these function more like them)
left arrow - pivot left
right arrow - pivot right

page up - drive (you start in neutral)
page down - reverse
Title: Re: Python
Post by: blotz on June 12, 2013, 04:52:52 AM
solution: play f1 instead
Title: Re: Python
Post by: vh on June 12, 2013, 11:47:11 AM
you might want directions

up arrow - 'gas'
down arrow - 'brake' (i want to make these function more like them)
left arrow - pivot left
right arrow - pivot right

page up - drive (you start in neutral)
page down - reverse


wait whats the difference between the gas pedal and the drive pedal if i just press gas will a pile of gasoline start leaking out
Title: Re: Python
Post by: atomic7732 on June 12, 2013, 12:07:32 PM
you can't drive in the neutral gear, so you have to put the car in drive and then you can use the gas to accelerate!
Title: Re: Python
Post by: vh on June 12, 2013, 01:41:11 PM
now add gas and prevent the car from going off screen

and is it just me or is the acceleration constant unused
Title: Re: Python
Post by: atomic7732 on June 12, 2013, 03:22:20 PM
it's unused atm
Title: Re: Python
Post by: vh on June 26, 2013, 04:12:07 PM
hashcash generator with size argument and writing to file
Title: Re: Python
Post by: vh on June 26, 2013, 07:53:52 PM
a value of 100,663,296 in hashcash

Code: [Select]
N8qX4e1ZlDRpstt2AxSDYSR7onRKcDdJ3sh8H77ZJqRJbS1tWnp7Qq53GEXuFi6h
GHB4V0bub7cppl3SARH3wCGgzdjCHcg9jSWj116nvAAIJJXnUPkIbZzwXR7EMFjm
Ae0xRoh0q2ciKAh4kl05mwufEgJEFY4RiipD26AwyQq1Hy4MyMVMiGIYTL3KZMGt
cy74uw95TcF5i5mqWpcse0DCO0CEp6LMhzFcwCwMBzHl1Os2KPznysSBt7pMs9vC
6EXhgO4s9W8JWP0JDAljlSjEVviGxzuDcFxTLPPCMFozQAvaZNLmy6FTOxTLulhW
VbioCBvUqlqhzBS6iBa1y5gnL8wXamMRsFvgPCgnytOmG6iDzzvElRm53Kc26aHB
Title: Re: Python
Post by: atomic7732 on June 29, 2013, 08:43:45 PM
Code: [Select]
print "1D pressure-gradient force simulation"

dx = 100000 #m
v = 0
j = 0

i = raw_input("Iterations: ")
i.strip('\n')

def calc(v, dx):
a = (-1/1.275) * (500/dx)
preV = a*60 #ms^-2 * s --> ms^-1
v += preV
dx += v*60 #ms^-1 * s --> m | distance moved is ????'d
return v, dx

while j < int(i):
data = calc(v, dx)
v = data[0]
dx = data[1]
print str(v) + " m/s, " + str(dx) + " m\n"
j += 1

#equalizing pressure?

idk if i'm doing this right...
Title: Re: Python
Post by: atomic7732 on June 30, 2013, 08:42:11 PM
Code: [Select]
import math

print "Coriolis parameter calculation"

deglat = raw_input('Latitude: ')
lat = int(deglat)*(math.pi/180)

calc = 2*((2*math.pi)/24)*math.sin(lat)

print str(calc) + " (coriolis parameter)"

v = [15, 0] #ve, vn | m/s | chosen default values
a = [v[1]*calc, -v[0]*calc]

print a

I think i'm doing this right but still pressure gradient force looks suspicious
Title: Re: Python
Post by: vh on July 04, 2013, 02:17:18 AM
soo i'm sharing this because the psutil module is pretty neat

(http://i.snag.gy/yRMym.jpg)

here, g is the python27.exe process, and i'm running a cpu heavy script. if i'm trying to play ksp or something, i want the thread to pause so more cpu power can go towards what i'm currently doing. to detect this, i measure if the cpu utilization is high, yet the python utilization of the cpu is lower than 90% of the cpu utilization, then pause it. if the cpu usage decreases afterwards, the process resumes
Title: Re: Python
Post by: vh on July 04, 2013, 02:31:53 AM
this is a better version
(http://i.snag.gy/ghdTi.jpg)
Title: Re: Python
Post by: atomic7732 on July 04, 2013, 12:16:05 PM
does it do it automatically or did you code something that you didn't post here? :P
Title: Re: Python
Post by: vh on July 04, 2013, 01:19:50 PM
it's automatic :), the while loop just runs the detection forever

if you are pausing a python process though, you have to be careful because there will be two python processes, the script you're running, and the interpreter i have open here

i had to find the process id manually, but it only took a minute, and i'm sure you can automate it if you want
Title: Re: Python
Post by: atomic7732 on July 04, 2013, 02:02:48 PM
no i mean actually running it
Title: Re: Python
Post by: vh on July 04, 2013, 02:16:39 PM
huh

yeah that while loop is all the code i used
Title: Re: Python
Post by: atomic7732 on July 04, 2013, 04:59:55 PM
how do you run multiple lines in cmd
Title: Re: Python
Post by: vh on July 04, 2013, 06:04:19 PM
huh

this was interpreter
but you can do it on cmd too, just type in 'python' (without quotes) or in my case, python27 because i renamed it, and the cmd turns into an interpreter
Title: Re: Python
Post by: vh on July 06, 2013, 10:03:03 AM
the captionator adds captions to all your images quickly and efficiently

tell me if you have any bugs regarding how well the text fits
Title: Re: Python
Post by: blotz on July 06, 2013, 10:10:14 AM
what do you have to import
Title: Re: Python
Post by: blotz on July 06, 2013, 10:16:36 AM
i got an error message
Title: Re: Python
Post by: vh on July 06, 2013, 10:27:53 AM
all the imports should be installed by default.


this modified version will delete files if you leave the caption blank, exit if you enter 'break' as the caption, and start at any screenshot you want. so if you captioned 500/10,000 screenshots, you can start at 2013-3-4-2004.png. if you leave start blank , you start from the beginning


edit; some errors with below version

ok fixed

the folder you are captioning must contain only image files
Title: Re: Python
Post by: blotz on July 06, 2013, 07:13:44 PM
no pil
Title: Re: Python
Post by: atomic7732 on July 08, 2013, 08:47:05 PM
i think this is the tk inter stuff but idk if it works i tried it and it broke when i typed things so idk what i did to it but it used to work
Title: Re: Python
Post by: blotz on July 09, 2013, 04:17:20 AM
i need a program that clicks every 30-45 seconds, and it has to be random. by click i mean like a left click
Title: Re: Python
Post by: Darvince on July 09, 2013, 04:25:43 AM
i know this is about empireattack. mudkipz made a python script to continuously click in an outward circle from his capital and his account got banned for a week.
Title: Re: Python
Post by: blotz on July 09, 2013, 04:30:38 AM
well fuck i'll test it on another account
Title: Re: Python
Post by: atomic7732 on July 09, 2013, 12:43:35 PM
how did they even know he had a bot, or did they?

and how could they tell if it clicked at random?
Title: Re: Python
Post by: vh on July 13, 2013, 09:46:22 AM
protip for copying:

suppose you have a piece of data, and you want to do two things to it. in my case, i had an array of data representing an image which i wanted to do two things with.

1. simulate particles moving on the image
2. render the image with particles

since the particles weren't on the image (i had them in a separate class), i would have to change the array in order to render the image.

the obvious solution is copying

renderdata = data

but this is a reference to the list, not an actual copy. this is wrong because
Code: [Select]
>>>data = range(1000)
>>>tempdata = data
>>>tempdata[0] = 100
>>>data[0]
100

to fix this, you should do

renderdata = list(data) #creates a new list
or
renderdata = data[:] #creates a slice of data, which is a new list

tl;dr use copy = list(data) for making a copy of a list instead of a reference
Title: Re: Python
Post by: vh on July 13, 2013, 10:16:40 AM
protip #2:

representing the number 1 as a '64-bit big-endian integer' just means

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001


argghh terminology
Title: Re: Python
Post by: vh on July 15, 2013, 01:19:43 AM
item copying tip:

Code: [Select]
>>>e = range(100)
>>>g = e
>>>g[0] = 50
>>>e[0]
50

when you copy e, you are only getting a refernce to it. thus, changing g changes e

this can normally be fixed by doing this
Code: [Select]
e = list(g)
or
Code: [Select]
e = g[:]
however, in some cases, this does not work (i still do not know why, except that this has caused me hours of trouble)
in those cases,
Code: [Select]
import copy
e = copy.deepcopy(g)
Title: Re: Python
Post by: atomic7732 on July 25, 2013, 12:04:10 AM
I was messing around with PIL (Python Image Library) and created a simple image based on random colors.

Code: [Select]
from PIL import Image
import random
import operator

width = 100
height = 100

data = []

start = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))

for x in xrange(0, width*height):
    rand = (random.randint(-5, 5), random.randint(-5, 5), random.randint(-5, 5))
    data.append(tuple(map(operator.add, start, rand)))
    start = tuple(map(operator.add, start, rand))


img = Image.new('RGB', (width, height))
img.putdata(data)
img.save('image.png')

(first two images use -1/1, last two use -5/5)
Title: Re: Python
Post by: vh on July 25, 2013, 04:13:01 AM
huh pretty
Title: Re: Python
Post by: Bla on July 25, 2013, 05:20:11 AM
Nice, could be adapted to generate planetary ring textures maybe? Or maybe textures for gas giants.
Title: Re: Python
Post by: vh on July 25, 2013, 07:49:47 AM
i've been on this for a few days but got bored. basically it simulates the formation of cities out of randomly distributed populations.

first it initializes cities on the map. then, for each city, it calculates the 'value' of each piece of land around it taking into account population density and distance. then, the city moves from it's current position to the land with the highest value. repeat.

the code runs fine but no cities form for some reason.
Title: Re: Python
Post by: atomic7732 on July 26, 2013, 04:37:56 PM
does anyone know where to get some coastline data
I don't know but I'm going to hav to somehow decode it and stuffs and put it into PIL to get a map
Title: Re: Python
Post by: vh on July 26, 2013, 05:51:38 PM
what do you mean by coastline data? images of coastline?
Title: Re: Python
Post by: atomic7732 on July 26, 2013, 06:47:52 PM
like

numbers

latitude and longitude

locations
Title: Re: Python
Post by: vh on July 26, 2013, 07:34:34 PM
of what? every point on the coastline?
Title: Re: Python
Post by: atomic7732 on July 26, 2013, 09:11:13 PM
yes
Title: Re: Python
Post by: vh on August 10, 2013, 12:24:17 AM
tkinter documentation is surprisingly sparse. here's an alpha version of URANCO (uranium enrichment company simulator)
Title: Re: Python
Post by: vh on September 09, 2013, 02:45:28 PM
so it seems that even rendering a simple 3d object is difficult in python. i've read the panda3d documentation, opengl documentation, and none of it seems to make sense. blender works, but it's python 3. this sucks.

however, i think i could write some code to render shapes in a 3d environment for tkinter, allowing me to render 3d shapes. the optimization would take some time though.
Title: Re: Python
Post by: matty406 on September 12, 2013, 04:58:48 AM
what is this
Title: Re: Python
Post by: Darvince on September 12, 2013, 10:42:45 AM
pyGCM = python Global Climate Simulator.
Title: Re: Python
Post by: blotz on September 21, 2013, 09:22:52 AM
my first python program done :)
Title: Re: Python
Post by: Darvince on September 21, 2013, 12:27:48 PM
i was expecting it to be tkinter and nothing else
Title: Re: Python
Post by: Darvince on September 22, 2013, 01:03:44 AM
global climate model
Title: Re: Python
Post by: atomic7732 on September 22, 2013, 02:02:49 AM
how do you know that it even makes sense how do you have data output

rn i'm too tired to fix my model's grid edge problems so i don't even know if it works yet because that kind of breaks the program if it tries to put something in grid[-1][-1] sooo

I have also decided that my ocean model is pretty bad and even when i add the land it'll probably fail horribly and end up only simulating a general current direction (which we basically already know anyway, defeating the purpose) and not even the temperature. I could do an atmospheric model much better, considering that involves actual pressure-gradient force. My ocean model only takes into account coriolis and a sine wave approximation of winds.
Title: Re: Python
Post by: vh on September 22, 2013, 06:05:37 AM
grid[-1][-1] is valid

>>>g = [1,2,3]
>>>g[-1]
3

so it automatically warps on one side already

on the other

>>>g[3%len(grid)]
1
Title: Re: Python
Post by: atomic7732 on September 22, 2013, 10:32:18 AM
if calc1 > 0 and calc1 <= 1:
                newgrid[r-1][c-1].append(calc1*cell.t)
            if calc8 > 0 and calc8 <= 1:
                newgrid[r][c-1].append(calc8*cell.t)

it likes the first one but errors the other?
Title: Re: Python
Post by: vh on September 22, 2013, 12:41:02 PM
that indenting is screwy, use code

and....it'd help if you also typed out the error message
Title: Re: Python
Post by: Darvince on September 25, 2013, 10:47:35 PM
if usforum had karma i would give you about 100 karma.
Title: Re: Python
Post by: vh on September 29, 2013, 10:29:50 AM
PYPY is fast

(http://i.snag.gy/pqWmD.jpg)
Title: Re: Python
Post by: tuto99 on September 29, 2013, 02:58:53 PM
Uhhhhhhhhhhhhhh.......................................... what
Title: Re: Python
Post by: Darvince on September 29, 2013, 03:00:32 PM
wtf is pypy
Title: Re: Python
Post by: blotz on September 29, 2013, 03:10:40 PM
it speeds up pygmc
Title: Re: Python
Post by: vh on September 29, 2013, 03:20:47 PM
wtf is pypy

pypy is like an implementation of python but faster. there's a complicated explanation but all you need to know is that it's faster for most things
Title: Re: Python
Post by: blotz on September 29, 2013, 03:26:43 PM
i want complicated explanation
Title: Re: Python
Post by: vh on October 09, 2013, 05:55:49 PM
so i've got this idea and if atomic or someone thinks its promising i'll code it

basically you have two 'swarms' of instances which 'battle' with each other until one side wins

each instance, or bot, in the swarm has
memory
processing power
scanners
energy
communications
energy transfer
energy weapons

each player will give a set of instructions (code) to the bots to do stuff like accelerate in a direction, transfer energy, communicate information, compute, scan for enemies, store information, etc. of course, there are several limitations that the player must follow

each bot will have an attribute memory, which is a list. so for example, in your code, you can't say "v = 40", instead, you have to store it as bot.memory[0] = 40. if the memory exceeds the requirements, it'll be overwritten/wiped.

another restriction is processing power. i haven't figured out how to regulate this yet, but basically each bot has a limited amount of power so it can't run expensive algorithms and shit.

there are also communications, for sending from 1-10kb of information. very helpful if you can't process the data fast enough, you can have a bot scan and send the information to other bots for processing.

the rest of the things are pretty much self explanatory. you use energy to attack, accelerate, maybe some other things. there's also damage, which goes from 0 to 1 and at 1 the bot is destroyed. ability of the bot to function is determined by (1-d)^0.2 where d is damage.

to add more interesting things, i thought bots might be able to specialize. for example, there could be group of computation bots and a group of scanning bots which work together better than bots which do both scanning and computations. so you can allocate the abilities of each bot towards a particular function.

distance affects communications, energy transfer, and weapon damage

so, basically, competitors of players will create a short bit of code (probably limited to 100 or 200 lines) in order to compete with the enemy swarm. they'll be given a list of functions to use like scan(), accelerate(direction), senddata(id), and etc to use.
Title: Re: Python
Post by: atomic7732 on October 09, 2013, 08:41:17 PM
this sounds like it'd be a good flash game thing

idk how you're planning to do it but if it was like programming 10 python things at once that sounds like it could be overwhelming
Title: Re: Python
Post by: vh on October 10, 2013, 11:45:23 AM
class BOT

like that.
Title: Re: Python
Post by: vh on October 12, 2013, 04:01:05 AM
short script, the hardest part was getting the memory to clear itself, which i solved by defining the thingy as a function

basically you download a few of these files from http://nsarchive.net/, (http://nsarchive.net/,) don't unzip them.
then put the processor in the same directory as the files and run. it should take a bit over a minute per file and happily eat 2gbs of ram. when it's done you'll have several 100 MB files sitting in your folder that contains the attributes of every single nation in ns for that time period

so i can load each file and say

Code: [Select]
mainstats = []
for nation in thingy:
    mainstats.append(sum(nation.freedomscores))
count = 0
for 300 in mainstats:
    count += 1
print count
to find out how many nations have 100 civil rights, 100 economy, and 100 political freedom. no screwing around with xml files, parsing, and stuff because i've already done that

 
Title: Re: Python
Post by: Bla on October 12, 2013, 04:04:48 AM
Nice, do you know if that archive also stores all the detailed statistics like income equality and stuff?
Title: Re: Python
Post by: vh on October 12, 2013, 04:12:14 AM
well it stores the social equality budget for government. but no, it doesn't have the 69 census measures, you can only get those by the api and they're not archived. actually the daily dumps aren't archived by default either, this is just a player-made database
Title: Re: Python
Post by: vh on October 13, 2013, 11:37:47 PM
for dar
Title: Re: Python
Post by: Darvince on October 13, 2013, 11:40:07 PM
i thank
Title: Re: Python
Post by: vh on October 13, 2013, 11:59:23 PM
adsf
Title: Re: Python
Post by: vh on October 17, 2013, 04:03:40 PM
rough pseudocode that will attempt to weave together chatlogs

Code: [Select]
import os
import glob

filelist = ['kipulog.txt', 'atoulog.txt', 'darulog.txt']
combcount = 0
comblist = []

#gets number of each file
def getmax(f):
    m = [[],[],[]]
    for x in range(0,3):
        for file in glob.glob('*'+f[x]):
            print file
            if str.isdigit(file[:2]):
                m[x].append(int(file[:2]))
            else:
                m[x].append(int(file[0]))
        m[x] = max(m[x]) #get all file lengths
        return m

class SplitFile
    filemax = getmax(filelist)
    def __init__(self, name):
        self.name = name
        self.index = 0
    def open(self):
        #f = open(self.index + self.filename, 'r+')
        #open self.index
    def close(self, name):
        #write f into open(self.index + name, 'w')
        #f.close()
    def readline(self):
        #f.readline()
    def getnext(self):
        #m = readline
        #if m == ''
        #close(name)
        #self.index += 1
        #if self.index != max:
            #open()
            #m = readline()
            #return m
            #readline, else close, increment, open, read.
        #else
            #return 0 if end of file
    def within(self, time, length):
        #open current file, before, and after
        #build a list with all cases
        #find first, and find last that fit
        #close the files
        #return them all inbetween
        #return all entries within length of time

def search(object, maxtime, loe): #loe is list of entries
    #a more efficient search than the one presented can probably be accomplished
    #for item in loe:
        #if object.alias = item.alias and object.text = item.text and abs(object.time-item.time) < maxtime:
            #return index? or item? or just modify item?
   

def offsetscan(tlist):
    #initiate instances of splitfile for all three threads in tlist
    #for each thread:
        #while 1:
            #l = get next until length > LONG:
            #l2 = search(l, MAXTIME, log)
            #find l.time- l2.time
            #assign that value to offset
            #assign offset to l.offset
            #break at eof (0).
    #modifies tlist

def poffset(thread, ref):
    #for item in thread:
        #item.time += item.offset[ref]
    #clears offset parameter and makes it zero, shifting the time in the process

def poff(tlist)
    cthread = 'kipulog.txt' #official time thread
    #kipulog already synchronized
    #poffset(atoulog, kipulog)
    #poffset(darulog, kipulog)
    #use poffset to synchronize all times with cthread

def getfirst(threadlist):
    #initialize t as [0, 0, 0]
    #for each thread:
        #t[x] = thread[x].time
    #i = t.find(max(t))
    #return i

def combadd(item,comblist):
    #if comblist is short:
        #comblist.append(item)
    #if comblist is long:
        #write to file
        #increment filename by one
        #comblist = []
   
def weave(tlist): #tlist must be poffset
    '''
    combines all threads in tlist into a single thread
    '''
    f = getfirst(tlist) #returns index of first thread
    #while 1:
        #n = f.getnext()
        #for two other logs:
            #j = search(log.within(n), SHORT, log)
            #m = log.getnext()
            #if j:
                #j.incorp = 1
                #n.incorp = 1
            #if j != m:
                #f = log
                #break
            #else:
                #j.incorp = 1
            #combadd(j)
        #if eof:
            #break
    #end
       
   
Title: Re: Python
Post by: vh on October 20, 2013, 06:45:56 PM
model for ubv where ubv.py and engine.py are run simultaneously off two command prompts

simultaneously:
ubv.py reads in text from next.txt and sends it to the channel
ubv.py reads in text from freenode and writes it in rec.txt

and

engine.py reads in text from rec.txt as a list, processes the first element, and deleted it
engine.py takes the result of the processing and writes it back into next.txt

this way, even if processing takes a minute or two, ubv.py will continue pinging and just check next.txt to see if engine.py and come up with an answer. it also neatly encapsulates the processing into a single function
Title: Re: Python
Post by: vh on October 22, 2013, 07:24:34 PM
Code: [Select]
import Image
import numpy as np
import cPickle
from operator import itemgetter


hdist = 60 #distance between each day

aliasdict = {}#connects aliases to numbers
colordict = {
    1:np.array([255,0,255]),#
    2:np.array([255,128,128]),#
    3:np.array([128,255,128]),#
    4:np.array([255,255,0]),#
    5:np.array([128,128,255]),#
    6:np.array([0,255,255]),#
    7:np.array([255,128,128]),#
    9:np.array([255,64,192]),#
    10:np.array([255,192,64]),#
    11:np.array([170,170,170])#
    }
   

biglist = cPickle.load(#whatever)

biglist.sort(key=operator.itemgetter(0)) #sort by time

#get alias most used
aliaslist = {}
for line in biglist:
    b = line[1]
    if b not in aliaslist.keys():
        aliaslist[b] = 1
    else:
        aliaslist[b] += 1
#sort by value

aliaslist = list(reversed(sorted(aliaslist.iteritems(), key = operator.itemgetter(1))))#now a list

for x in xrange(0,10):
    aliasdict[aliaslist[x]] = x+1

print aliasdict

def additivepaste(canvas, article, c, r):
    for x in xrange(0,len(article)):
        for y in xrange(0,len(article[0])):
            canvas[x+c][y+r] += article[x][y]

ls = 25

def j2u(j):
    return (j-2440587.5)*86400.0+ls

def u2j(u):
    return ((u-ls)/86400.0)+2440587.5

class Day:
    mlen = 460
    mtime = 10
    duration = 6
    i = Day.mlen/2
    aliascount = 13
    def __init__(self, julian, start, lines=[])
        self.julian = julian
        self.start = start
        self.lines = lines
        self.total = 0
        for line in lines:
            self.total += len(line[2])
        self.map = numpy.zeroes([Day.mlen+1,90000/Day.mtime,Day.aliascount])
        self.article = numpy.zeroes([Day.mlen+1,90000/Day.mtime], dtype=(float,3))
    def addline(self, line):
        c = aliasdict[line[1]]
        #assume odd num
        l = len(line[2])
        for x in xrange(i-l/2, i+l/2):
            t = (line[0]-start)/10
            for y in xrange(t, t+Day.duration):
                self.map[x][y][c] += 1.0/(y-t+1.0) #fades as it ascends
    def makearticle(self):
        for x in xrange(0,len(self.article)):
            for y in xrange(0,len(self.article[0])):
                for z in xrange(0,Day.aliascount):
                    self.article[x][y] += colordict[self.map[x][y][z]]
    def contrain(self):
        for x in xrange(0,len(self.article)):
            for y in xrange(0,len(self.article[0])):
                self.article[x][y] = list(reversed(sorted(self.article[x][y])))
                overflow = 0
                for c in xrange(0,3):
                    d = self.article[c]-255
                    if d > 255:
                        overflow += d
                    elif overflow > 0:
                        if overflow > -d:
                            self.article[c] = 255
                            overflow -= d
                        else:
                            self.article[c] += overflow
                            overflow = 0
                    else:
                        break

daylist = []
#add days
for line in biglist:
    j = int(u2j(line[0]))
    if daylist[-1].julian == j:
        daylist[-1].lines.append(line)
    else:
        daylist.apppend(Day(j, j2u(j), [line])

       
days = int((llist[-1][0]-llist[0][0])/86400)+2

offset = 1000
voffset = 500
canvas = np.zeroes([days*hdist+1000, 90000/Day.mtime], dtype = (float,3))

for day in daylist:
    additivepaste(canvas, day, day.julian*hdist+offset, voffset)

#contrain to 255
for x in xrange(0,len(canvas)):
    for y in xrange(0,len(canvas[0])):
        for c in xrange(0,3):
            if canvas[x][y][c] > 255:
                canvas[x][y][c] = 255

#convert to image
img = Image.fromarray(canvas, 'RGB')
img.save('irc.png')

code to convert irc logs into an visualization. the only parts thats uncompleted is the part where i load in the data. that'll have to wait until i complete the code from two post above about merging the logs
Title: Re: Python
Post by: blotz on October 23, 2013, 11:52:08 AM
what's a visualization? like how do you see the text in a log other than opening a txt file?
Title: Re: Python
Post by: vh on November 01, 2013, 11:53:08 PM
code to download the zday data from ns api.

Code: [Select]
import urllib2
import time

def getevent(str):
    str = str[19:str.find("\n</HAPP")]
    limstart = str.rfind('EVENT id="')+10
    limend = str[limstart:].find('"')+limstart
    return str, int(str[limstart:limend])
zurl = 'http://www.nationstates.net/cgi-bin/api.cgi?q=happenings;view=world;filter=zombie;beforeid='
lim = 10000000
#header
zxml = []
zxml.append('<WORLD><HAPPENINGS>')
while 1:
    print lim, len(zxml)
    c,lim = getevent(urllib2.urlopen(zurl+str(lim)).read())
    if c.find('EVENT') != -1:
        zxml.append(c)
    else:
        break
    time.sleep(0.65)
   
zxml.append('\n</HAPPENINGS></WORLD>\n')
#add tail

t = ''.join(zxml)
#save file
with open('nsxml', 'w') as output:
    output.write(t)

i'm just posting this here as reference if anyone wants to do the same with similar things
Title: Re: Python
Post by: vh on November 06, 2013, 10:48:50 PM
this takes a graphml file and moves the distant points closer to the center.

it's quite impressive what can be done in 12 lines

Code: [Select]
import networkx as nx, random
N = nx.read_graphml('zdaybmig.graphml')
xoff, yoff = 1000.0, 500.0
rparam, maxdist2 = 3.0,16000.0**2
K = N.nodes()
for x in xrange(0,len(K)):
    n = N.node[K[x]]
    while float(n['x']+xoff)**2+float(n['y']+yoff)**2 > maxdist2:
        j = random.random()*(rparam-1)+1
        n['x'] /= j
        n['y'] /= j
nx.write_graphml(N,'zdaymig.graphml')
Title: Re: Python
Post by: Bla on November 24, 2013, 04:49:28 AM
When running it, I get this error:

Code: [Select]
Traceback (most recent call last):
  File "C:\Users\Mikkel\Desktop\guitest.py", line 6, in <module>
    import matplotlib
ImportError: No module named matplotlib
Title: Re: Python
Post by: vh on November 24, 2013, 05:56:19 AM
right. you'll need matplotlib (http://matplotlib.org/downloads.html)

Title: Re: Python
Post by: Bla on November 24, 2013, 07:29:19 AM
I installed it to the default subfolder
Lib\site-packages
but it still gives the exact same error. :l
Title: Re: Python
Post by: vh on November 24, 2013, 09:32:07 AM
have you tried the binary installers?
Title: Re: Python
Post by: Bla on November 24, 2013, 09:44:45 AM
I ran the
matplotlib-1.3.1.win-amd64-py2.7.exe
I also tried downloading the .rar and running setup.py inside it, still not working. I don't really have patience to read and follow long texts on several different ways to install it and remove it where most of them probably won't work.

If the binary file is the .dmg file, no, Idk how to use that.
Title: Re: Python
Post by: vh on November 24, 2013, 10:44:30 AM
i don't know how familiar you are with setup.py, but you ran it with a command like
python setup.py install
?

also i too have problems installing with modules and sometimes it works when i install it in /Lib instead of /Lib/site-packages. maybe you can copy/paste the thingies and try again

if you have pip or easy_install installed, you might try something like
easy_install matplotlib
(on command line)
Title: Re: Python
Post by: vh on November 24, 2013, 07:49:55 PM
i've got an interesting problem i thought we could have an impromptu coding contest on. java, python, or whatever language. (too bad there's no general coding topic.)

anyways it was inspired by darvince:
<Darvince>tell him the amount of correct numbers he got
<Darvince>don't tell him in what order though

basically, a number will be generated, and the algorithm must guess the number. the test() function will return True if the correct answer is guessed and an integer containing the number of digits correct will be returned if it was the wrong number.

some numbers will be of specified lengths and some others will have unspecified lengths (<1000).

fastest algorithm wins

if anyone's interested, post so that i know i'm not the only person working on this
Title: Re: Python
Post by: blotz on November 25, 2013, 12:52:01 PM
i would but
1. idk how to time it and
2. i'd get second because me and kip would be the only dudes doing it
Title: Re: Python
Post by: blotz on November 25, 2013, 12:52:28 PM
EDIT: wait darvince was refering to telephone numbers
Title: Re: Python
Post by: FiahOwl on November 27, 2013, 12:54:30 PM
i am attempt to learn so i can code a solar system generator
Title: Re: Python
Post by: blotz on November 27, 2013, 01:46:08 PM
tell me in 2 days how you're doing
Title: Re: Python
Post by: vh on December 04, 2013, 09:07:29 PM
LEVLEN:

the function levplot takes a list of segment lengths, attaches them end to end in one long snake, and rotates each pivot randomly. the distance of the tip of the segment from the origin is plotted as a histogram.

usage example in interpreter

import os
os.chdir("c:\\kolkon\\pathname")
execfile('levlen.py')

levplot([1,2,3])
levplot([range(5)])
levplot([x**2 for x in list(reversed(range(10)))])
levplot([1,1],1000000,500) #1 million samples (normal is 100000) and 500 bins (normal is 200)

the following are example results. filename shows the list passed to levplot.
Title: Re: Python
Post by: vh on December 06, 2013, 08:38:30 PM
method of setting up a multi-player game without needing to port forward by using freenode which can transmit around 1 kB/second
Title: Re: Python
Post by: atomic7732 on December 06, 2013, 08:54:11 PM
that doesn't seem very traditional lol

interesting
Title: Re: Python
Post by: Bla on December 07, 2013, 04:44:42 AM
Kol, that should work fine for Map War 3 I guess.
Title: Re: Python
Post by: vh on December 07, 2013, 07:50:57 AM
i still have the dilemma of preventing one player from pretending to be another and screwing up the game that way. perhaps i will have each player generate a low value hashcoin and encrypt it with a short private key to ensure identities are correct
Title: Re: Python
Post by: vh on December 10, 2013, 07:46:48 PM
further elaboration of freenode setup shown previously. it's not cryptographically secure, but most people without a degree in cryptography would have a hard time cracking it
Title: Re: Python
Post by: vh on December 11, 2013, 11:41:41 PM
code for alternative voting system to be used in blavision (or other applications). example from wikipedia included.

Code: [Select]
def dez(ditc): #delete zeroes
    dlist = []
    for key in ditc:
        if not(ditc[key]):
            dlist.append(key)
    for k in dlist:
        del ditc[k]

def calc(choicelist, votelist):
    cdict = {}
    for c in choicelist:
        cdict[c] = 0
    for v in votelist:
        cdict[v[0]] += 1 #replace this line with something more robust
    dez(cdict) #delete zeroes
    while 1:
        vcount = sum((len(v) for v in votelist))
        larg = max(cdict, key = cdict.get)
        if cdict[larg]*2 > vcount: #terminate if over 50% vote
            return larg
        rem = min(cdict, key = cdict.get) #find min
        del cdict[rem] #remove min
        for v in votelist:
            i = v.index(rem) #Get index
            if i == 0: #remove previous vote
                del v[0] #then delete the name
                if len(v) == 0:
                    del v
                    break
                elif v[0] in cdict:
                    cdict[v[0]] += 1 #deleted
            if i != -1:
                del v[i]
                if len(v) == 0:
                    del v

#test samples
choicelist = ['bob', 'sue', 'bill']

v1 = ['bob', 'bill', 'sue']
v2 = ['sue', 'bob', 'bill']
v3 = ['bill', 'sue', 'bob']
v4 = ['bob', 'bill', 'sue']
v5 = ['sue', 'bob', 'bill']

votelist = [v1,v2,v3,v4,v5]

print calc(choicelist, votelist)
               
       
       
   
Title: Re: Coding
Post by: vh on December 12, 2013, 01:58:43 PM
the ackerman function is a beautiful 4 lines in lisp

Code: [Select]
(define (ack m n)
  (cond ((= m 0) (+ n 1))
        ((= n 0) (ack (- m 1) 1))
        (else (ack (- m 1) (ack m (- n 1))))))
 
(define x (ack 3 9))

(print x)
Title: Re: Coding
Post by: Darvince on December 12, 2013, 02:26:04 PM
What does the Ackermann function do?
Title: Re: Coding
Post by: vh on December 12, 2013, 02:29:08 PM
make big numbers

"Its value grows rapidly, even for small inputs. For example A(4,2) is an integer of 19,729 decimal digits.[2]"
Title: Re: Coding
Post by: Darvince on December 12, 2013, 02:32:40 PM
No what does it actually do, does it like grow 4,2 into 4^2 * 4^1 * 4^0 * 3^2 * 3^1 * 3^0 * 2^2 * 2^1 * 2^0 * 1^2 * 1^1 * 1^0?
Title: Re: Coding
Post by: vh on December 12, 2013, 03:51:34 PM
Code: [Select]
A(4, 2) = A(3, A(4, 1))
 = A(3, A(3, A(4, 0)))
 = A(3, A(3, A(3, 1)))
 = A(3, A(3, A(2, A(3, 0))))
 = A(3, A(3, A(2, A(2, 1))))
 = A(3, A(3, A(2, A(1, A(2, 0)))))
 = A(3, A(3, A(2, A(1, A(1, 1)))))
 = A(3, A(3, A(2, A(1, A(0, A(1, 0))))))
 = A(3, A(3, A(2, A(1, A(0, A(0, 1))))))
 = A(3, A(3, A(2, A(1, A(0, 2)))))
 = A(3, A(3, A(2, A(1, 3))))
 = A(3, A(3, A(2, A(0, A(1, 2)))))
 = A(3, A(3, A(2, A(0, A(0, A(1, 1))))))
 = A(3, A(3, A(2, A(0, A(0, A(0, A(1, 0)))))))
 = A(3, A(3, A(2, A(0, A(0, A(0, A(0, 1)))))))
 = A(3, A(3, A(2, A(0, A(0, A(0, 2))))))
 = A(3, A(3, A(2, A(0, A(0, 3)))))
 = A(3, A(3, A(2, A(0, 4))))
 = A(3, A(3, A(2, 5)))
 = A(3, A(3, A(1, A(2, 4))))
 = A(3, A(3, A(1, A(1, A(2, 3)))))
 = A(3, A(3, A(1, A(1, A(1, A(2, 2))))))
 = A(3, A(3, A(1, A(1, A(1, A(1, A(2, 1)))))))
 = A(3, A(3, A(1, A(1, A(1, A(1, A(1, A(2, 0))))))))
 = A(3, A(3, A(1, A(1, A(1, A(1, A(1, A(1, 1))))))))
 = A(3, A(3, A(1, A(1, A(1, A(1, A(1, A(0, A(1, 0)))))))))
 = A(3, A(3, A(1, A(1, A(1, A(1, A(1, A(0, A(0, 1)))))))))
 = A(3, A(3, A(1, A(1, A(1, A(1, A(1, A(0, 2))))))))
 = A(3, A(3, A(1, A(1, A(1, A(1, A(1, 3)))))))
 = A(3, A(3, A(1, A(1, A(1, A(1, A(0, A(1, 2))))))))
 = A(3, A(3, A(1, A(1, A(1, A(1, A(0, A(0, A(1, 1)))))))))
 = A(3, A(3, A(1, A(1, A(1, A(1, A(0, A(0, A(0, A(1, 0))))))))))
 = A(3, A(3, A(1, A(1, A(1, A(1, A(0, A(0, A(0, A(0, 1))))))))))
 = A(3, A(3, A(1, A(1, A(1, A(1, A(0, A(0, A(0, 2)))))))))
 = A(3, A(3, A(1, A(1, A(1, A(1, A(0, A(0, 3))))))))
 = A(3, A(3, A(1, A(1, A(1, A(1, A(0, 4)))))))
 = A(3, A(3, A(1, A(1, A(1, A(1, 5))))))
 = A(3, A(3, A(1, A(1, A(1, A(0, A(1, 4)))))))
 = A(3, A(3, A(1, A(1, A(1, A(0, A(0, A(1, 3))))))))
 = A(3, A(3, A(1, A(1, A(1, A(0, A(0, A(0, A(1, 2)))))))))
 = A(3, A(3, A(1, A(1, A(1, A(0, A(0, A(0, A(0, A(1, 1))))))))))
 = A(3, A(3, A(1, A(1, A(1, A(0, A(0, A(0, A(0, A(0, A(1, 0)))))))))))
 = A(3, A(3, A(1, A(1, A(1, A(0, A(0, A(0, A(0, A(0, A(0, 1)))))))))))
 = A(3, A(3, A(1, A(1, A(1, A(0, A(0, A(0, A(0, A(0, 2))))))))))
 = A(3, A(3, A(1, A(1, A(1, A(0, A(0, A(0, A(0, 3)))))))))
 = A(3, A(3, A(1, A(1, A(1, A(0, A(0, A(0, 4))))))))
 = A(3, A(3, A(1, A(1, A(1, A(0, A(0, 5)))))))
 = A(3, A(3, A(1, A(1, A(1, A(0, 6))))))
 = A(3, A(3, A(1, A(1, A(1, 7)))))
 = A(3, A(3, A(1, A(1, A(0, A(1, 6))))))
 = A(3, A(3, A(1, A(1, A(0, A(0, A(1, 5)))))))
 = A(3, A(3, A(1, A(1, A(0, A(0, A(0, A(1, 4))))))))
 = A(3, A(3, A(1, A(1, A(0, A(0, A(0, A(0, A(1, 3)))))))))
 = A(3, A(3, A(1, A(1, A(0, A(0, A(0, A(0, A(0, A(1, 2))))))))))
 = A(3, A(3, A(1, A(1, A(0, A(0, A(0, A(0, A(0, A(0, A(1, 1)))))))))))
 = A(3, A(3, A(1, A(1, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(1, 0))))))))))))
 = A(3, A(3, A(1, A(1, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, 1))))))))))))
 = A(3, A(3, A(1, A(1, A(0, A(0, A(0, A(0, A(0, A(0, A(0, 2)))))))))))
 = A(3, A(3, A(1, A(1, A(0, A(0, A(0, A(0, A(0, A(0, 3))))))))))
 = A(3, A(3, A(1, A(1, A(0, A(0, A(0, A(0, A(0, 4)))))))))
 = A(3, A(3, A(1, A(1, A(0, A(0, A(0, A(0, 5))))))))
 = A(3, A(3, A(1, A(1, A(0, A(0, A(0, 6)))))))
 = A(3, A(3, A(1, A(1, A(0, A(0, 7))))))
 = A(3, A(3, A(1, A(1, A(0, 8)))))
 = A(3, A(3, A(1, A(1, 9))))
 = A(3, A(3, A(1, A(0, A(1, 8)))))
 = A(3, A(3, A(1, A(0, A(0, A(1, 7))))))
 = A(3, A(3, A(1, A(0, A(0, A(0, A(1, 6)))))))
 = A(3, A(3, A(1, A(0, A(0, A(0, A(0, A(1, 5))))))))
 = A(3, A(3, A(1, A(0, A(0, A(0, A(0, A(0, A(1, 4)))))))))
 = A(3, A(3, A(1, A(0, A(0, A(0, A(0, A(0, A(0, A(1, 3))))))))))
 = A(3, A(3, A(1, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(1, 2)))))))))))
 = A(3, A(3, A(1, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(1, 1))))))))))))
 = A(3, A(3, A(1, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(1, 0)))))))))))))
 = A(3, A(3, A(1, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, 1)))))))))))))
 = A(3, A(3, A(1, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, 2))))))))))))
 = A(3, A(3, A(1, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, 3)))))))))))
 = A(3, A(3, A(1, A(0, A(0, A(0, A(0, A(0, A(0, A(0, 4))))))))))
 = A(3, A(3, A(1, A(0, A(0, A(0, A(0, A(0, A(0, 5)))))))))
 = A(3, A(3, A(1, A(0, A(0, A(0, A(0, A(0, 6))))))))
 = A(3, A(3, A(1, A(0, A(0, A(0, A(0, 7)))))))
 = A(3, A(3, A(1, A(0, A(0, A(0, 8))))))
 = A(3, A(3, A(1, A(0, A(0, 9)))))
 = A(3, A(3, A(1, A(0, 10))))
 = A(3, A(3, A(1, 11)))
 = A(3, A(3, A(0, A(1, 10))))
 = A(3, A(3, A(0, A(0, A(1, 9)))))
 = A(3, A(3, A(0, A(0, A(0, A(1, 8))))))
 = A(3, A(3, A(0, A(0, A(0, A(0, A(1, 7)))))))
 = A(3, A(3, A(0, A(0, A(0, A(0, A(0, A(1, 6))))))))
 = A(3, A(3, A(0, A(0, A(0, A(0, A(0, A(0, A(1, 5)))))))))
 = A(3, A(3, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(1, 4))))))))))
 = A(3, A(3, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(1, 3)))))))))))
 = A(3, A(3, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(1, 2))))))))))))
 = A(3, A(3, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(1, 1)))))))))))))
 = A(3, A(3, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(1, 0))))))))))))))
 = A(3, A(3, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, 1))))))))))))))
 = A(3, A(3, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, 2)))))))))))))
 = A(3, A(3, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, 3))))))))))))
 = A(3, A(3, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, 4)))))))))))
 = A(3, A(3, A(0, A(0, A(0, A(0, A(0, A(0, A(0, A(0, 5))))))))))
 = A(3, A(3, A(0, A(0, A(0, A(0, A(0, A(0, A(0, 6)))))))))
 = A(3, A(3, A(0, A(0, A(0, A(0, A(0, A(0, 7))))))))
 = A(3, A(3, A(0, A(0, A(0, A(0, A(0, 8)))))))
 = A(3, A(3, A(0, A(0, A(0, A(0, 9))))))
 = A(3, A(3, A(0, A(0, A(0, 10)))))
 = A(3, A(3, A(0, A(0, 11))))
 = A(3, A(3, A(0, 12)))
 = A(3, A(3, 13))
 = A(3, A(2, A(3, 12)))
 = A(3, A(2, A(2, A(3, 11))))
 = A(3, A(2, A(2, A(2, A(3, 10)))))
 = A(3, A(2, A(2, A(2, A(2, A(3, 9))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(3, 8)))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(3, 7))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(3, 6)))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(3, 5))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(3, 4)))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(3, 3))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(3, 2)))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(3, 1))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(3, 0)))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, 1)))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(2, 0))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, 1))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(0, A(1, 0)))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(0, A(0, 1)))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(0, 2))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, 3)))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(0, A(1, 2))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(0, A(0, A(1, 1)))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(0, A(0, A(0, A(1, 0))))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(0, A(0, A(0, A(0, 1))))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(0, A(0, A(0, 2)))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(0, A(0, 3))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(0, 4)))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, 5))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(2, 4)))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(2, 3))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(2, 2)))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(1, A(2, 1))))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(1, A(1, A(2, 0)))))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(1, A(1, A(1, 1)))))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(1, A(1, A(0, A(1, 0))))))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(1, A(1, A(0, A(0, 1))))))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(1, A(1, A(0, 2)))))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(1, A(1, 3))))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(1, A(0, A(1, 2)))))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(1, A(0, A(0, A(1, 1))))))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(1, A(0, A(0, A(0, A(1, 0)))))))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(1, A(0, A(0, A(0, A(0, 1)))))))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(1, A(0, A(0, A(0, 2))))))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(1, A(0, A(0, 3)))))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(1, A(0, 4))))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(1, 5)))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(0, A(1, 4))))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(0, A(0, A(1, 3)))))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(0, A(0, A(0, A(1, 2))))))))))))))))))))
 = A(3, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(2, A(1, A(1, A(1, A(0, A(0, A(0, A(0, A(1, 1)))))))))))))))))))))
 .............
 etc
Title: Re: Coding
Post by: Darvince on December 12, 2013, 05:42:11 PM
what the fuck
Title: Re: Coding
Post by: vh on December 12, 2013, 05:53:09 PM
yes.

in fact, the ackerman function is used as a computational benchmark
Title: Re: Coding
Post by: Darvince on December 12, 2013, 09:36:30 PM
osmotischen the stratosphere affects weather (since pygcm seems to be turning into pygwm)
Title: Re: Coding
Post by: vh on December 12, 2013, 09:53:16 PM
care to elaborate?
Title: Re: Coding
Post by: vh on December 14, 2013, 12:33:44 AM
2d simplex noise

fairly self-explanatory and simple. you'll need the libraries

noise: http://www.lfd.uci.edu/~gohlke/pythonlibs/#noise (http://www.lfd.uci.edu/~gohlke/pythonlibs/#noise)
numpy and matplotlib

Code: [Select]
import noise
import numpy as np
import matplotlib.pyplot as plt

def narray(xs, ys, s, p = 0.5, oct = 3):
    r = [[noise.snoise2(x/s, y/s, octaves = oct, persistence = p) for y in xrange(0,ys)] for x in xrange(0,xs)]
    return np.array(r)

g = narray(1000,1000,500.0, oct = 5)
plt.imshow(g)
plt.show()

result:
Title: Re: Coding
Post by: vh on December 15, 2013, 03:19:18 AM
LOS maps based on the above heightmap

(line of sight).
Title: Re: Coding
Post by: vh on December 15, 2013, 07:00:19 PM
requires 32 bit python and the library pyglet

right now it just shows a bunch of triangles. within a few days it should render a 3d figure. within a week, i might get something like fly mode working with a height map. then i'll try some shaders out
Title: Re: Coding
Post by: atomic7732 on December 16, 2013, 10:36:03 AM
how do line of sights work

i'm trying to imagine silhouettes but im not getting anything
Title: Re: Coding
Post by: vh on December 16, 2013, 12:50:11 PM
well right now i only need to determine line of sight between two objects given a heightmap in the form of an array. i draw a supercover line between the objects, and check each grid square it intersects to make sure it does not block the line of sight.

what you see above is the result of using this algorithm with a the center point and every pixel on the map. impractical for official use
Title: Re: Coding
Post by: vh on December 16, 2013, 09:42:39 PM
i gave my first stackoverflow answer! check it out, or dont.

http://stackoverflow.com/a/20624839/1858363 (http://stackoverflow.com/a/20624839/1858363)
Title: Re: Coding
Post by: vh on December 17, 2013, 07:18:36 PM
fastpy (http://www.youtube.com/watch?v=NMAy_uVWb-k#)
Title: Re: Coding
Post by: vh on December 30, 2013, 12:00:09 AM
a framework for musics.

the first 45 lines of this file is a framework with which to work with. the second part is a function that creates a song using the framework. a sample of the music produced is uploaded
Title: Re: Coding
Post by: vh on December 30, 2013, 01:14:48 AM
<rodafk>darv have you ever figured out your sexuality
<Darvince>rodafk uhh mostly
<rodafk>what about you kal
<rodafk>i know vh is codesexual
<rodafk>you're always coding like a madman
<rodafk>new code appears everyday
<rodafk>born like rabbits
Title: Re: Coding
Post by: vh on January 01, 2014, 11:18:12 AM
Code: [Select]
import os
import glob
from lxml import etree
import cPickle
import gzip
import time
import thread
import winsound

start = time.time()

def preprocessor(file):
    invalid = [['&#x1A;','']]
    with gzip.open(file,'r') as original:
        with gzip.open('~'+file,'w') as temp:
            m = original.readline()
            while m != '':
                for i in invalid:
                    m = m.replace(i[0],i[1])
                temp.write(m)
                m = original.readline()
    os.remove(file)
    os.rename('~'+file,file)
   
class NATION:
    def __init__(self, name, type, fullname, motto, category, un, civil, economy, political, region, population, tax, animal, currency, flag, industry,
                 priority, environment, equality, education, law, administration, welfare, spirituality, defence, transportation, healthcare, commerce,
                 founded, firstlogin, lastlogin, activity, influence, public, leader, capital, religion):
        self.name = name
        self.type = type
        self.fullname = fullname
        self.motto = motto
        self.category = category
        self.unstatus = un
        self.freedomscores = {'civilrights':civil, 'economy':economy, 'politicalfreedom':political}
        self.region = region
        self.population = population
        self.tax = tax
        self.animal = animal
        self.currency = currency
        self.flaglink = flag
        self.majorindustry = industry
        self.govtpriority = priority
        self.govt = {'environment':environment, 'socialequality':equality, 'education':education, 'lawandorder':law, 'administration':administration,
                     'welfare':welfare, 'spirituality':spirituality, 'defence':defence, 'publictransport':transportation, 'healthcare':healthcare,
                     'commerce':commerce}
        self.founded = founded
        self.firstlogin = firstlogin
        self.lastlogin = lastlogin
        self.influence = influence
        self.publicsector = public
        self.leader = leader
        self.capital = capital
        self.religion = religion
        self.lastactivity = activity
       
def create(file):
    print 'processing '+ file
    nationlist = []
    _dump = gzip.open(file, 'r')
    try:
        parseddump = (etree.parse(_dump)).getroot()
    except:
        print 'error'
        _dump.close()
        preprocessor(file)
        create(file)
        return 0
    _dump.close()
    for nation in parseddump:
        nationlist.append(NATION(
            nation[0].text, nation[1].text, nation[2].text, nation[3].text, nation[4].text, bool(nation[5].text[0] == 'W'),
            int(nation[21][0].text.strip('%')), int(nation[21][1].text.strip('%')), int(nation[21][2].text.strip('%')),
            nation[7].text, int(nation[8].text), int(nation[9].text), nation[10].text, nation[11].text, nation[12].text, nation[13].text, nation[14].text,
            int(nation[15][0].text.strip('%')), int(nation[15][1].text.strip('%')), int(nation[15][2].text.strip('%')), int(nation[15][3].text.strip('%')),
            int(nation[15][4].text.strip('%')), int(nation[15][5].text.strip('%')), int(nation[15][6].text.strip('%')), int(nation[15][7].text.strip('%')),
            int(nation[15][8].text.strip('%')), int(nation[15][9].text.strip('%')), int(nation[15][10].text.strip('%')),
            nation[16].text, int(nation[17].text), int(nation[18].text), nation[19].text, nation[20].text,
            int(nation[22].text.strip('%')), nation[23].text,nation[24].text, nation[25].text))
    with gzip.open(file[:file.find('.')]+'output','wb') as outputfile:
        cPickle.dump(nationlist, outputfile)
    parseddump = None

with open("error.txt", 'w') as f:
    f.write('this is the error log\n')
for file in glob.glob("*.gz"):
    try:
        create(file)
    except:
        winsound.Beep(2000,2000)
        print 'error', file
        with open("error.txt",'a') as ef:
            ef.write(file+'\n')
   
print time.time()-start

this is an update of dump_processor.py
some files don't extract if they're on an external hd for some reason, so i added an error log to catch those problems.

link to original below
.
Title: Re: Coding
Post by: vh on January 01, 2014, 06:12:28 PM
kdf (https://en.wikipedia.org/wiki/Key_derivation_function) based on sha512

time complexity is O(n2)
memory complexity is O(n)

there are 3 functions in the code. hash is just sha512 as implemented by a library
algohash is the actual algorithm
algocollision is a generator object that yields keys with partial hash collisions -- similar to cryptocurrency mining

code:
Code: [Select]
import hashlib
import random

def hash(k,hasher):
    hasher.update(str(k))
    return int(hasher.hexdigest(),16)

def algohash(length,start):
    hasher = hashlib.sha512()
    plist = [start]
    for x in xrange(0,length):
        plist.append(hash(sum(plist),hasher))
    return hex(plist[-1])

def algocollision(length,bits):
    while 1:
        key = random.random()
        r = algohash(length,key)
        b = bin(int(r[2:-1],16))[2:].zfill(8)
        if b[1:bits+1] == '0'*bits:
            yield key

basically, there's a list. you put the input into the list.
then for n times, sum the list, hash the sum, append the result to the list

on a single thread, algohash takes about 3 seconds with a length parameter of 10000 and 12 seconds with a length parameter of 20000. with a length parameter of 100000, the expected time is 5 minutes

with a length parameter of 100000 the memory usage should be around 6.1 MB, making it extremely difficult to parallelize onto a gpu or asic. the average gpu runs from 5000 to 40000 concurrent threads. this would be 30 and 238 GB of ram respectively using the algohash algorithm
Title: Re: Coding
Post by: vh on January 03, 2014, 11:51:01 PM
sloppy code but it works

Code: [Select]
import itertools
import pyglet
import random
from pyglet.gl import *
import noise
import numpy as np
import colorsys as cs
import math

win = pyglet.window.Window(resizable=True)
kb = pyglet.window.key.KeyStateHandler()
win.push_handlers(kb)
win.set_exclusive_mouse(True)

def randcol():
    return [int(random.random()*256) for x in range(3)]

def narray(x, y, s=200, p = 0.5, oct = 3):
    return noise.snoise2(x/s, y/s, octaves = oct, persistence = p)

def trimesh(vcmax, kmax, scale, offsetx, offsety, func, theight):
    num = vcmax*kmax
    const = (3**0.5)/2
    eo = [[[k*const*scale+offsetx,
            offsety+scale*(k/2.0+vc),
            theight*func(k*const*scale+offsetx, offsety+scale*(k/2.0+vc))
            ] for vc in xrange(0,vcmax)] for k in xrange(0,kmax)] #k, vc, 3list
    eo = list(itertools.chain(*eo))
    counter = 0
    order = []
    flag = True
    while 1:
        order.append(eo[counter])
        if counter == num-1:
            break
        if flag:
            counter += vcmax
            flag = False
        else:
            counter -= (vcmax-1)
            flag = True
    sorder = [tuple(order[x:x+2*vcmax]) for x in xrange(0,len(order),2*vcmax)]
    for s in xrange(0,kmax-1):
        sorder[s] = list(itertools.chain(*sorder[s]))
    vlb = pyglet.graphics.Batch()
    color = []
    for s in xrange(0,len(sorder)):
        color.append([])
        for v in xrange(2,len(sorder[s]),3): #start on 3 vertice, the altitude
            val = (sorder[s][v]/theight+1)/2.0 #map in range 0,1
            for colr in cs.hsv_to_rgb(0.5,1,val): #get rgb
                color[s].append(int(colr*256))
    for s in xrange(0,len(sorder)):
        sorder[s] = tuple(sorder[s][0:3] + sorder[s] + sorder[s][-3:])
        color[s] = tuple(color[s][0:3] + color[s] + color[s][-3:])
        vlb.add(2*vcmax+2, pyglet.gl.GL_TRIANGLE_STRIP, None, ('v3f', sorder[s]), ('c3B', color[s]))
    return vlb

world = trimesh(90,90,10, 0,-400, narray, 50)

def display():   
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
    glShadeModel(GL_SMOOTH)
    glLoadIdentity()

def reshape():
    glShadeModel( GL_FLAT )
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(120., win.width / float(win.height), .1, 1000.)
    glMatrixMode(GL_MODELVIEW)
    glTranslatef(0.,0.,-100.)
    glRotatef(0,1,0,0)

a, b, = win.width/2, win.height/2 #this stores mouse position
k = 0.01 #sensitivity
gx = 0 #this stores the angle
gy = 0 #this also stores the angle
dx = 0 #default xpos #positive is rightward
dy = 0 #default ypos #positive is forward
dz = 0 #default zpost #positive is up

@win.event
def on_mouse_motion(x, y, dx,dy): #No effect?
    k = 7
    global a, b
    a += dx*k
    b += dy*k
    return pyglet.event.EVENT_HANDLED

fps_display = pyglet.clock.ClockDisplay()

@win.event
def on_draw():
    global a, b, k, gx, gy, dx, dy, dz
    display()
    reshape()
    win.clear()
    #
    glMatrixMode(GL_MODELVIEW)
    gx += -k*(a-win.width/2) #if mouse on right side of screen, gx will be positive. If left, gx is negative
    gy += -k*(b-win.height/2) #if mouse on top of sceen, gy will ne positive. If bottom, gy is negative
    a, b, = win.width/2, win.height/2 #reset positions so scene does not move
    #
    glRotatef(gy,1,0,0)
    glRotatef(-gx,0,0,1)
    glTranslatef(-dx, -dy, -dz)
    #
    world.draw()

def move(dt):
    global gx, gy, dx, dy, dz
    held = kb[pyglet.window.key.W]
    kt = 3
    if held:
        heading = (gx+90) % 360
        pitch = (270-gy) % 360
        dz += math.sin(pitch*math.pi/180)*kt
        comp = math.cos(pitch*math.pi/180)*kt
        dx += comp*math.cos(heading*math.pi/180)
        dy += comp*math.sin(heading*math.pi/180)
   
pyglet.clock.schedule_interval(move,1.0/120.0)

pyglet.app.run()

demo
smoothpy (http://www.youtube.com/watch?v=HfKfzhrLHn4#ws)
Title: Re: Coding
Post by: atomic7732 on January 03, 2014, 11:57:58 PM
My first actual legitimate program release!

imgget v1.0

I've created a simple file downloader that you eternally run to download files for you! It is meant for files that update frequently (more frequently than once a day) so that it will catch them when you're not around.

Operation:

1. Configure the config.txt file so that it links to a url you want to download and after the comma, include the filename that you want it to download as before the timestamp. So if you put "foobar" then it will download as "foobar20140101_1830", so you may want to put "foobar_".
2. You will unfortunately manually have to download your first file (save it with the correct filename in which you want all the other files), and enter the timestamp into the list in lastdownload.txt. Not too difficult though.
3. Run, and it should do all the work for you. It shows simple status messages to let you know everything is (or is not) working okay.
Title: Re: Coding
Post by: atomic7732 on January 13, 2014, 05:57:10 PM
I am amaze at my PHP skills.

I got a webpage to read an advisory from an entirely different website, and find a storm name and number, which i can now modify to look more presentable.

Code: [Select]
<?php
copy
('http://weather.noaa.gov/pub/data/raw/wt/wtio30.fmee..txt','wtio30.txt');

$handle fopen("wtio30.txt""r");
if (
$handle) {
    while ((
$line fgets($handle)) !== false) {
        echo 
$line;
        echo 
'<br />';
    }
} else {
    echo 
'Error reading file.';
}

echo 
'<br /><hr /><br />';

$handle fopen("wtio30.txt""r");
if (
$handle) {
    while ((
$line fgets($handle)) !== false) {
        if (
preg_match('/1.A/'$line$matches)){
            echo 
$line;
            echo 
'<br />';
            echo 
substr($line4).'<br />';
            
preg_match('/ [0-9] /'$line$sn);
            echo 
'Storm Number: '.$sn[0].'<br />';
            
preg_match('/\([A-Z]+\)/'$line$name);
            
$temp substr($name[0], 1strlen($name[0])-2);
            echo 
'Storm Name: '.substr($temp01).strtolower(substr($temp1));
        }
    }
} else {
    echo 
'Error reading file.';
}

?>

I'm going to use this to create a database which just records all updates to relevant cyclone files... basically pywx online. And no python.
Title: Re: Coding
Post by: vh on January 13, 2014, 06:15:33 PM
woah that color coding...
Title: Re: Coding
Post by: atomic7732 on January 13, 2014, 08:00:25 PM
apparently SMF has it built in to color PHP
Title: Re: Coding
Post by: blotz on January 14, 2014, 04:53:41 PM
atomic tell me where do you even put php
Title: Re: Coding
Post by: atomic7732 on January 14, 2014, 07:44:44 PM
PHP works on a web server to create a webpage that isn't necessarily the same every time you call it. A normal HTML webpage will always be the same unless someone changes the way it's written so that it looks different, but 5 years down the road, someone can request the page and it will be the same as it was 5 years ago. PHP can do stuff like look up information in databases or other dynamic things that may have the page end up different based on user input or something that changed.

I don't know if you wanted an explanation on PHP as well, but there you have it.
Title: Re: Coding
Post by: blotz on January 15, 2014, 04:46:47 AM
ok so it's a thing to put on a webpage k thx
Title: Re: Coding
Post by: tuto99 on January 15, 2014, 12:44:46 PM
ok so it's a thing to put on a webpage k thx
You have learned a lot
Title: Re: Coding
Post by: vh on January 18, 2014, 05:34:00 AM
erosion simulator. requires matplotlib and numpy

you can use it without matplotlib or numpy if take them out in the code and delete the display and update functions. then you'd need someone to plot it for you

before
(http://i.imgur.com/secnegG.png)
after
(http://i.imgur.com/ArWChOn.png)

usage guide to erosim

first we make the landscape with random walk

Code: [Select]
import random
walker = 0
path = []
for x in xrange(0,400):
walker += random.random()-random.random()
path.append(walker)

now we have to match the end of the path up to the beginning. if we don't there is a large discontinuity and the erosion will exponentially grow bigger, causing an overflow error.

Code: [Select]
slope = (path[-1]-path[0])/400
we subtract the slope so that it becomes flat
Code: [Select]
for x in xrange(0,400):
t[x] -= slope*x
   
and now set the minimum to zero.

Code: [Select]
t = [val-min(t) for val in t]
all of the above can be written into a function of course, so you don't have to type it in every time.
navigate to the correct directory with os and execute the file
Code: [Select]
import os
os.chdir('c:\\users\\kolkon\\desktop\\erosim')
execfile('erosim.py')

then we create a world. we must give the elevation map, flow rate, erosion rate, evaporation rate, rock hardness, and rain amount in that order.
here is a sample that works relatively well. notice we use list(t).

Code: [Select]
g = World(list(t), 0.2, 10.0, 0.01, 5.0, 1.0)   
lets take a look
   
Code: [Select]
g.display()   
now we run the simulation, eroding and making it rain periodically. make sure there isn't already too much water when you add more or everything will flood
Code: [Select]
for x in xrange(0,10000):
if not(x%100) and max(g.water) < 1:
g.rain()
g.erode()
   
lets see how it went

Code: [Select]
g.update()
and there we are.
Title: Re: Coding
Post by: Bla on January 18, 2014, 06:32:04 AM
Map War 3 - now with erosion!
Title: Re: Coding
Post by: blotz on January 18, 2014, 06:33:39 AM
barbaria erosion >:D
Title: Re: Coding
Post by: vh on January 18, 2014, 07:23:05 AM
instead of subtracting the water from and right and water from the left, a typo caused only water to be subtracted from the right which caused a strange flow error. that and other things fixed here.
Title: Re: Coding
Post by: vh on January 19, 2014, 08:29:46 AM
draft of a new project. puts organisms in a environment and evolves their code

Code: [Select]
import numpy as np
import math

class Cell:
    def __init__(self, position, world):
        #self.center = position
        #self.blocks = [position]
        #world.cells.append(self)
        #self.energy = world.initenergy
        #self.inst = Code()
    def step(self):
        #try:
            #self.Code.run()()
        #except:
            #pass
    def grow(self):
        #while 1
            #pick random cell
            #check if it has any edges
            #pick random edge and fill
    def move(self):
        #call position on world class
    def make(self):
        #mutate code, place in front
    def eat(self):
        #of the objects touching, dissapear one
        #add energy
    def atk(self):
        #of the objects touching, dissapear one cell
        #make sure to call that cell and split
        #convert to food
    def see(self):
        #touching search
        #also farthest search
    def turn(self):
        #rotate direction so that movement is different

class Code:
    oplist = [Cell.grow, Cell.move, Cell.make, Cell.eat, Cell.atk, Cell.see]
    loops = ['for', 'if', 'while']
    conditional = [Cell.size, Cell.energy, Cell.sight, Cell.danger]
    other = ['break', 'pass']
    def __init__(self):
        self.topnode = {None:[]}
    def codeiterate(self, function):
        #queue root node
        #while queue
            #pick node in queue
            #visit node and apply function to it
            #add all children to queue
            #delete node from queue
    def shuffle(self):
        #use codeiterate and call random.shuffle on a list
    def prune(self):
        #probablility of deleting random code with codeiterate
    def mutate(self):
        #swap out and switch 'for', 'if', and 'while' while codeiterating
    def clone(self):
        #duplicate lines while codeiterating
    def mix(self, other):
        #not sure yet
    #def dfs(self, graph, string):
        #string = graph.keys()[0]
        #if not(graph[string]):
            #return nullstring
        #for k in graph[string]:
            #indented add dfs(graph, string)
        #return string
    def run(self):
        #inst = exec(dfs(self.topnode))
        #return inst

class World:
    def __init__(self, size, initenergy, decayrate, toroidal = True, solar):
        #self.grid = np.zeros(size)
        #self.cells = []
        #self.initenergy = initenergy
        #self.decayrate = decayrate
        #self.toroidal = toroidal
        #self.solar = solar
    def move(self, obj):
        #check collision
        #move if possible
    def step(self):
        #for each cell
        #run decay, solar, etc
        #run code
Title: Re: Coding
Post by: atomic7732 on January 23, 2014, 10:47:17 PM
Progress on my map plotter!

Unfortunately it took 10 minutes just to generate this pretty crude image:

note to self: latitude lines
Title: Re: Coding
Post by: vh on January 24, 2014, 05:30:46 AM
no code?
Title: Re: Coding
Post by: vh on January 24, 2014, 07:29:27 PM
27 line alternative solution. readme in the code. generates full world resolution map in about 10 minutes if you have enough ram (that'll be 180,000 pixels by 90,000 pixels)

sample image here at scaling = 300 of europe
https://www.dropbox.com/s/8q471ypp753sv17/wmap.png (https://www.dropbox.com/s/8q471ypp753sv17/wmap.png)
Title: Re: Coding
Post by: atomic7732 on January 24, 2014, 09:39:08 PM
(http://paladinofstorms.net/ptpc/2013/w/wp35_graphic.png)

It looks pretty horrible but I'm not sure how to improve it...
Title: Re: Coding
Post by: Darvince on January 24, 2014, 11:28:10 PM
Is that super doge Haiyan
Title: Re: Coding
Post by: vh on January 25, 2014, 12:56:12 AM
suppose you had some unknown code, statement, or function that you wanted to run. the source of this might come from a variety of places. randomly generated code, user input code, mathematical expressions from an irc bot -- and on and on.

now also suppose you wanted to run a lot of these codes or functions. perhaps 10 or a hundred or a thousand at a time. this is useful if you had an irc calculator that needed to keep reading the chat while processing.

well, i've written a function to do so. the three arguments are time, the function, and the arguments:

Code: [Select]
import os
from multiprocessing import Process
import threading
import time

def timeoutprocess(_time, function, arg):
    if __name__ == "__main__":
        import time
        p = Process(target=function, args = arg)
        p.start()
        now = time.time()
        while 1:
            if time.time()-now > _time and p.is_alive():
                try:
                    p.terminate()
                except:
                    pass
            if not(p.is_alive()):
                break

def timeoutthread(time, function, arg):
    t = threading.Thread(target=timeoutprocess, args = (time, function, arg))
    t.start()


here's a short explanation of how this works.
we run the function on a separate process. process and not thread because
1. there is no way to terminate threads in python, but there is a way to terminate processes
2. takes advantages of more cores/parallelization
we can't simply spawn off a new process, we have to spawn the new process in a new thread. this is because there is a while loop inside the thread that keeps track of the time. when time is up, the process is killed. If we didn't use threads, we'd have to compute everything serially and not simulatenously.

and here's an example usage.
Code: [Select]
execfile('tof.py')

def wait(null):
    while 1:
        pass

def test():
    if __name__=="__main__":
        print 'hi', time.time()
        timeoutthread(1,wait,(1,))
        print 'bye', time.time()

for x in xrange(0,10):
    test()
we have a function test. inside that function, we do some things, then spawn off a separate process to take care of a task. note that you need if __name__=="__main__":
this is because python's structured so that the process can only access the code and know what to run by importing the file. however, if it imports the file, it'll also execute the line of code that spawns itself, and processes will keep spawning more processes until the system freezes up.

Title: Re: Coding
Post by: vh on January 31, 2014, 11:16:26 PM
here's an update to my key derivation function. there was a problem before where i was simply adding everything up, so a person could save a lot of memory just by keeping the last sum, which is bad. (because if they save a lot of memory, that means they can run it concurrently on thousands of threads, which defeats the entire point).

however the algorithm is still compute bound. at ten thousand rounds, the algorithm takes about half a minute to run on a single thread and 10MB of memory. I'm shooting for a time of about a second and 1gb of memory

what i plan to do is to reduce the computation time by not hashing all of the previous values, but only some, depending on the value of the last hash

yes i'm aware algohash is the most lame, undescriptive, and incorrect name for a key derivation function ever
Title: Re: Coding
Post by: vh on January 31, 2014, 11:42:19 PM
i've been working on this.

https://github.com/osmotischen/evolve5

Title: Re: Coding
Post by: vh on January 31, 2014, 11:55:11 PM
short piece of code that counts how much code you've written.

Code: [Select]
import os
sum1,sum2=0,0
for f in [val for val in os.listdir(os.curdir) if '.py' in val]:
    with open(f, 'r') as file:
        d = file.readlines()
        sum1 += len(d)
        sum2 += len([val for val in d if ('#' not in val and val)])
print sum1, sum2

the two numbers are total amount and total amount excluding whitespaces and comments
Title: Re: Coding
Post by: vh on February 06, 2014, 04:36:45 PM
this plots a histogram from a one dimensional dataset. except it's smoooooth

more like a density function
Title: Re: Coding
Post by: vh on February 06, 2014, 08:06:12 PM
after a few hours of experimentation and a new folder dedicated to plotting i've completed my minimalist density curve plotter in python.

i'll be adding an option for standard deviation and mean. right now zero looks pretty ugly
Title: Re: Coding
Post by: atomic7732 on February 06, 2014, 08:08:03 PM
wow that looks cute
Title: Re: Coding
Post by: Bla on February 07, 2014, 06:25:48 AM
MatLab (http://en.wikipedia.org/wiki/MATLAB) has many of those functions, actually a very cool program and programming language. It has an std() function for finding standard deviation.
I once made a time dilation visualizer in it and a program for finding a minimum in functions of 1 and 2 variables.

But I'm pretty sure it isn't free, I got a license from university.
Title: Re: Coding
Post by: vh on February 07, 2014, 12:49:12 PM
ha. the module i (and most other people) use for plotting, matplotlib, is basically just matlab's plotting functions imported to python


you should upload that time dilation ponyer
Title: Re: Coding
Post by: vh on February 07, 2014, 12:53:51 PM
I ALWAYS THOUGHT DILATION WAS SPELLED DIALATION LIKE "TURN THE DIAL TO THE TIME MACHINE QUICK!"
Title: Re: Coding
Post by: FiahOwl on February 07, 2014, 03:28:21 PM
I ALWAYS THOUGHT DILATION WAS SPELLED DIALATION LIKE "TURN THE DIAL TO THE TIME MACHINE QUICK!"

SAME OH MY LORD WHAT
Title: Re: Coding
Post by: Bla on February 07, 2014, 03:55:28 PM
Here it is:

Time Dilation Visualization (http://www.youtube.com/watch?v=FL1c_l7pEU8#ws)

The code:

Code: [Select]
% Timestep
dt = 0.025;
% Properties of clocks
x1 = 0;     y1 = 1;
x2 = 0;     y2 = 2;         vx2 = 0.75;     t2 = 0;
x3 = 0;     y3 = 3;         vx3 = 0.95;     t3 = 0;
% Properties of light particles in clocks
x1l = 0;    y1l = y1-0.25;                  vy1l = 1;
x2l = 0;    y2l = y2-0.25;  vx2l = vx2;     vy2l = sqrt(1-vx2.^2);
x3l = 0;    y3l = y3-0.25;  vx3l = vx3;     vy3l = sqrt(1-vx3.^2);
% Properties of light wave (black line)
xl = 0;                     vxl = 1;
% Gamma factor of clocks
g2 = 1/sqrt(1-(vx2.^2));
g3 = 1/sqrt(1-(vx3.^2));
% Figure properties
scrsz = get(0,'ScreenSize'); % Get screen resolution
figure('OuterPosition',[0 50 scrsz(3) scrsz(4)-50]) % Figure window set to fill the screen except bottom 50 pixels
for t=0:dt:10
    plot(x1, y1, 'sr', 'MarkerFaceColor', 'r', 'MarkerSize', 1); hold on; % This ensures that the plot works
    % Feynman-clock rectangles
    patch([x1-0.1 x1-0.1 x1+0.1 x1+0.1],[y1-0.25 y1+0.25 y1+0.25 y1-0.25],'r');
    patch([x2-0.1 x2-0.1 x2+0.1 x2+0.1],[y2-0.25 y2+0.25 y2+0.25 y2-0.25],'g');
    patch([x3-0.1 x3-0.1 x3+0.1 x3+0.1],[y3-0.25 y3+0.25 y3+0.25 y3-0.25],'b');
    % Light particles in clocks
    plot(x1l, y1l, 'sk', 'MarkerFaceColor', 'k', 'MarkerSize', 5);
    plot(x2l, y2l, 'sk', 'MarkerFaceColor', 'k', 'MarkerSize', 5);
    plot(x3l, y3l, 'sk', 'MarkerFaceColor', 'k', 'MarkerSize', 5);
    % Lines at x-axis
    line([x1 x1], [0 0.25], 'Color', 'r');
    line([x2 x2], [0 0.25], 'Color', 'g');
    line([x3 x3], [0 0.25], 'Color', 'b');
    line([xl xl], [0 0.25], 'Color', 'k');
    hold off;
    % Axis properties
    axis([-0.5, 10.5, 0, 4]) % Format: [xmin, xmax, ymin, ymax].
    xlabel('x-distance [ct]') % X-axis label.
    ylabel('y-distance [ct]') % Y-axis label.
    set(gca,'ytick',[0 0.5 1 1.5 2 2.5 3 3.5 4])
    set(gca,'xtick',[-0.5 0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 7 7.5 8 8.5 9 9.5 10 10.5])
    % Display text in plot
    text(x1, 0.5, ['Black line (light), velocity = ', num2str(1),' c'])
    text(x1, y1+0.5, ['Red Feynman clock, velocity = ', num2str(0),' c, gamma = ', num2str(1),' time = ', num2str(round(t*10)/10),' s'])
    text(x1, y2+0.5, ['Green Feynman clock, velocity = ', num2str(vx2),' c, gamma = ', num2str(round(g2*10)/10),' time = ', num2str(round(t2*10)/10),' s'])
    text(x1, y3+0.5, ['Blue Feynman clock, velocity = ', num2str(vx3),' c, gamma = ', num2str(round(g3*10)/10),' time = ', num2str(round(t3*10)/10),' s'])
    % Display time next to objects
    text(x1+0.25, y1, [num2str(round(t*10)/10),' s'])
    text(x2+0.25, y2, [num2str(round(t2*10)/10),' s'])
    text(x3+0.25, y3, [num2str(round(t3*10)/10),' s'])
    drawnow();
    % Update x-coordinates of moving frames and lightwave
    x2 = x2 + vx2*dt;
    x3 = x3 + vx3*dt;
    xl = xl + vxl*dt;
    % Update time for moving frames
    t2 = t2 + dt/g2;
    t3 = t3 + dt/g3;
    % Update coordinates of light particles in clocks
    y1l = y1l + vy1l*dt;
    x2l = x2l + vx2l*dt;
    y2l = y2l + vy2l*dt;
    x3l = x3l + vx3l*dt;
    y3l = y3l + vy3l*dt;
    % Make light particles in clocks bounce (reverse velocities)
    if (y1l >= y1+0.25) || (y1l <= y1-0.25)
        vy1l = vy1l*(-1);
    end
    if (y2l >= y2+0.25) || (y2l <= y2-0.25)
        vy2l = vy2l*(-1);
    end
    if (y3l >= y3+0.25) || (y3l <= y3-0.25)
        vy3l = vy3l*(-1);
    end
    % Pause at start
    if t == 0
        pause(2);
    end
end
Title: Re: Coding
Post by: vh on February 07, 2014, 09:02:31 PM
another framework for musics and sample
Title: Re: Coding
Post by: vh on February 08, 2014, 10:03:02 PM
here's a text editor in python. it's pretty basic and i hacked it together in about half an hour but it does have some features

it'll print out how many characters of text you have every hundred seconds, which is useful for seeing how much you've done

the first ten characters (or less) of the first line becomes the title

backups are saved every hundred seconds with the title and the timestamp
the editor also records how much text you have every second and writes it to a log every hundred seconds.

of course put this in a folder before using -- it spawns about 72 files per hour. which probably need to be frequently cleared. in anycase i just wanted to see how my writing speed is over the course of a research paper

requires tkinter which is probably installed already
Title: Re: Coding
Post by: vh on February 10, 2014, 01:55:34 PM
and here are the results of the above experiment with time on the x axis and characters on the y axis. if you download the svg you can actually zoom it and see the individual seconds.
(https://dl.dropboxusercontent.com/u/42218552/writingdat.svg)
Title: Re: Coding
Post by: vh on February 11, 2014, 10:54:20 PM
Code: [Select]
import numpy as np

def a_rk4(h, t, v, f): #t is a scalar, v is a vector, f is a function of a vector, h is a function of a scalar
    s = h(np.linalg.norm(f(v)))
    k1 = f(t, v)
    k2 = f(t+s/2,v+s*k1/2)
    k3 = f(t+s/2,v+s*k2/2)
    k4 = f(t+s,v+s*k3)
    return v + h*(k1+2*k2+2*k3+k4)/6

adaptive runge kutta integrator. i'll explain how it works
t is the variable you're integrating with respect to, in most cases, time.
v is the vector. it could just be x, or [x,y], or [x,y,z] for a 3d gravity simulator
f is a function of vector v, in the case of gravitational attraction to the origin it might be 1/(x**2+y**2)
of course if you have multiple points you'll have to loop over them and get the sum.
h is the adaptive time step. for example, you might set it to be 1/x, so time step is inversely proportional to force, so that accuracy is maintained

if you see i multiply and add the vectors using numpy arrays. it would be possible to do so without numpy but then i'll also have to add an argument for an adding and multiplying function and this is just simpler i think
Title: Re: Coding
Post by: vh on February 12, 2014, 06:50:21 PM
https://dl.dropboxusercontent.com/u/42218552/field%20(1).png (https://dl.dropboxusercontent.com/u/42218552/field%20(1).png)

http://zoom.it/2wm6 (http://zoom.it/2wm6)
Title: Re: Coding
Post by: Bla on February 13, 2014, 04:53:07 AM
Amazing
Title: Re: Coding
Post by: atomic7732 on February 13, 2014, 06:54:41 AM
that makes a lot more sense than the wierd swirlies you had
Title: Re: Coding
Post by: vh on February 15, 2014, 12:26:48 PM

movie coder/decoder in python
i suspect there's an error i haven't found but i'm done with this project
the code is unreadable btw

i created a custom movie codec and it is really buggy. (http://www.youtube.com/watch?v=HqRZo34ZSpk#ws)
Title: Re: Coding
Post by: vh on February 15, 2014, 02:31:12 PM
niceplot2 with some updates

-you can pick font size now
-unicode support
-option to automatically plot ticks at mean and standard deviations
-bounds of plot is not determined by numbers but my standard deviations
-bounds of plot do not have to be symmetric anymore
-ticks can have custom labels

sample included
Title: Re: Coding
Post by: matty406 on February 15, 2014, 03:10:49 PM

movie coder/decoder in python
i suspect there's an error i haven't found but i'm done with this project
the code is unreadable btw

i created a custom movie codec and it is really buggy. (http://www.youtube.com/watch?v=HqRZo34ZSpk#ws)
It's perfect don't change anything
Title: Re: Coding
Post by: vh on February 18, 2014, 06:14:02 PM
polygon collision detection that comes with examples. you can just run the script
Title: Re: Coding
Post by: vh on February 21, 2014, 02:58:47 PM
Code: [Select]
import numpy as np
import math

n_body = lambda bodies, accel_function = lambda a, b: (a[4]+b[4])/math.sqrt((a[0]-b[0])**2 + (a[1]-b[1])**2), dintegrator = lambda a, b, t, f, d: lambda a, b, t, f, d, integrator = lambda a, b, t, f, d: np.concantenate(a[:2],a[2:4]+[np.cos(d), np.sin(d)]*t*f(a,b),a[4:]): np.concantenate(a[:2]+t*a[2:4], a[2:]), timestep = 1.0: map(lambda a: np.concantenate(a[:4]+sum((dintegrator(a, b, timestep, accel_function, d = math.atan2(a[1]-b[1], a[0], b[0])) for b in bodies)), a[4:]), bodies)

#body is in the format [posx, posy, velx, vely, mass, ...]
#all vectors are numpy arrays

a one line n-body simulator (aka gravity sim).
Title: Re: Coding
Post by: vh on February 21, 2014, 05:50:16 PM
uranium enrichment simulation. completed but there are bugs.

should i continue it?
Title: Re: Coding
Post by: vh on February 22, 2014, 12:00:17 PM
right. update of uranco which actually works now. if you haven't figured it out yet, this is a simulator where you can put together a uranium enrichment cluster and test how well it works. when you run it, four numbers will be shown

Code: [Select]
4761.9047619 0.0077
5238.0952381 0.00636363636364

this means that there are 4761.9 units of ore enriched to 0.0077 and 5238.09 units of ore disposed with 0.00636 enrichment. obviously this isn't a good uranium enricher

does anyone want a gui for this
Title: Re: Coding
Post by: vh on February 22, 2014, 06:42:27 PM
this simulates a crystal growing. i haven't made the graph animated yet, so you'll just have to close the window and another one will pop up. 10 steps are simulated between each stage.

unfortunately the way i structured the code makes it relatively inflexible. the only thing that'll happen is a strangely shaped circle
Title: Re: Coding
Post by: vh on February 24, 2014, 06:34:54 PM
this code illustrates the depletion force which causes particles to be 'attracted' to each other and the edges of the container.

shown are histograms (binned and smoothed) of the location of particle positions. note the exponentially decaying wave

https://en.wikipedia.org/wiki/Depletion_force

i've also updated niceplot two with two more arguments, bw and cov, both of which seem to do the same thing, which is to determine how smooth the gaussian kde is
Title: Re: Coding
Post by: vh on February 25, 2014, 10:01:30 PM
blalert.pyw is a blacraft alert. upon finding that there is a player on the server (after a period where no one is on), it will emit a 3 second long beep. for each additional player that joins, a one second beep will follow.


this should run without a window appearing. if it doesn't work or you want a window remove the w in the fiel name.
Title: Re: Coding
Post by: Darvince on February 25, 2014, 10:09:27 PM
kol a such excellent
Title: Re: Coding
Post by: Bla on February 26, 2014, 01:46:16 PM
Kol, nice program.
I tried double-clicking it, it said a beep-sound when it started, but besides from that I didn't see or notice anything from the program. I tried logging on Blacraft after opening it, it didn't react. I haven't been on Blacraft since the weekend.
Title: Re: Coding
Post by: vh on February 26, 2014, 02:28:58 PM
the problem was that the code thought empty string counted as one player, so even when the server was empty it thought there was someone on. don't know how i missed that bug. here's the fix.
Title: Re: Coding
Post by: vh on February 26, 2014, 03:26:56 PM
cloud coding thingy which comes with a vm to let you run online collaboratively.

referral link (gives me and you an extra 1gb):
https://koding.com/R/osmotischen

you can register with github
Title: Re: Coding
Post by: vh on February 28, 2014, 10:42:13 PM
scrapes historical eod stock market data which you usually can't get for free from yahoo. the symbols.txt file you need is here:
Code: [Select]
ftp://ftp.nasdaqtrader.com/symboldirectory/nasdaqlisted.txt
Title: Re: Coding
Post by: vh on March 04, 2014, 09:28:40 PM
c++ application that computes the number of primes from one to n. run it, then enter the number n, then enter the number of times you want to run it. it is quite optimized. i can't release the source code yet but i will. the first number printed for each trial is the count, the second is the number of miliseconds taken.
Title: Re: Coding
Post by: vh on March 05, 2014, 04:07:08 PM
wrapper for the pycrypto, exchange keys and shit. will be used to send encrypted messages over irc. not tested yet.

https://pypi.python.org/pypi/pycrypto

installation of pycrypto (32 bit python. if you don't use 32 bit python install seperately in a folder such as python27_x86)

download file and extract to c:\python27\lib\site-packages

cd c:\python27\lib\site-packages\pycryptowhatever
python setup.py install


Title: Re: Coding
Post by: vh on March 05, 2014, 09:17:57 PM
Code: [Select]
from collections import namedtuple
screen = namedtuple('screen', ('item','to'))

class Interface:
    def __init__(self, mtext, mid):
        self.main = mid
        self.v = {mid:screen(mtext, [])}
    def addscreen(self, id, item):
        self.v[id] = screen(item,[])
    def connec(self, s1, s2):
        self.v[s1].to.append(s2)
    def disp(self, id):
        itm = self.v[id].item
        if type(item) == str:
            print self.v[id].item
        else:
            self.v[id].item()
        l = len(self.v[id].to)
        for i in xrange(0,l):
            print self.v[id].to[i] +':' + str(i)
        while 1:
            try:
                k = int(raw_input())
                break
            except:
                pass
        if 0 <= k < l:
            self.disp(self.v[id].to[k])
    def startloop(self):
        self.disp(main)

so what is this? an interface of sorts.

normally, if you have a few user inputs for a program, you'd just write them into the function. but supposed your program revolved around text inputs, as in an interactive story or menu selection thing. certainly, all the if statements, loops, and raw_inputs would be confusing.

this class consists of a bunch of screen objects which you can add and connect. Each screen is represented by an id, an item, and a list of connections. the id is a string used to identify the screen, the item is either a function or a piece of text, and the list of connections contains the ids of other screens that can be accessed.

if the item is a piece of text, it will be printed, then the user will choose which screen to go to next.
if the item is a function, it will be executed. however, in order to keep the code concise, i have not allowed any arguments to be passed to the function.

so what if i have a writefile function you say, and you want to pass the filename of log.dat to the function? well, before you add the screen, do this:

Code: [Select]
logwritefile = lambda: writefile('log.dat', raw_input('hi'))and then pass the logwritefile function to the screen creator.

i have to say this is not tested at all but i will be using it soon so if there are bugs they will be fixed
Title: Re: Coding
Post by: vh on March 06, 2014, 06:57:55 PM
if you have a bunch of python programs you run simultaneously, like an irc bot, a web scraper, imgget, a key logger, or whatever, this script runs them all on threads which means they will only ever take up one cpu core.

many pieces of code where you have
while time.time()-start < 1:
or something similar, this while loop can eat up a lot of cpu power by running very quickly. by threading all the scripts onto one core, the loop is slowed down, which means less cpu use with the same performance

Code: [Select]
import threading

names = ['agent.py', 'crypto.py', 'interface.py', 'top.py', 'connect.py'] #fill this with a list of whatever shit

tlist = []
for name in names:
    tlist.append(threading.Thread(target = lambda : execfile(name)))
for thread in tlist:
    thread.start()
Title: Re: Coding
Post by: vh on March 07, 2014, 07:46:53 PM

a few months later i've started coding the majority of it. here's another view of how it works again
Title: Re: Coding
Post by: vh on March 29, 2014, 10:37:30 PM
i present to you the 150 line "HelloWorld" program in opencl. well actually it's a bit more complicated. the program takes the string "GdkknVnqkc", then adds 1 to all the ascii values, and prints the result.

here's the heavily commented main code

Code: [Select]
#include "stdafx.h" //standard something
#include <stdlib.h> //standard library
#include <string.h> //for string
#include <stdio.h> //standard input and output
#include <iostream> //input output stream
#include <string> //also for string
#include <fstream> //file stream
#include <CL/cl.h> //for opencl

using namespace std; //we don't have to type std every time

int convertToString(const char *filename, string& s){
//filename is the name of the file
//s the address of the string

size_t size; //an unsigned long long int that contains size of object
char * str; //initialize pointer str

fstream f(filename, (fstream::in | fstream::binary));
//make f a file object with the filename and mode is input and binary

if(f.is_open()){ // if file opened
size_t fileSize; //unsigned long long int that contains size of file object
f.seekg(0, fstream::end); //go to the end of the file, then offset by zero
size = (size_t)f.tellg(); //get the current position, convert it to type size_t, store in size
fileSize = size; //set filesize equal to size
f.seekg(0, fstream::beg); //go back to beginning of file and offset by zero
str = new char[size+1]; //initialize array of characters just big enough to store the file

if(!str){ //if the array is empty
f.close(); //close the file
return 0; //signifies success
}else{ //if the array is not empty
f.read(str, fileSize); //read the file until the end, store it in the char array
f.close(); //close the file
str[size] = '\0'; //set the last character to 0, termiating the string

s = str; //put the character array into s
delete[] str; //delete str, saves memory
return 0;//success
}
}else{ //the file did not open
return 1; //1 signifies failure
}
}

int main(){ //the main program or whatever
cl_uint numPlatforms; //number of platforms stored as a unsigned cl integer
cl_platform_id platform = NULL; //set the platform to none or something
cl_int status = clGetPlatformIDs(0,NULL,&numPlatforms);//get the platform id of null, assign it to numplatforms

if(status != CL_SUCCESS){ //if the platform failed
return 1; //failure
} //if it did not fail
if(numPlatforms > 0){ //if more than one platform available
cl_platform_id* platforms = (cl_platform_id* )malloc(numPlatforms* sizeof(cl_platform_id));
//allocate an array to store all the platform IDs
status = clGetPlatformIDs(numPlatforms, platforms, NULL); //put all the platforms ids into the array
platform = platforms[0]; //set the platform to the first platform found
free(platforms); //unallocate the array from before
}

cl_uint numDevices = 0; //zero devices
cl_device_id *devices; //stores device ids
status = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 0 , NULL, &numDevices);
//get devices of type gpu, available on platform, of type gpu, and store the number in numDevices

if(numDevices == 0){//there are no gpus
status = clGetDeviceIDs(platform, CL_DEVICE_TYPE_CPU, 0, NULL, &numDevices);
//get the devices of type cpu, available on platform, and store number in numdevices
devices = (cl_device_id*)malloc(numDevices * sizeof(cl_device_id));
//allocate an array to store all the devices
status = clGetDeviceIDs(platform, CL_DEVICE_TYPE_CPU, numDevices, devices, NULL);
//store the devices into the devices array
}else{//there are at least 1 gpu
devices = (cl_device_id*)malloc(numDevices * sizeof(cl_device_id));
//allocate an array to store all the devices
status = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, numDevices, devices, NULL);
//store all the devices into the devices array
}

cl_context context = clCreateContext(NULL,1, devices,NULL,NULL,NULL);
//create a context with one device, and pass the devices to it

cl_command_queue commandQueue = clCreateCommandQueue(context, devices[0], 0, NULL);
//create a command queue, give it the context, and the first devices

const char *filename = "HelloWorld_Kernel.cl"; //the name of the file where the kernel is stored
string sourceStr; //initialize the string that will store the code
status = convertToString(filename, sourceStr); //get the code, place it in sourceSTR

const char *source = sourceStr.c_str(); //get a pointer to the string containing the kernel
size_t sourceSize[] = {strlen(source)}; //array of length 1 containing the size of the kernel
cl_program program = clCreateProgramWithSource(context, 1, &source, sourceSize, NULL);
//now we create the program with given context, the kernel string, and the size of the kernel

status=clBuildProgram(program, 1,devices,NULL,NULL,NULL); //build the program for the device

const char* input = "GdkknVnqkc"; //initialize an object that is the same size of helloworld
size_t strlength = strlen(input); //store the size of this object
char *output = (char*) malloc(strlength + 1); //allocate an output one char bigger than input

cl_mem inputBuffer = clCreateBuffer(context, //allocate memory (a buffer)
CL_MEM_READ_ONLY|CL_MEM_COPY_HOST_PTR, //it is read only | copies the input
(strlength + 1) * sizeof(char), //the size enough to contain hello world
(void *) input, //and give it a pointer to the input
NULL);
cl_mem outputBuffer = clCreateBuffer(context, //allocate memory ( a buffer)
CL_MEM_WRITE_ONLY , //it is write only
(strlength + 1) * sizeof(char), //size enough to contain hello world
NULL, NULL);

cl_kernel kernel = clCreateKernel(program,"helloworld", NULL); //create the kernel object with hello world string

status = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&inputBuffer); //set the kernel's in buffer
status = clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&outputBuffer); //set the kerels' out buffer

size_t global_work_size[1] = {strlength}; //use as many workers as there are characters
status = clEnqueueNDRangeKernel(commandQueue, kernel, 1, NULL, global_work_size, NULL, 0, NULL, NULL);
//send the instructions to the workers using the specified command queue, kernel, and worksize
status = clEnqueueReadBuffer(commandQueue, outputBuffer, CL_TRUE, 0, strlength * sizeof(char), output, 0, NULL, NULL);
//read back in the data with command queue, the output buffer, put the memory into the output string

output[strlength] = '\0'; //add terminating character to the output
printf(output); //print the string
printf("\n");

status = clReleaseKernel(kernel); //release kernel
status = clReleaseProgram(program); //release the program object
status = clReleaseMemObject(inputBuffer); //release input buffer
status = clReleaseMemObject(outputBuffer); //release output buffer
status = clReleaseCommandQueue(commandQueue); //release command queue
status = clReleaseContext(context); //release the context
if (output != NULL){ //if the output contains a string
free(output); //remove it
output = NULL; //dereference the pointer
}
if (devices != NULL){ //if devices exist
free(devices); //free the devices
devices = NULL; //dereference the pointer
}
system("pause"); //makes sure the window doesn't close out immediately
return 0; //signifies success
}

and here's the kernel, which is used on 10 of your gpu/cpu/whatever cores

Code: [Select]
__kernel void helloworld(__global char* in, __global char* out) //make a kernel function
{
int num = get_global_id(0); //read in the id
out[num] = in[num] + 1; //get the character, add one
}
Title: Re: Coding
Post by: vh on March 30, 2014, 12:32:59 AM
please read this article on brainfuck, i promise it's painless: https://en.wikipedia.org/wiki/Brainfuck

so this is a brainfuck interpreter i coded. just double click on it, and you can start typing brainfuck in. it stores all the code you've typed in until you enter a blank line, then executes. if there are any problems, they'll be printed. if you want to clear the cells, type NIL to restart everything.

here's some sample code you can try:

Code: [Select]
+++++[>+++++++++++++<-]>.this first sets the first cell to five. then, it decreases the first cell and increase the second cell by 13 in a loop which executes five times. 5*13 = 65. we shift back to the second cell and print 65, which is ascii character 'A'

this is hello world:
Code: [Select]
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
Title: Re: Coding
Post by: vh on March 31, 2014, 02:05:53 PM
this is an idiotproof mob farm calculator which simulates five minutes of spawning and despawning in a few seconds. just click to run.

curiously, the simulation suggests that large mob farms near the ground should not kill the mobs as quickly as possible, a slightly longer time gives up to a 50% increase in kill rate

bla's farm should get 3 mobs per second with one player on, and 3.7 seconds with 3 players on
the destroyed farm in desertopia would have gotten .6 per second with one player on, and .8 with 3 players on
a 2000-piston mob farm in the sky would get 2.8 mobs per second with one player on, but only .33 with 3 players on.
Title: Re: Coding
Post by: vh on April 02, 2014, 09:37:07 PM
brainfuck program to print the fibonacci sequence wrote with explanation

Code: [Select]
+>+[[->+<]<[->>+<<]>>.]

+>+ initialize the first two cells a1, a2
[ add a_n-1 and a_n-2 in a loop
[->+<] subtract a_n-1 and add to a_n, stopping when a_n-1 is zero
< shift from a_n-1 to a_n-2
[->>+<<] subtract a_n-2 and add to a_n, stopping when a_n-2 is zero
>> shifts over to a_n which becomes a_n-1 in the next loop
. output which doesn't actually print the number
] since a_n is never zero, loop does not terminate
by the way, this code doesn't work but i'm too lazy to fix it
Title: Re: Coding
Post by: vh on April 05, 2014, 07:29:46 PM
pycollective. just extract the folder to whereever.

open the file with notepad and edit the player variable with your own blacraft nickname (for bla it would be "Comrade Blanoxium" or something).

drag a shortcut into the startup folder to make it run on startup.


in blacraft, whenever you remove something from your collective storage chests, type something like

! cobblestone -1000

or

! lapis +1000

at the end of the month, open the file, and all the changes will be added up. you'll need to reset the log manually

if you don't mind the black terminal, you can rename .pyw to .py so you'll know if it stops working for some reason.
Title: Re: Coding
Post by: Bla on April 05, 2014, 07:58:37 PM
Holykol that sounds super kolvenient, thanks for developing that! Definitely going to try that.

Where's the startup folder? For startup in Minecraft or Wind dose?
Title: Re: Coding
Post by: vh on April 05, 2014, 08:03:18 PM
for windows

i'm just following this page:

http://windows.microsoft.com/en-us/windows/run-program-automatically-windows-starts#1TC=windows-7

haven't done it myself so i don't know where it is :P

edit:

also keep in mind this only works if dynmap is turned on.
Title: Re: Coding
Post by: Bla on April 06, 2014, 09:14:33 AM
Here's a tutorial for how to do it in Windows 8:

http://www.tech-recipes.com/rx/28206/windows-8-how-to-add-applications-startup-folder/
Title: Re: Coding
Post by: vh on April 10, 2014, 03:30:22 PM
i forgot to mention, you have to clear the logs before you use it because i forgot to do that after i finished testing.

------------------

i coded a taylor polynomial grapher. to use it, just type in something formatted like the following

function, degree, center, x1, x2

for example:

lambda x: airy(x)[1], 100, 0, -7,7

which plots the imaginary part of the airy function along with a 100th degree taylor approximation centered at 0 from -7 to 7 as shown below

right now the derivative is numerically approximated so any degree over 20 is pretty much useless. i might try symbolic derivatives later

if you try logs and other function with domain holes it acts strangely and might print errors

edit: added the code. scipy, numpy, and matplotlib needed.
Title: Re: Coding
Post by: vh on April 10, 2014, 09:52:34 PM
fixed code above so a center other than zero works.

also adjusted the derivative calculator so it can handle functions like log(x+1) better and cbrt(x)
Title: Re: Coding
Post by: vh on April 13, 2014, 09:08:41 AM
protip: scipy's scipy.stat.norm.pdf is a very slow approximation for the bell curve, i sped up my code like 10 times by using this:

Code: [Select]
def nfunc(mu, sigma):
    def normpdf(x):
        u = (x-mu)/abs(sigma)
        y = (1/(sqrt(2*pi)*abs(sigma)))*exp(-u*u/2)
        return y
    return normpdf
Title: Re: Coding
Post by: vh on May 17, 2014, 12:58:32 PM
d42758482096b3e

pyimg takes a screenshot, uploads it to imgur, and puts the link in your clipboard whenever you press f9. entire process takes about 1 to 2 seconds on average.

you need a client id to use the application, and each id can upload 1250 images per day. i've posted one above, or you can register for one here: https://api.imgur.com/oauth2/addclient

you'll need a shitload of libraries for this to run though:
pyimgur

win32gui
win32ui
win32con
win32api
pythoncom

(all under the name pywin32)

PIL
pyHook

downloads:

http://www.lfd.uci.edu/~gohlke/pythonlibs/#pywin32
http://www.lfd.uci.edu/~gohlke/pythonlibs/#pyhook
http://effbot.org/downloads#pil

and this one is not a binary

https://pypi.python.org/pypi/pyimgur/0.5.2
Title: Re: Coding
Post by: vh on May 19, 2014, 01:28:40 PM
no one asked but this is a multithreaded version so there is no input lag
Title: Re: Coding
Post by: vh on May 23, 2014, 08:05:46 PM
new version of pyimg.

with this version, the link is instantly (<1ms) copied onto your clipboard. however, the link points nowhere for the first few seconds. this probably will not be an issue as no one clicks on irc links that fast (i hope).
Title: Re: Coding
Post by: blotz on May 25, 2014, 06:35:34 AM
is it just me or does ink scape use .py files so it uses python???
Title: Re: Coding
Post by: vh on June 12, 2014, 10:44:33 PM
haskell is really cool.

random number gen i coded

Code: [Select]
lehmer :: [Int] -> Int -> Int -> Int -> Int -> [Int] --list of random integers
lehmer [] seed maxp mult len = lehmer [seed] seed maxp mult (len - 1)
lehmer k seed maxp mult len = if len > 0
then lehmer ((lehmerl (head k) maxp mult) : k) seed maxp mult (len - 1)
else k

lehmerl :: Int -> Int -> Int -> Int -- generate next element on list
lehmerl prev maxp mult = mod (mult * prev) maxp

randmax :: Int -> Int -> [Int]
randmax max len = [mod i max | i <- (lehmer [] 65537 2147483647 16807 len)]

from 0 to 100 w/ 1000 samples
Title: Re: Coding
Post by: vh on June 15, 2014, 02:29:03 PM
simulation of a column of leaves collapsing into saplings. until the very end, the pattern is surprisingly linear.

i also wrote a few functions to simulate the collapse when collapse is proportional to the drop stacked on each block and also inversely proportional.
Title: Re: Coding
Post by: blotz on June 15, 2014, 02:50:42 PM
.
Title: Re: Coding
Post by: vh on June 17, 2014, 07:10:56 AM
spoiler maker, which turns easily formatted paragraphs into html spoilers

usage example:
Code: [Select]
execfile('htmlrender.py')
awrite('demo.txt', 'demo.html')

demo.txt and demo.html are attached

note that all titles must be globally unique. i might fix this in the future but it will require major restructuring of the code
Title: Re: Coding
Post by: vh on July 02, 2014, 11:07:46 PM
haskell primality tester

i've attached the code and a compiled exe, which tests the number
Code: [Select]
9444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444448484498999and closes upon finding it is a prime

Title: Re: Coding
Post by: vh on July 02, 2014, 11:09:34 PM
this script runs structural tests on a minecraft world and collapses structures that don't stand up to gravity and wind.

the first part opens the file and puts it into an array. this works.

the second part runs the structural tests. this doesn't work.
Title: Re: Coding
Post by: vh on July 02, 2014, 11:11:13 PM
but wait i'm not done

i started coding map war 3 again today, except i started brand new with a new structure. i just have to code in the turn processing and the game rules/settings, then slap on some shiny graphics and we're done!

Code: [Select]
import networkx as nx
import cPickle
import deepcopy

class Zone:
def __init__(self, id, own = None):
self.id = id
self.econ = 0
self.indus = 0
self.fort = 0
self.own = own
self.dist = None #needs to compute
def upg(typ, amount): #bad form?
if typ == 'econ':
self.econ += amount
elif typ == 'indus':
self.indus += amount
elif typ == 'fort':
self.fort += amount

class Nation:
def __init__(self, id, capital, techs):
self.capital = capital
self.id = id
self.mon = 0
self.econ = 0
self.indus = 0
self.mil = 0
self.zones = [self.capital]
self.techs = techs
self.trades = []
def addzone(self, zone):
self.zone.append(zone)
def compstats(self):
self.econ = sum((zon.econ for zon in self.zones))
self.indus = sum((zon.indus for zon in self.zones))
self.mon += self.econ
def convmil(self, amount):
self.mon -= amount
self.mil += amount
def research(self, tree, amount):
self.techs[tree].rsearch(amount)
def addtrade(self, onat):
self.trades.append(onat)

class Tech:
def __init__(self, dflags, cval = 0):
self.cval = cval
self.dflags = dflags
def rsearch(self, amount):
self.cval += amount
def checkflag(self, typ):
return self.dflags[typ](self.cval)

class World:
def __init__(self, zones, edges, tech):
self.zones = zones
self.edges = edges
self.techs = techs
self.nations = []
self.mgraph()
def mgraph(self):
self.graph = nx.Graph()
for node in self.zones:
self.graph.add_node(node)
for edge in self.edges:
self.graph.add_edge(*edge)

class Turn:
def __init__(self, acts): #zacts, wacts, tacts, racts, nacts, oacts
self.acts = acts
def addacts(self, typ, act):
self.acts[typ].append(act)
def removeacts(self, typ, act):
del self.acts[typ][self.acts[typ].index(act)]

def rotlist(lst):
return [lst.pop()]+lst

class Game:
def __init__(self, world, gamerules, tord):
self.history = [world]
self.world = world
self.gr = gamerules
self.tord = reversed(tord)
self.estate = False
def confirm(self):
self.history.append(copy.deepcopy(self.world))
def lastconfirmed(self):
self.world = copy.deepcopy(self.history[-1])
#
def pzacts(self, zacts):
pass
def pwacts(self, wacts):
pass
def practs(self, racts):
pass
def pnacts(self, nacts):
pass
def poacts(self, oacts):
pass
def pturn(self, turnobj):
self.lastconfirmed()
self.turn = self.tord[0]
zacts, wacts, racts, nacts, oacts = turnobj.acts
self.pzacts(zacts) #zone acts
self.pwacts(wacts) #war acts
self.practs(racts) #tech acts
self.pnacts(nacts) #nation acts
self.poacts(oacts) #other acts
if not(self.estate):
self.tord = rotlist(self.tord)
self.confirm()

class Gamerules: #is a class overkill
def __init__(self):
self.settings = {
}
self.rules = {
}
pass

def tofile(instance, file):
with open(file, 'w') as f:
cPickle.dump(instance, f)
Title: Re: Coding
Post by: blotz on July 02, 2014, 11:13:21 PM
inb4 bla
Title: Re: Coding
Post by: vh on July 05, 2014, 10:50:29 PM
keylogger that doesn't log keys, only the time at which keys are pressed. even which key was pressed is not stored

Code: [Select]
import pythoncom, pyHook
import time

times = []
last = time.time()

def tofile(lst):
    with open('ktime.log', 'a') as file:
        file.write('\n'.join([str(val) for val in times])+'\n')

def OnKeyboardEvent(event):
    global times, last
    times.append(time.time())
    if len(times) >= 1000 or time.time()-last > 1000:
        last = time.time()
        tofile(times)
        times = []

while True:
    hm = pyHook.HookManager()
    hm.KeyDown = OnKeyboardEvent
    hm.HookKeyboard()
    pythoncom.PumpMessages()

it's sloppy, but it works.
Title: Re: Coding
Post by: vh on July 06, 2014, 12:35:05 AM
Code: [Select]
d
[0, 'test1.py', True]
[1, 'test2.py', True]
s all
[0, 'test1.py', False]
[1, 'test2.py', False]
r 0
[0, 'test1.py', True]
[1, 'test2.py', False]
r 1
[0, 'test1.py', True]
[1, 'test2.py', True]
k 0
[0, 'test2.py', True]
k 0
d
a test1.py
[0, 'test1.py', True]
a test2.py
[0, 'test1.py', True]
[1, 'test2.py', True]
ponypony
error
i wrote a thing to manage the multiple scripts i like to keep running
think of it like task manager... but better!

here's the manual
Code: [Select]
d
displays running processes

a <file>
adds a new process

s <index>
suspends a process by index. use display to find the index

r <index>
resumes a process

k <index>
kills a process

u <index>
updates the status of a process. unless something went bad this shouldn't be needed

also, instead of using an index, one might use the keyword 'all', which applies the action to all processes.

to run scripts on startup, place them in the scripts list in smanage.py

here's the code along with several test scripts.
Title: Re: Coding
Post by: vh on July 10, 2014, 07:25:53 PM
puzzle. not mindnumbing, but not easy either.
(http://tinyurl.com/274543766554)
Title: Re: Coding
Post by: vh on July 10, 2014, 07:28:51 PM
for bonus points do it functionally.

600 iron prize on blacraft if you finish it within 18 hours of this post
Title: Re: Coding
Post by: vh on July 11, 2014, 09:10:09 PM
snip

i updated smanage.py so that one might put shortcuts to the scripts instead of the actual script. you can now add 'shortcut.lnk' to the list of scripts
Title: Re: Coding
Post by: vh on July 12, 2014, 07:30:24 AM
-

did it

Code: [Select]
compose :: [a -> a] -> (a -> a)
compose fs = foldl (flip (.)) id fs

data Block = Block [[Bool]] Int deriving (Show)

replacen :: Int -> a -> [a] -> [a]
replacen n val (x:xs)
| n == 0 = val:xs
| otherwise = x:(replacen (n-1) val xs)

replace2n :: Int -> Int -> a -> [[a]] -> [[a]]
replace2n n1 n2 val arr = replacen n1 (replacen n2 val (arr !! n1)) arr

setval :: Block -> Int -> Int -> Bool -> Block
setval (Block arr size) n1 n2 val = Block (replace2n n1 n2 val arr) size

getringdict :: Int -> Block -> [(Int,(Int, Int))]
getringdict n (Block arr s) = zip [0..] (c1 ++ c2 ++ c3 ++ c4)
    where
c1 = zip [n..s-n-2] (repeat n)
c2 = zip (repeat (s-n-1)) [n..s-n-2]
c3 = zip [s-n-1,s-n-2..n+1] (repeat (s-n-1))
c4 = zip (repeat n) [s-n-1,s-n-2..n+1]

rraccum :: [(Int,(Int, Int))] -> Int -> (Block, Block) -> (Int,(Int, Int)) -> (Block, Block)
rraccum rposs amount (oblock, nblock) entry = (oblock, setval nblock n1 n2 obool)
    where
        np = mod ((fst entry) + amount) (length rposs)
(n1, n2) = fromJust $ lookup np rposs
(o1, o2) = snd entry
(Block arr s) = oblock
obool = (arr !! o1) !! o2

rotring :: Int -> Int -> Block -> Block
rotring amount ring oblock = snd $ foldl (rraccum rposs dr) (oblock,oblock) rposs
    where
(Block arr size) = oblock
rposs = getringdict ring oblock
dr
    | mod amount 2 == 0 = amount
    | mod amount 2 == 1 = (-amount)


rotate :: Block -> Int -> Block --something with this is wrong
rotate oblock amount = compose (map (rotring amount) [0..div size 2]) $ oblock
where (Block bitarr size) = oblock

haskell is nice.
Title: Re: Coding
Post by: vh on July 19, 2014, 12:41:24 PM
46 lines of church arithmetic in common lisp.

lisp is very messy for my taste

Code: [Select]
(defun church (n)
(labels
((repeat (f x n)
(if (<= n 0)
x
(repeat f (funcall f x) (- n 1)))))
(lambda (f) (lambda (x) (repeat f x n)))))

(defun unchurch (n)
(funcall (funcall n (lambda (x) (+ 1 x))) 0))

(defparameter zero (church 0))
(defparameter one (church 1))
(defparameter two (church 2))
(defparameter three (church 3))

(defun csuc (n)
(lambda (f) (lambda (x)
(funcall f (funcall (funcall n f) x)))))

(defun cadd (n m)
(lambda (f) (lambda (x)
(funcall (funcall m f) (funcall (funcall n f) x)))))

(defun cmul (n m)
(lambda (f) (lambda (x)
(funcall (funcall m (funcall n f)) x))))

(defun cexp (n m)
(lambda (f) (lambda (x)
(funcall (funcall (funcall m n) f) x))))

(defun cpre (n)
(labels (
(extract (k)
(funcall k (lambda (u) u)))
(inc (f)
(lambda (g) (lambda (h)
(funcall h (funcall g f)))))
(const (x)
(lambda (u) x)))
(lambda (f) (lambda (x)
(extract (funcall (funcall n (inc f)) (const x)))))))

(defun csub (m n)
(funcall (funcall n #'cpre) m))
Title: Re: Coding
Post by: vh on July 19, 2014, 04:15:11 PM
remember that keylogger i posted which only records the times you press the key? well when you're playing minecraft and hold down w, a bunch of keys get recorded. but i messed around with the module and found this hidden feature -- if you replace KeyDown with KeyUp, the hook module gets key releases. so yeah.
Title: Re: Coding
Post by: vh on July 20, 2014, 10:40:15 AM
but wait now it tracks mouse presses also
Title: Re: Coding
Post by: vh on July 25, 2014, 01:35:18 AM
fixed version of tlog
Title: Re: Coding
Post by: vh on July 25, 2014, 01:37:12 AM
so once upon a time i wanted to make a minecraft banner in the shape of a sickle. of course, i automated this process

goal.png is the goal state
done.png is the current state
all the other images are the patterns.

there are two functions in permutator.py
one of the tries to brute force patterns and find a matching banner
the other one also brute forces but adaptively changes the weights so certain patterns are used more.
in practice, they both run about the same.
Title: Re: Coding
Post by: blotz on July 25, 2014, 05:34:50 AM
11.25kB and its a rar 0.0
Title: Re: Coding
Post by: vh on August 08, 2014, 11:07:49 PM
brownian tree fractal

(https://i.imgur.com/p5PsQbn.png)



and lyapunov fractals

(https://i.imgur.com/vmEtVgV.png)

Title: Re: Coding
Post by: Jorster on August 09, 2014, 09:22:19 PM
Here's the code for the Jister bot on IRC, if anyone cares.
Code: [Select]
import socket
import random
import time
       
server = "irc.freenode.net" # Server
channel = "##universesandbox" # Channel
botnick = "Jister" # Your bots nick
with open("kol.txt", "rt") as in_file:
koltimes = in_file.readline()
koltimes = int(koltimes)
with open("mfw.txt", "rt") as in_file:
mfwtimes = in_file.readline()
mfwtimes = int(mfwtimes)
shitlist = [" :kol\n", " :jkok\n", " :peacock\n", " :trollface.png\n", " :jackie_chan.png\n", " :misc_jackie_chan.png\n", " :home phone\n", " :mpw\n", " :mfw\n", " :what the christ\n", " :what the pony\n", " :allahu ackbar\n", " :ackbar\n", " :con\n", " :kolok\n", " :hpw\n", " :hfw\n", " :u wot m8\n", " :hue\n", " :peasant\n", " :what_the_christ.png\n", " :dar_on_his_sides.png\n", " :music.avi\n", " :sugg\n", " :inb4\n", " :peacock\n", " :plot twist\n", " :gorchul\n", " :my homeschooling when\n", " :pants.bigger\n", " :what the inafter christ\n", " :kolmunism\n", " :kolkommunism\n", " :sell your cars\n", " :donate your cars\n", " :kol\n", " :kolkon\n", " :inb4\n", " :hue\n", " :what the jkok\n", " :blotz is literally of jkok\n", " :bangkok\n"]

def ping(): # Respond to server pings
  ircsock.send("PONG :pingis\n") 

def joinchan(chan): # Join a channel
  ircsock.send("JOIN "+ chan +"\n")

def randShitSpeak(): # Randomly selects a shitspeak phrase
ircsock.send("PRIVMSG " + channel + random.choice(shitlist))

ircsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ircsock.connect((server, 6667)) # Here we connect to the server using the port 6667
ircsock.send("USER "+ botnick +" "+ botnick +" "+ botnick +" :Jister - A bot made by Jorster on USF\n") # user authentication
ircsock.send("NICK "+ botnick +"\n") # here we actually assign the nick to the bot

joinchan(channel) # Join the channel using the functions we previously defined

while 1: # Be careful with these! it might send you to an infinite loop
ircmsg = ircsock.recv(2048) # receive data from the server
ircmsg = ircmsg.strip('\n\r') # removing any unnecessary linebreaks.
ircmsg = ircmsg.lower() # Converting to lowercase for easier finding of kol
ircmsg = ircmsg.replace('osmotikol', 'dsfjak')
ircmsg = ircmsg.replace('!kol', 'dsfjal')
ircmsg = ircmsg.replace('!mfw', 'whatthejkok.avi')
print(ircmsg) # Here we print what's coming from the server
if ircmsg.find("ping :") != -1: # If the server pings us then we've got to respond!
ping()
if ircmsg.find("##universesandbox") != -1: # Make sure we're getting a message from the irc channel
if ircmsg.find("kol") != -1: # If someone says kol
koltimes += 1 # Add one to the koltimes variable
if koltimes == 3000:
ircsock.send("PRIVMSG " + channel + " :Congratulations!\n")
ircsock.send("PRIVMSG " + channel + " :UniverseSandbox has reached 3000 kols!\n")
with open("kol.txt", "wt") as out_file: # Open the kol.txt file
out_file.write(str(koltimes)) # Populate the file with the kol number
if ircmsg.find("mfw") != -1:
mfwtimes += 1
with open("mfw.txt", "wt") as out_file:
out_file.write(str(mfwtimes))
if ircmsg.find("whatthejkok.avi") != -1:
ircsock.send("PRIVMSG " + channel + " :mfw has been said " + str(mfwtimes) + " times!\n")
if ircmsg.find("soul") != -1: # If someone says soul
randShitSpeak() # Respond with shitspeak
if ircmsg.find("!jister") != -1: # If someone says !Jister
ircsock.send("PRIVMSG "+ channel + " :Jister v1.8 - A bot by Jorster. Counts the number of Kol's and Mfw's said in IRC, retrieve them via !kol and !mfw, respectively.\n") # Gives bot info
if ircmsg.find("dsfjal") != -1: # If someone says !kol
ircsock.send("PRIVMSG "+ channel + " :kol has been said " + str(koltimes) + " times!\n") # Respond with the number of times kol has been said
if ircmsg.find("thomas") != -1: # if someone says thomas
ircsock.send("PRIVMSG "+ channel + " :thamis*\n") #correct them to thamis
if ircmsg.find("BlaBla44") != -1:
if (random.randint(1,100)) == 1:
ircsock.send("PRIVMSG "+ channel + randShitSpeak())
Title: Re: Coding
Post by: vh on August 10, 2014, 05:38:09 AM
Code: [Select]
if ircmsg.find("BlaBla44") != -1:
if (random.randint(1,100)) == 1:
ircsock.send("PRIVMSG "+ channel + randShitSpeak())

omg im' dying
Title: Re: Coding
Post by: Jorster on August 10, 2014, 09:33:08 AM
Shhh soopir sekrit feature
Title: Re: Coding
Post by: PrimeMinisterTom on August 12, 2014, 02:45:18 AM
Post python code, python stuff, maybe even a python.

esidgbsdgclesgdkzugy. Python.
Title: Re: Coding
Post by: vh on September 01, 2014, 10:23:38 AM
a pure montecarlo algorithm that solves the puzzle from this app
https://itunes.apple.com/us/app/magical-water/id409979686?mt=8

although this link to a very similar game explains the puzzle better
http://android.m.brothersoft.com/dropspuzzle-157758.html

given a few seconds of thinking time, it performs better than the average human
Title: Re: Coding
Post by: vh on September 01, 2014, 10:43:52 PM
you'll have to open the file and make minor adjustments to use this.

basically, it count the number of files/subdirs on your desktop (or any directory) once per minute, and writes it to file.
Title: Re: Coding
Post by: vh on September 06, 2014, 10:03:14 PM
req tkinter and matplotlib
Title: Re: Coding
Post by: vh on October 05, 2014, 09:51:55 AM
this plots the brightness of a 24-hour digital LED clock assuming it displays leading zeroes
Title: Re: Coding
Post by: vh on October 05, 2014, 09:53:43 AM
a flashcard tool which takes into account the weighing of each card and a forgetting curve.

run fcardtest
Title: Re: Coding
Post by: vh on October 05, 2014, 09:54:45 AM
this attempts to put n points in a plane so that they are 1 unit away from every other point. obviously this is impossible, but that doesn't stop me
Title: Re: Coding
Post by: Stevodoran on October 16, 2014, 10:51:21 AM
This is my first bit of code done in c#. What do yous think? Its very basic I know but for my first time I think its alright.

Is the structure alright?

Code: [Select]
/*
 *Author: Stephen Doran
 * Date: 16/10/2014
 */



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Q4
{
    class Program
    {
        static void Main(string[] args)
        {
                // declare variables
            int apples;
            int oranges;
            int total;

                // assign value to variables
            Console.Write("How many apples do you have? ");
            apples = Convert.ToInt32 (Console.ReadLine());
            Console.Write("How many oranges do you have? ");
            oranges = Convert.ToInt32 (Console.ReadLine());

                // process
            total = apples + oranges;

                // output value
            Console.WriteLine("You have {0} apples and {1} oranges", apples, oranges );
            Console.WriteLine("You have a total of {0} pieces of fruit", total);

        }
    }
}
Title: Re: Coding
Post by: Lord DC on October 30, 2014, 12:41:34 PM
vewy nice.

now its my turn

Code: [Select]
import net.minecraft.block.Block;
import net.minecraftforge.common.ForgeHooks;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipes;
import net.minecraftforge.common.MinecraftForge;
import cpw.mods.fml.common.Mod;
//import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;

@Mod(modid="BagaliumMod", name="Bagalium", version="0.1.0")

public class BagaliumMain {
@Instance(value = "BagliumMod")
    public static BagaliumMain instance;
public final static Block bagaliumOre = new BagaliumOre(Material.rock);
    @SidedProxy(clientSide="bagalium.eclipse.cp.ClientProxy", serverSide="forge.eclipse.bagalium.CommonProxy")
    public static CommonProxy proxy;
public static Item bagaliumIngot;
   
    public void preInit(FMLPreInitializationEvent event) {
    bagaliumIngot = new BagaliumIngot()
        .setMaxStackSize(64)
        .setUnlocalizedName("bagaliumIngot");
    }
   
    public void load(FMLInitializationEvent event) {
            proxy.registerRenderers();
            ItemStack diamondStack = new ItemStack(Items.diamond);
            ItemStack dirtStack = new ItemStack(Blocks.dirt);
            GameRegistry.addShapelessRecipe(diamondStack, dirtStack);
            MinecraftForge.setBlockHarvestLevel(bagaliumOre, "pickaxe", 3);
            GameRegistry.registerBlock(bagaliumOre, "bagaliumOre");
    }
   
    public void postInit(FMLPostInitializationEvent event) {
       
    }
Title: Re: Coding
Post by: Jorster on October 30, 2014, 03:12:48 PM
As a heads up, I highly recommend commenting your code so if you ever go back you know what you were trying to accomplish
Title: Re: Coding
Post by: atomic7732 on October 30, 2014, 03:18:01 PM
As a heads up, I highly recommend commenting your code so if you ever go back you know what you were trying to accomplish
Title: Re: Coding
Post by: blotz on October 30, 2014, 04:01:49 PM
As a heads up, I highly recommend commenting your code so if you ever go back you know what you were trying to accomplish
Title: Re: Coding
Post by: Lord DC on October 31, 2014, 05:56:48 AM
Alrighty Then!
Title: Re: Coding
Post by: SpyCreepers on October 31, 2014, 06:35:39 AM
vewy nice.

now its my turn

Code: [Select]
import net.minecraft.block.Block;
import net.minecraftforge.common.ForgeHooks;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipes;
import net.minecraftforge.common.MinecraftForge;
import cpw.mods.fml.common.Mod;
//import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.registry.GameRegistry;

@Mod(modid="BagaliumMod", name="Bagalium", version="0.1.0")

public class BagaliumMain {
@Instance(value = "BagliumMod")
    public static BagaliumMain instance;
public final static Block bagaliumOre = new BagaliumOre(Material.rock);
    @SidedProxy(clientSide="bagalium.eclipse.cp.ClientProxy", serverSide="forge.eclipse.bagalium.CommonProxy")
    public static CommonProxy proxy;
public static Item bagaliumIngot;
   
    public void preInit(FMLPreInitializationEvent event) {
    bagaliumIngot = new BagaliumIngot()
        .setMaxStackSize(64)
        .setUnlocalizedName("bagaliumIngot");
    }
   
    public void load(FMLInitializationEvent event) {
            proxy.registerRenderers();
            ItemStack diamondStack = new ItemStack(Items.diamond);
            ItemStack dirtStack = new ItemStack(Blocks.dirt);
            GameRegistry.addShapelessRecipe(diamondStack, dirtStack);
            MinecraftForge.setBlockHarvestLevel(bagaliumOre, "pickaxe", 3);
            GameRegistry.registerBlock(bagaliumOre, "bagaliumOre");
    }
   
    public void postInit(FMLPostInitializationEvent event) {
       
    }
Minecraft Forge Mod eh?
Title: Re: Coding
Post by: Lord DC on October 31, 2014, 06:36:11 AM
yep  ;D
Title: Re: Coding
Post by: Hellpotatoe on November 01, 2014, 12:21:52 PM
As a heads up, I highly recommend commenting your code so if you ever go back you know what you were trying to accomplish
Title: Re: Coding
Post by: vh on November 01, 2014, 03:25:24 PM
i recommend never commenting your code so if you ever go back you can practice how to decipher uncommented code
Title: Re: Coding
Post by: vh on November 15, 2014, 11:16:08 PM
smalltalk is the most confusing thing in the world

(https://i.imgur.com/bQ8fS5m.png)
Title: Re: Coding
Post by: atomic7732 on December 07, 2014, 02:08:11 AM
Weather model chronicles:

i don't have time to write a whole chronicle so just have the output graphic results from tonight:

first try, i forgot the else statements, so anything with a value too low ends up compounding on the bottom as black

all of these graphics are of humidity percentage, darker green is more humidity
timestep for each run was 1 hour, each frame shown is 6 hours
model is a 256x128 equirectangular grid

(http://i.imgur.com/0RTF6lm.gif)

then i figured that out and ran the model 72 hours at what i thought was "atmospheres" of pressure and uh well it does this odd thing at about 45N and 45S that spreads out... i have no idea why

(http://i.imgur.com/U2g0lSa.gif)

then i tried hPa (cause I know pascals are just death)

(http://i.imgur.com/OKbGyAr.gif)

no that's obviously broken

so here's something in the middle

(http://i.imgur.com/RpKHU6f.gif)

you can see some things move and advect properly, but no time to see things speed up enough because the "corruption" takes everything over

something is obviously wrong, with the smaller pressures, not enough happens, with the higher pressures, it breaks the advection formula and stuff tries to move too fast (thereby moving too much and leaving cells empty)

fortunately, it appears that the cells that border each other actually do so according to the model, you can sometimes see things move between them and the corruption spreads out logically

unfortunately, i have no idea why the corruption occurs on every OTHER row, and only in that area originally?

in other news, we get to add to the collection of modern art :)

here's a plan: i'm going to run a day-long simulation at a minute timestep using pascals overnight, output every hour, and see how it comes out
Title: Re: Coding
Post by: Gordon Freeman on December 07, 2014, 03:30:14 AM
Help me understand this mess
Title: Re: Coding
Post by: vh on December 07, 2014, 06:45:49 AM
i don't think that will help. the very dark and very light areas in 'the corruption', suggest some sort of feedback event that creates large values. i suggest trying to figure out why that happens

switch on and off coriolis to see if that's causing anything
Title: Re: Coding
Post by: vh on December 07, 2014, 07:47:48 AM
so this is from a multivariable calculus course...
use the enemy's strength against him

(https://i.imgur.com/RRcqgH4.png)
Title: Re: Coding
Post by: Gordon Freeman on December 07, 2014, 08:03:37 AM
All other music is in-game music. It makes me want to understand this.
Title: Re: Coding
Post by: atomic7732 on December 07, 2014, 11:52:06 AM
What I ran overnight...

(http://i.imgur.com/UKNqOH5.gif)

Now I'm trying it without coriolis as kip suggested to see if that has any affect on the corruption

(http://i.imgur.com/TkOnfuk.gif)

compare with (from yesterday)

(http://i.imgur.com/U2g0lSa.gif)

and a higher resolution:

(http://i.imgur.com/KcASLld.gif)

???
Title: Re: Coding
Post by: blotz on December 07, 2014, 01:15:35 PM
:O
Title: Re: Coding
Post by: vh on January 01, 2015, 11:19:35 PM
Code: [Select]
time = calendar.timegm(datetime.datetime(*[int(val) for val in re.split('-| |:',line[line.index("[") + 1:line.index("]")])]).utctimetuple())
this a beautiful one liner than turns a line like this:

Code: [Select]
[2011-10-05 17:27:05] <matty406> screenies\n
into a timestamp like this:

Code: [Select]
1317835625
Title: Re: Coding
Post by: vh on January 19, 2015, 09:44:00 AM
parses a eu4 save game into a csv file which i've imported into a sql database

(wars, sorted by largest number of boats destroyed)
(https://i.imgur.com/Do413RO.png)

(battles in which both sides had more than 50000 participants. note the 17th century battle)
(https://i.imgur.com/7BKhdCK.png)
Title: Re: Coding
Post by: atomic7732 on January 19, 2015, 09:51:38 PM
I wrote a program to calculate the current time on Universalis...

Fiah and dar came up with year 984, but I'm not sure how. I got 988.

Here's the code: http://pastebin.com/KUeGYDZ1

Output for the value on line 2

Code: [Select]
Universalis days: 245240.501362
Universalis years: 988.470426812
Base Universalis Time - 988-116, 15.70824
Calendaric Universalis Time - 988-107, 11.0399999997
Soleani Calendar - 988-2-25, 11.0399999997

Base Universalis Time is basically just the time i got by dividing 22.02 and 248.101, the exact hour and day values. This differs from the Calendaric Universalis Time (should it really differ by 9 days though?) because that is calculated as a calendar would calculate it out, in blocks of days per year, and not just a raw time value. The Soleani Calendar is a modified version of CUT which uses the method of dividing into months. At the moment, it does not have an offset, but it will be offset to whenever the nearest Universalis winter solstice is to January 1, 1399, 00:00 UTC, Earth time. For ease, I assumed it synced up exactly with midnight January 1.

I posted this so that, if I made a mistake, someone will be able to understand what went wrong.
Title: Re: Coding
Post by: Darvince on January 19, 2015, 09:56:23 PM
what did you define as 000-01-01 00:00:00? how about 1399-10-21 17:00:00 UTC+0 is 000-01-01 00:00:00?
Title: Re: Coding
Post by: atomic7732 on January 19, 2015, 09:59:19 PM
0 hours is January 1, 1399, 00:00 UTC
Title: Re: Coding
Post by: vh on January 20, 2015, 04:06:30 PM
drag the ball.
(requires tkinter)
Title: Re: Coding
Post by: atomic7732 on January 20, 2015, 04:37:00 PM
the ball is a slow pony
Title: Re: Coding
Post by: vh on January 20, 2015, 04:40:11 PM
well at least it works
Title: Re: Coding
Post by: atomic7732 on January 21, 2015, 08:53:45 AM
I figured it out, who would have known .001 was one per thousand and not one per hundred...

that might account for the 9 day discrepancy.

I'll update the code when I get home to see if that's accurate and then maybe I can host a thing on my site showing Base Universalis Time for conversion and maybe people's calendars
Title: Re: Coding
Post by: Darvince on January 21, 2015, 09:17:18 AM
fixx pygwm
Title: Re: Coding
Post by: atomic7732 on January 21, 2015, 10:03:38 PM
i can confirm that i messed up the calendar thing, but it is fixed now

so if people want to work on their calendars, and decide on a time for winter solstice of universalis, that would be helpful and then i can start working on a calendar/time conversion which i can put on my site
Title: Re: Coding
Post by: vh on January 29, 2015, 02:59:55 PM
so i'm coding an evolution simulator for trees and it's neat how every single possible bug gets exploited by the evolutioning.

for example, i made the cost of growing a branch proportional to its height off the ground -- this lead to the forest become a carpet of branches at y = 0

i implemented a variable in the genes that determined how much energy the offspring would start off with, but used a constant value for that instead. the trees exploited this by using 1 energy to create offspring with 10 energy
Title: Re: Coding
Post by: Darvince on January 29, 2015, 04:01:13 PM
for the first issue you could keep that feature but make the cost decrease from 0 to 5 then increase and never let it reach 0, also if a tree occupies the same space as another one the cost increases
Title: Re: Coding
Post by: vh on January 29, 2015, 04:08:37 PM
eh. i just made cost be proportional to 1 + height

then i removed the height term because i was trying to get taller trees to grow

---

i don't need to to do the tree occupying the same space thing because i actually measure the amount of sunlight absorbed by each branch on a tree and if a branch is covered by another branch higher up it gets less energy (50% less for every additional overlap)

---

i'm having problems with speciation -- all my trees have evolved to be tall, but theyre all exactly the same tallness
Title: Re: Coding
Post by: Bla on January 29, 2015, 04:53:16 PM
Maybe coding a giraffe could help?

(http://thefunniestpictures.com/wp-content/uploads/2014/04/270254.jpg)
Title: Re: Coding
Post by: Darvince on January 29, 2015, 06:48:42 PM
speciation only happens when a population is isolated from another or put under pressure by itself
Title: Re: Coding
Post by: FiahOwl on January 29, 2015, 08:15:20 PM
maybe add growth factors determined by genes so one tree grows at 0.8 speed and another 1.2 speed
Title: Re: Coding
Post by: vh on January 31, 2015, 08:13:20 PM
tfw doing data processing and there's an io bottleneck
Title: Re: Coding
Post by: atomic7732 on February 20, 2015, 04:04:52 PM
A simple little program which can be used as a memory game for learning your own conlang (or any language really)

not full definitions, but simple vocab glossing

(http://i.imgur.com/ShmWqVD.png)

if people want to help add to files or use it, just ask

the way it works is the english will always show up and you have to type it in the conlang, so if you need to specify things, then you can do that

I still have to test to see if special characters work and such.

And actually, I'd like to try to put it on my website so that it's always there to use when you want. Although the personal version would allow you to dump vocab things you want to work on, on demand.
Title: Re: Coding
Post by: vh on February 20, 2015, 04:20:52 PM
a brute force solver for https://en.wikipedia.org/wiki/24_Game
Title: Re: Coding
Post by: vh on March 24, 2015, 05:06:25 AM
i find this data structure useful because if your code crashes unexpectedly in the middle of processing a large amount of data, you don't have to redo everything

Code: [Select]
import cPickle

class IOlist(list):
    def __init__(self, filename, sentinel):
        list.__init__(self)
        self.count = 0
        self.sentinel = sentinel
        self.filename = filename
    def add(self, elem):
        self.append(elem)
        self.count += 1
        if self.count >= self.sentinel:
            self.save()
    def save(self):
        self.count = 0
        with open(self.filename, 'wb') as ouf:
            cPickle.dump(list(self), ouf)
    def load(self):
        with open(self.filename, 'rb') as inf:
            self[:] = cPickle.load(inf)
       

it saves itself to a file every so often
Title: Re: Coding
Post by: FiahOwl on March 24, 2015, 08:18:05 AM
you wrote that after a few crashes didn't you
Title: Re: Coding
Post by: blotz on March 31, 2015, 11:04:58 AM
it's time to up the byebla game
there's a 0.1% chance it'll break when starting up

oops quickly squashing a bugs
Title: Re: Coding
Post by: vh on March 31, 2015, 12:05:56 PM
python space program https://djungelorm.github.io/krpc/docs/tutorials/launch-into-orbit.html
Title: Re: Coding
Post by: blotz on March 31, 2015, 12:38:34 PM
ok its call blabotc cuz its so crude
my complex design is in the process of breaking
Title: Re: Coding
Post by: Darvince on March 31, 2015, 12:45:37 PM
kol
Title: Re: Coding
Post by: vh on March 31, 2015, 01:34:45 PM
you can't stop me!

(https://i.imgur.com/abgIseT.png)
Title: Re: Coding
Post by: vh on April 01, 2015, 12:42:31 PM
tfw math homework is too much work. this only took me about twice the time it would take to do the homework by hand
---

an automated nonhomogenous linear ODE solver which uses the method of undetermined coefficients. the best part is that it outputs a latex file showing each step. includes batch processing

attached is the script, an example latex output, and the latex rendered as a pdf

Code: [Select]
from sympy import *
from copy import deepcopy

def all_terms(polyn, rcoeff = False):
    polyn = deepcopy(polyn)
    coeffs = []
    terms = []
    while polyn:
        fam, coeff = polyn.LT()
        famexpr = fam.as_expr()
        if famexpr == 1:
            fam = poly(x+1)-poly(x) #1
        else:
            fam = poly(fam.as_expr())
        terms.append(fam)
        coeffs.append(coeff)
        polyn = polyn - fam*coeff
    if rcoeff:
        return zip(terms, coeffs)
    else:
        return terms

def csub(pexp):
    pexp = deepcopy(pexp)
    for i in range(mc*2):
        pexp = pexp.subs('C'+str(i), 1)
    return pexp
       
def MOUC(problem, rlatex = True):
    latextext = []
    #print the problem
    latextext.append(latex(problem))
    latextext.append(latex("\\line(1,0){450}"))
   
    yc = Eq(problem.lhs, 0)
    latextext.append('y_c : ' + latex(yc))
    #print yc

    cp = yc
    for i, ndy in reversed(list(enumerate(dys))):
        cp = cp.subs(ndy, r**i)
    cp = cp.lhs
    latextext.append(latex(cp))

    cproots = []
    cpr = roots(Poly(cp))
    for k, v in cpr.items():
        cproots.append([k]*v)
    #print roots (imaginary!?)
    latextext.append('r : ' + ', '.join([latex(cproot) for cproot in cproots]))
    latextext.append(latex("\\line(1,0){450}"))
   
    ycsol = dsolve(yc.subs(y, y(x)))
    latextext.append(latex(ycsol))
    #print ycsol
   
    yfams = []
    ypf = poly(problem.rhs)
    yfams = all_terms(ypf)

    dyfams = [yfam.as_expr() for yfam in yfams]
    for yfam in dyfams:
        done = True
        while done:
            if type(yfam) in [type(S(val)) for val in xrange(-1,3)]:
                break
            dyfam = poly(diff(yfam, x))
            dyfammons = all_terms(dyfam)
            for dyfammon in dyfammons:
                dyfammon = dyfammon.as_expr()
                if dyfammon in dyfams:
                    done = False
                else:
                    dyfams.append(dyfammon)
                    dyfam = dyfammon
    dyfams1 = dyfams[:]
   
    yre = ycsol.rhs.expand()
    yre = csub(yre)
       
    rhsfams = [term.as_expr() for term in all_terms(poly(yre))]

    for i, dyfam in enumerate(dyfams):
        while dyfams[i] in rhsfams:
            dyfams[i] *= x
        while dyfams.count(dyfams[i]) > 1:
            dyfams[i] *= x
       
    #print promoted dyfams... if different
    for i, dyfam in enumerate(dyfams):
        if dyfam == dyfams1[i]:
            latextext.append(latex(dyfam))
        else:
            latextext.append(latex(dyfams1[i]) + ' \\rightarrow ' + latex(dyfam))

    Cs = [symbols('C'+str(i)) for i in range(3, 3+mc2)]
    yp = 0
    for i, term in enumerate(dyfams):
        yp += Cs[i]*term
       
    dyps = [yp]
    for i in xrange(1, md+1):
        dyps.append(diff(dyps[-1], x))
    #print each of the dyps
    latextext.append(latex("\\line(1,0){450}"))
    name = "y_p"
    for i in xrange(poly(cp).degree()+1):
        latextext.append(name + '=' + latex(dyps[i]))
        name += "'"

    adds = []
    TCs = all_terms(poly(cp), True)
    for T, C in TCs:
        adds.append(C*dyps[T.degree()])
    problemlhs = Add(*adds, evaluate=False)

    latextext.append(latex("\\line(1,0){450}"))
    ypbs = Eq(problemlhs, problem.rhs)
    ypas = Eq(problemlhs.collect(x), problem.rhs)
    #print unsimplified and simplified particular
    latextext.append(latex(ypbs))
    latextext.append(latex(ypas))
   
    eqs = {key: Eq(0,0, evaluate = False) for key in rhsfams+dyfams}
    for term, coeff in ypas.lhs.as_coefficients_dict().items():
        key = csub(term)
        cl, cr = eqs[key].lhs, eqs[key].rhs
        eqs[key] = Eq(cl+coeff*term, cr)
    for term, coeff in ypas.rhs.as_coefficients_dict().items():
        key = csub(term)
        cl, cr = eqs[key].lhs, eqs[key].rhs
        eqs[key] = Eq(cl, coeff*term+cr)
    for k, v in eqs.items():
        cl, cr = v.lhs, v.rhs
        eqs[k] = Eq((cl/k).simplify(), (cr/k).simplify())
    tosolve = []
    for k, v in eqs.items():
        if v is not S(True):
            tosolve.append(v)
           
    #print tosolve
    latextext.append(latex("\\line(1,0){450}"))
    for eq in tosolve:
        latextext.append(latex(eq))
           
    ucs = Cs[:len(tosolve)]
    Cps = {key:val for (key, val) in zip(ucs, solve_poly_system(tosolve, ucs)[0])}
    #print Cps
    for k, v in Cps.items():
        latextext.append(latex(k) + ' = ' + latex(v))
   
    ypsol = yp.xreplace(Cps)
    #print ypsol
    latextext.append(latex("\\line(1,0){450}"))
    latextext.append('y_p = ' +latex(ypsol))
   
    gsol = Eq(y, ycsol.rhs + ypsol)
    #print gsol
    latextext.append(latex(gsol))
   
    if rlatex:
        return gsol, latextext
    else:
        return gsol

def format(latexlines):
    start = "\\begin{dmath*}"
    end = "\\end{dmath*}"
    nl = "\n"
    return nl.join([start + nl + line + nl + end for line in latexlines])

def batchMOUC(problemdict, output):
    fulltext = ["\\documentclass[fleqn, 12pt]{article}\n\\usepackage{breqn}\n\\usepackage[cm]{fullpage}\n\\setlength{\\mathindent}{0pt}\n\\begin{document}"]
    #head, tail, and section
    for i, v in problemdict.items():
        _, latext = MOUC(v)
        fulltext.append('\\section*{'+str(i)+'}')
        fulltext.append(format(latext))
    fulltext.append("\\end{document}")
    with open(output, 'w') as ouf:
        ouf.write('\n'.join(fulltext))
       
init_printing()

md = mc = mc2 = 5
x, y, r = symbols('x y r')
dys = [y]
for i in xrange(1, md+1):
    dys.append(Derivative(dys[-1], x))
   
problems = {
    9: Eq(dys[2] + 2*dys[1] - 3*y, 1+x*exp(x)),
    10: Eq(dys[2] + 9*y, 2*cos(3*x) + 3*sin(3*x)),
    13: Eq(dys[2] + 2*dys[1] + 5*y, exp(x)*sin(x))
}

batchMOUC(problems, 'output.latex')
Title: Re: Coding
Post by: vh on April 02, 2015, 07:48:21 AM
number of "favorites" a piece gets on fanfiction.net vs which day it was published. i only considered stories that were published all at once (no incremental publishing). sample size for each day is about 90000. error bars are one standard deviation. monday is 0 and sunday is 6.

tldr publish on monday or thursday or friday. although it's less than a 2% difference from the average so it's probably not that important.
Title: Re: Coding
Post by: vh on April 06, 2015, 11:01:01 AM
python handles double negatives well

(https://i.imgur.com/Clv0mTR.png)
Title: Re: Coding
Post by: atomic7732 on April 14, 2015, 08:52:42 AM
python 3.4 master race
Title: Re: Coding
Post by: vh on April 14, 2015, 11:51:18 AM
>3.4
boooo
Title: Re: Coding
Post by: FiahOwl on April 14, 2015, 11:59:26 AM
#2.7
Title: Re: Coding
Post by: atomic7732 on April 14, 2015, 02:54:41 PM
3.4 handles unicode encoding automatically with no frustrations

which is what a programming language/compiler should do in 2015

it's the future
Title: Re: Coding
Post by: vh on April 14, 2015, 03:24:57 PM
but the 2.7 libraries!
Title: Re: Coding
Post by: vh on April 19, 2015, 07:38:56 AM
my IOint class is like my IOlist class. except this one doesn't use inheritance because i've been too lazy to get it working

Code: [Select]
class IOint():
    def __init__(self, filename):
        self.value = None
        self.filename = filename
    def set(self, val):
        self.value = val
        self.save()
    def save(self):
        with open(self.filename, 'wb') as ouf:
            ouf.write(str(self.value))
    def load(self):
        with open(self.filename, 'rb') as inf:
            self.value = int(inf.readline().strip())
Title: Re: Coding
Post by: atomic7732 on April 27, 2015, 08:07:19 AM
my western pacific statistical model...

it creates pretty believable tracks but the options are very limited (there's one track per square degree per month) and (probably) very innaccurate. the other issue is that many of the square degrees have no data and the storm will stop moving, so i need to create some interpolation method of some sort

it also only does tracks and doesn't forecast strength at all, but that is for a later addition

in the coming months i will hopefully be able to do some case studies

i could try to 'forecast' past storms too and see how well that goes
Title: Re: Coding
Post by: Darvince on April 27, 2015, 08:09:58 AM
i was gonna say you should be a meteorologist as a money making profession and then i realized
Title: Re: Coding
Post by: atomic7732 on April 27, 2015, 08:42:32 AM
http://imgur.com/a/uO6uV#0

this is the data that the program has so as you can see there are a lot of holes (except during peak season), but i'm not sure how i'd interpolate between them and determine where is interpolatable and where isn't

each character is how many storms have data for that square degree, and if it's greater than 9, A = 10, B = 11, R = 28, Y = 35 (yes there is one of those) etc
Title: Re: Coding
Post by: vh on April 27, 2015, 06:40:17 PM
i'm studying for the computer science ap exam and google loves to troll me

(https://i.imgur.com/IJdPLmQ.png)
Title: Re: Coding
Post by: atomic7732 on April 27, 2015, 07:55:09 PM
(http://i.imgur.com/dDJd8w5.png)

(http://i.imgur.com/sXlw3Ox.png)
Title: Re: Coding
Post by: atomic7732 on May 01, 2015, 08:42:23 AM
http://stackoverflow.com/questions/24978052/interpolation-over-regular-grid-in-python

this appears to be very useful for filling in my grid but i have no idea how to use numpy/scipy grids and how to convert the data i already have (which is basically just a 3d list of list of lists) into a grid that can be interpolated by these modules

it doesn't help that the example has everything named with seemingly random letters!

Edit: potentially useful for actually you know getting numpy and scipy on python 3.4 http://continuum.io/downloads#py34
Title: Re: Coding
Post by: vh on May 01, 2015, 02:01:19 PM
it's actually  not that hard. i never bothered with tutorials

converting:
np.array(yourlist) works

everything else is pretty much the same, except you can't append and can only store one type (like arrays are supposed to work).

slicing is all the same. iteration is all the same, BUT DON'T ITERATE
if you want to take the square of everything it's as simple as arr**2
or if you want to apply function f to everything it's as simple as arr = np.vectorize(f)(arr)
Title: Re: Coding
Post by: atomic7732 on May 01, 2015, 02:04:41 PM
kolok will try it later tonight
Title: Re: Coding
Post by: atomic7732 on May 04, 2015, 08:02:19 AM
ok so um this is not interpolation

This is what the original data looks like. It's visibly upside-down but that's fine, the program handles it properly.

(http://i.imgur.com/kYPPXiF.png)

And this is the "interpolated" result:

(http://i.imgur.com/JlhmCgP.png)

i somehow managed to flip the grid dimensions which i think reorganized the data and then didn't even interpolate anything



i fixed that and changed all the zero's to nan's because they were not being interpolated at all
and now i'm getting an error at
Code: [Select]
f = interpolate.Rbf(rr, cc, ar, function='linear')

ValueError: array must not contain infs or NaNs



yeeeeeeeeeeeeee

(http://i.imgur.com/V8lHbzM.png)

no time in class rn but this is the PTPC model's Tropical Storm Noul prediction

Code: [Select]
TS NOUL
[+0hr] +9.5 +139.6
[+6hr] +10.2 +140.5
[+12hr] +11.4 +140.7
[+18hr] +11.6 +140.9
[+24hr] +11.8 +141.1
[+30hr] +12.3 +141.4
[+36hr] +12.5 +141.7
[+42hr] +12.8 +141.9
[+48hr] +13.1 +142.5
[+54hr] +13.7 +143.1
[+60hr] +14.4 +143.9
[+66hr] +15.2 +144.7
[+72hr] +16.0 +145.6
[+78hr] +17.0 +146.6
[+84hr] +17.9 +147.8
[+90hr] +19.1 +149.2
[+96hr] +20.6 +150.7
[+102hr] +22.1 +152.5
[+108hr] +23.7 +154.4
[+114hr] +25.3 +156.0
[+120hr] +26.9 +156.7
[+126hr] +28.0 +157.0
[+132hr] +28.6 +158.2
[+138hr] +29.9 +159.5
[+144hr] +31.0 +160.0
[+150hr] +31.5 +161.2
[+156hr] +32.0 +161.7
[+162hr] +32.5 +163.2
[+168hr] +33.5 +164.5
[+174hr] +34.6 +165.7
[+180hr] +35.7 +166.7
forecast end
Title: Re: Coding
Post by: atomic7732 on May 04, 2015, 03:48:32 PM
heeeeyyyyyy

the first functional prediction of an active storm (http://www.darrinward.com/lat-long/?id=563166)

to do:
- inertial assumption for the first ~24 hrs, so as to preserve initial motion of the storm and hopefully put it on a more realistic track before it becomes pure statistics
- further division of the grid data into three types for El Niño, La Niña, and neutral years, which can affect storm track and intensity - though i'm not sure if there'd be too sparse of data, it might be a feature that only works during peak season (~Jul-Nov)
- intensity prediction (statistical)
- sst data which affects intensity, possible, maybe use anomalies, since sst averages are likely to be reflected in the overall storm data anyway
- shear data which affects intensity, unlikely to be implemented
Title: Re: Coding
Post by: blotz on May 04, 2015, 03:57:57 PM
why is it on darrinward.com not kal's website
Title: Re: Coding
Post by: atomic7732 on May 04, 2015, 04:08:38 PM
because that's just an easy online lat-lon plotter that generates a link every time you use it

i could maybe later code a track plotter in matplotlib? maybe
Title: Re: Coding
Post by: atomic7732 on May 05, 2015, 07:58:43 AM
coding this makes me hot

hhnnnnggggg cyclone data

lol omg i added intensity prediction to my model and uh
it thinks Noul is going to be a Haiyan (http://en.wikipedia.org/wiki/Typhoon_Haiyan)

Code: [Select]
TROPICAL STORM NOUL - 05 05 12Z
[+0hr] +9.5 +138.9 45.0 kt 992.0 hPa
[+6hr] +9.5 +138.9 53.0 kt 991.0 hPa
[+12hr] +9.7 +138.6 60.0 kt 989.0 hPa
[+18hr] +9.9 +138.0 68.0 kt 988.0 hPa
[+24hr] +10.3 +137.3 76.0 kt 987.0 hPa
[+30hr] +10.9 +136.3 79.0 kt 985.0 hPa
[+36hr] +11.4 +134.3 80.0 kt 983.0 hPa
[+42hr] +11.6 +133.2 84.0 kt 980.0 hPa
[+48hr] +11.9 +132.6 87.0 kt 980.0 hPa
[+54hr] +12.4 +132.2 89.0 kt 974.0 hPa
[+60hr] +12.8 +132.2 98.0 kt 971.0 hPa
[+66hr] +13.2 +132.1 106.0 kt 968.0 hPa
[+72hr] +13.9 +132.0 111.0 kt 962.0 hPa
[+78hr] +14.6 +132.0 116.0 kt 956.0 hPa
[+84hr] +15.0 +131.7 118.0 kt 952.0 hPa
[+90hr] +15.4 +131.5 119.0 kt 949.0 hPa
[+96hr] +16.4 +131.4 125.0 kt 941.0 hPa
[+102hr]+16.8 +131.2 130.0 kt 933.0 hPa
[+108hr]+17.1 +130.9 134.0 kt 926.0 hPa
[+114hr]+17.9 +130.3 139.0 kt 921.0 hPa
[+120hr]+18.7 +129.7 144.0 kt 916.0 hPa
[+126hr]+19.2 +129.3 154.0 kt 906.0 hPa
[+132hr]+19.9 +128.7 157.0 kt 902.0 hPa
[+138hr]+20.7 +128.5 162.0 kt 895.0 hPa
[+144hr]+21.6 +129.3 162.0 kt 897.0 hPa
[+150hr]+22.4 +130.8 159.0 kt 905.0 hPa
[+156hr]+23.4 +131.6 153.0 kt 910.0 hPa
[+162hr]+24.6 +132.7 150.0 kt 915.0 hPa
[+168hr]+25.7 +134.1 148.0 kt 918.0 hPa
[+174hr]+27.3 +135.6 143.0 kt 924.0 hPa
[+180hr]+28.5 +137.5 138.0 kt 927.0 hPa
forecast end

I feel like it's going to need to be modified, maybe to intensify only like 50 - 75% of what it is told to do but I'm not sure how to empirically decide this.

if i get the shear data working i could maybe have that "nerf" the intensity
Title: Re: Coding
Post by: atomic7732 on May 12, 2015, 08:31:46 AM
yee beautiful

Code: [Select]
# http://www.darrinward.com/lat-long/?id=552821
# for plotting
 
# http://stackoverflow.com/questions/24978052/interpolation-over-regular-grid-in-python
# for scipy interpolation help
 
# https://knowledge.safe.com/articles/How_To/Calculating-accurate-length-in-meters-for-lat-long-coordinate-systems
# for lat/lon conversions to nautical miles
 
# http://matplotlib.org/basemap/users/examples.html
 
# create a 1 deg x 1 deg resolution grid for each month
# put SST data for each month
# put shear data?
 
#split SSTs by el nino and la nina and neutral
 
import math, sys
import numpy as np
import scipy.interpolate as interpolate
import matplotlib.pyplot as plt
 
class cycdat:
        def __init__(self, vx, vy, wind, pres, data):
                self.x = vx
                self.y = vy
                self.w = wind
                self.p = pres
                self.d = data #how many points of data are in this grid, so that velocities can be summed and averaged
                #self.t = temp
               
f = open('bst8089.txt', 'r+')
k = f.read()
 
lines = k.split('\n')
#ln1 = lines[1]
 
#make a grid or something
grid = []
for m in range(0, 12):
        temp2 = []
        for y in range(0, 50):
                temp = []
                for x in range(100, 180):
                        temp.append(cycdat(0, 0, 0, 0, 0))
                temp2.append(temp)
        grid.append(temp2)
       
#m-1, y, x-100
 
lastyear = None
 
for l in lines:
        sp = l.split(' ')
        sp = [y for y in sp if y != '']
       
        try:
                if sp[1] == '002':
                        #date
                        t1 = sp[0]
                        year1 = t1[:2]
                        month1 = int(t1[2:4])
                        day1 = t1[4:6]
         
                        #tropical or extratrop
                        if sp[2] == '6':
                                ex1 = False
                        else:
                                ex1 = True
               
                        #position
                        lat1 = int(sp[3])/10
                        lon1 = int(sp[4])/10
                 
                        #intensity
                        wind1 = int(sp[6])
                        pres1 = int(sp[5])
                       
                        if lastyear is not None and lastlon < 180.0 and lastlat < 50.0:
                                dlat = lat1 - lastlat
                                dlon = lon1 - lastlon
                                dwind = wind1 - lastwind
                                dpres = pres1 - lastpres
                               
                                grid[lastmonth - 1][math.floor(lastlat)][math.floor(lastlon) - 100].x += dlat
                                grid[lastmonth - 1][math.floor(lastlat)][math.floor(lastlon) - 100].y += dlon
                                grid[lastmonth - 1][math.floor(lastlat)][math.floor(lastlon) - 100].w += dwind
                                grid[lastmonth - 1][math.floor(lastlat)][math.floor(lastlon) - 100].p += dpres
                                grid[lastmonth - 1][math.floor(lastlat)][math.floor(lastlon) - 100].d += 1
                       
                        lastyear = year1
                        lastmonth = month1
                        lastday = day1
                        lastlat = lat1
                        lastlon = lon1
                        lastwind = wind1
                        lastpres = pres1
                if sp[0] == '66666': #reset all of the last things and bypass adding a point between storm end & start positions
                        lastyear = None
        except:
                print("end of file... probably")
 
for list in grid:
        for list2 in reversed(list):
                for x in list2:
                        if x.d != 0:
                                n = x.d
                                if x.d > 9:
                                        n = chr(x.d + 55)
                                sys.stdout.write(str(n))
                                x.x = x.x/x.d
                                x.y = x.y/x.d
                                x.w = x.w/x.d
                                x.p = x.p/x.d
                        else:
                                sys.stdout.write(' ')
                sys.stdout.write('\n')
        sys.stdout.write('\n\n')
 
stormmonth = int(input('Initialization month: '))
stormlat = float(input('Initial latitude: '))
stormlon = float(input('Initial longitude: '))
stormwin = float(input('Initial wind speed (kt): '))
stormpre = float(input('Initial pressure (hPa): '))
stormsp = float(input('Initial speed (kt): ')) * 6 #6 hours of movement
stormdir = input('Initial direction (or STATIONARY): ')
#calculate nm/deg lon
rlat = stormlat * (math.pi/180)
hfactor = (111412.84 * math.cos(rlat) - 93.5 * math.cos(3*rlat))/1852
#calculate nm/deg lat
#calculate vector of speed/dir
if stormdir == "N":
    initv = stormsp / 60
    inith = 0
elif stormdir == "S":
    initv = -stormsp / 60
    inith = 0
elif stormdir == "W":
    inith = -stormsp / hfactor
    initv = 0
elif stormdir == "E":
    inith = stormsp / hfactor
    initv = 0
elif stormdir == "NE":
    inith = math.cos(math.pi/4) * stormsp / hfactor
    initv = math.sin(math.pi/4) * stormsp / 60
elif stormdir == "NW":
    inith = math.cos(3*math.pi/4) * stormsp / hfactor
    initv = math.sin(3*math.pi/4) * stormsp / 60
elif stormdir == "SW":
    inith = math.cos(5*math.pi/4) * stormsp / hfactor
    initv = math.sin(5*math.pi/4) * stormsp / 60
elif stormdir == "SE":
    inith = math.cos(7*math.pi/4) * stormsp / hfactor
    initv = math.sin(7*math.pi/4) * stormsp / 60
elif stormdir == "ENE":
    inith = math.cos(math.pi/8) * stormsp / hfactor
    initv = math.sin(math.pi/8) * stormsp / 60
elif stormdir == "NNE":
    inith = math.cos(3*math.pi/8) * stormsp / hfactor
    initv = math.sin(3*math.pi/8) * stormsp / 60
elif stormdir == "NNW":
    inith = math.cos(5*math.pi/8) * stormsp / hfactor
    initv = math.sin(5*math.pi/8) * stormsp / 60
elif stormdir == "WNW":
    inith = math.cos(7*math.pi/8) * stormsp / hfactor
    initv = math.sin(7*math.pi/8) * stormsp / 60
elif stormdir == "WSW":
    inith = math.cos(9*math.pi/8) * stormsp / hfactor
    initv = math.sin(9*math.pi/8) * stormsp / 60
elif stormdir == "SSW":
    inith = math.cos(11*math.pi/8) * stormsp / hfactor
    initv = math.sin(11*math.pi/8) * stormsp / 60
elif stormdir == "SSE":
    inith = math.cos(13*math.pi/8) * stormsp / hfactor
    initv = math.sin(13*math.pi/8) * stormsp / 60
elif stormdir == "ESE":
    inith = math.cos(15*math.pi/8) * stormsp / hfactor
    initv = math.sin(15*math.pi/8) * stormsp / 60
elif stormdir == "STATIONARY":
    inith = 0
    initv = 0
 
print('\n')
 
fi = open('output.txt', 'a')
 
hours = 0
print("[+" + str(hours).zfill(3) + "hr]\t+" + str(stormlat).zfill(4) + "\t+" + str(stormlon).zfill(5)  + "\t" + str(round(stormwin, 1)).zfill(5) + " kt\t" + str(round(stormpre, 1)).zfill(5) + " hPa")
fi.write(str(round(stormlat, 1)) + ", " + str(round(stormlon, 1)) + "\n")
 
hgrid = [] #horizontal (W-E) motion
vgrid = [] #vertical (N-S) motion
wgrid = [] #wind
pgrid = [] #pressure
for list in grid:
    htemp = []
    vtemp = []
    wtemp = []
    ptemp = []
    for list2 in list:
        htemp2 = []
        vtemp2 = []
        wtemp2 = []
        ptemp2 = []
        for x in list2:
            htemp2.append(x.x)
            vtemp2.append(x.y)
            wtemp2.append(x.w)
            ptemp2.append(x.p)
        htemp.append(htemp2)
        vtemp.append(vtemp2)
        wtemp.append(wtemp2)
        ptemp.append(ptemp2)
    hgrid.append(htemp)
    vgrid.append(vtemp)
    wgrid.append(wtemp)
    pgrid.append(ptemp)
   
def interp(g):
    ar = np.array(g[stormmonth - 1])
    ar[ ar==0 ] = np.nan
    r = np.linspace(0, 1, ar.shape[1])
    c = np.linspace(0, 1, ar.shape[0])
     
    rr, cc = np.meshgrid(r, c)
    vals = ~np.isnan(ar)
    f = interpolate.Rbf(rr[vals], cc[vals], ar[vals], function='linear')
    return(f(rr, cc))
   
hi = interp(hgrid) #INTERPOLATE HORIZONTAL GRID
vi = interp(vgrid) #INTERPOLATE VERTICAL GRID
wi = interp(wgrid) #INTERPOLATE WIND SPEED GRID
pi = interp(pgrid) #INTERPOLATE PRESSURE GRID
 
#plt.imshow(wi)
#plt.show()
 
def simulate(slat, slon, g, g2, g3, g4):
        tlat = g[math.floor(slat)][math.floor(slon)-100]
        tlon = g2[math.floor(slat)][math.floor(slon)-100]
        twin = g3[math.floor(slat)][math.floor(slon)-100]
        tpre = g4[math.floor(slat)][math.floor(slon)-100]
        return (tlat, tlon, twin, tpre)
 
for x in range(0, 180, 6):
        templat, templon, tempwind, temppres = simulate(stormlat, stormlon, hi, vi, wi, pi)
        if hours < 36:
            frac = (1/1296) * (hours - 36)**2
            stormlat += frac * initv + (1-frac) * templat
            stormlon += frac * inith + (1-frac) * templon
        else:
            stormlat += templat
            stormlon += templon
        stormwin += .5 * tempwind
        stormpre += .5 * temppres
        if stormlat == lastlat and stormlon == lastlon:
                print("storm stalled")
                break
        if stormlat > 50.0 or stormlon > 180.0 or stormlat < 0.0 or stormlon < 100.0:
                print("storm left grid")
                break
        lastlat = stormlat
        lastlon = stormlon
        hours += 6
        print("[+" + str(hours).zfill(3) + "hr]\t+" + str(round(stormlat, 1)).zfill(4) + "\t+" + str(round(stormlon, 1)).zfill(5) + "\t" + str(round(stormwin, 1)).zfill(5) + " kt\t" + str(round(stormpre, 1)).zfill(5) + " hPa")
        fi.write(str(round(stormlat, 1)) + ", " + str(round(stormlon, 1)) + "\n")
        if hours == 180:
                print("forecast end")
               
fi.close()
Title: Re: Coding
Post by: vh on May 12, 2015, 11:33:40 AM
i feel like there should be a better way to handle that block of elif statements for every direction you had
Title: Re: Coding
Post by: atomic7732 on May 12, 2015, 02:16:42 PM
i agree but can't think of anything
Title: Re: Coding
Post by: vh on May 12, 2015, 03:39:40 PM
well i don't know how it works so i'm not going to try deciphering it but i think this piece of code should help.

Code: [Select]
def gettheta(tlc): #threelettercode
dd = {'E':0, 'N':1, 'W':2, 'S':3}
if 'S' in tlc and 'E' in tlc:
dd['E'] = 4
theta = dd[tlc[-1]]
for l in reversed(tlc):
theta = (dd[l] + theta)/2.
return theta/2.*math.pi #convert to radians

then you can do

Code: [Select]
inith = math.cos(gettheta(tlc)) * stormsp / hfactor
initv = math.sin(gettheta(tlc)) * stormsp / 60

or something

you still need an separate case for the STATIONARY

---

or for some shorter (but less elegant) code

Code: [Select]
dirmap = dict(zip(['E', 'ENE', 'NE', 'NNE', 'N', 'NNW', 'NW', 'WNW', 'W', 'WSW', 'SW', 'SSW', 'S', 'SSE', 'SE', 'ESE'], [i/8.*math.pi for i in range(16)]))
and

Code: [Select]
inith = math.cos(dirmap[tlc]) * stormsp / hfactor
initv = math.sin(dirmap[tlc]) * stormsp / 60

----

also considering that objects are passed by reference i'm pretty sure instead of

Code: [Select]
grid[lastmonth - 1][math.floor(lastlat)][math.floor(lastlon) - 100].x += dlat
grid[lastmonth - 1][math.floor(lastlat)][math.floor(lastlon) - 100].y += dlon
grid[lastmonth - 1][math.floor(lastlat)][math.floor(lastlon) - 100].w += dwind
grid[lastmonth - 1][math.floor(lastlat)][math.floor(lastlon) - 100].p += dpres
grid[lastmonth - 1][math.floor(lastlat)][math.floor(lastlon) - 100].d += 1

you can do

Code: [Select]
cell = grid[lastmonth - 1][math.floor(lastlat)][math.floor(lastlon) - 100]
cell.x += dlat
cell.y += dlon
cell.w += dwind
cell.p += dpres
cell.d += 1
Title: Re: Coding
Post by: vh on May 25, 2015, 11:35:36 AM
A tool I made for designing geometric minecraft builds. Plots ellipses, splines, parabolas, hyperbolas, and anything you can write as a parametric function.

Code: [Select]
def demo():
B = UnitGrid(-100, 100, -100, 100, False, False)
print 'plotting hyperbola'
B.hyperbola(17, 23, 54, -71, 1)
print 'plotting ellipse'
B.ellipse(-20, -80, 15, 17)
print 'plotting parabola'
B.parabola(0.01, -2, 20)
print 'plotting line'
B.line(54, -90, -90, 11)
print 'plotting spline'
B.spline([0,10,72,-4,-90,-100],[0,10,-11,17,-90,-100])
B.write('demo')

demo()

you can clearly see the ellipse, hyperbola, parabola, spline, and line in this image.
Title: Re: Coding
Post by: vh on June 01, 2015, 03:47:39 PM
this is more stats than coding but whatever.

x axis: days since epoch
y axis: seconds since 0000
color: keypresses per five minutes
Title: Re: Coding
Post by: Darvince on June 01, 2015, 04:22:10 PM
whenpulse
Title: Re: Coding
Post by: FiahOwl on June 01, 2015, 04:42:12 PM
pyclick
Title: Re: Coding
Post by: blotz on June 01, 2015, 07:20:51 PM
is epoch the new thing for epic
jkjk i aint dat stupid
Title: Re: Coding
Post by: vh on July 11, 2015, 01:48:19 AM
i'm working on something.

https://dl.dropboxusercontent.com/u/42218552/kol.gif
Title: Re: Coding
Post by: Bla on July 11, 2015, 02:28:59 AM
Cute
Title: Re: Coding
Post by: blotz on July 12, 2015, 07:43:36 PM
its ubox 0.00001
Title: Re: Coding
Post by: Darvince on July 12, 2015, 07:59:54 PM
it looks like it tries to swirl but then it doesnt'
Title: Re: Coding
Post by: vh on July 18, 2015, 12:15:42 AM
LET ME EDUMACATE YOU GUYS ON THE WONDER OF PYTHON'S COMPLEX NUMBERS

IMAGINE YOU WANT TO CALCULATE THE DISTANCE OF TWO POINTS LIKE A CIVILIZED PERSON

Code: [Select]
a = (x1, y1)
b = (x2, y2)
def distance(a, b):
    return ((a[0]-b[0])**2+(a[1]-b[1])**2)**0.5

that's 36 goddamn characters after the return. two layers of parentheses. ewwww

NOW LETS USE SOME COMPLEX NUMBERS

Code: [Select]
a = x1+y1*1j
b = x2+y2*1j
def distance(a,b):
    return abs(a-b)

BAM JUST EIGHT CHARACTERS LOOK AT THAT EFFICIENCY this is the power of complexes
Title: Re: Coding
Post by: Darvince on July 18, 2015, 12:22:21 AM
kol
Title: Re: Coding
Post by: vh on July 18, 2015, 01:32:46 AM
fixed a few bugs, added plummer softening

new simulation showing a slightly perturbed grid of particles on a toroidal plane (yes it wraps). gravity calculations are a bit more complex now.

you can see an initial collapse phase followed by a stable dynamic phase

due to an artifact of my approximation scheme, most of the mass clusters at the center of the screen (which, as far as glitches go, is pretty sweet)

https://dl.dropboxusercontent.com/u/42218552/kol2.gif

Title: Re: Coding
Post by: Bla on July 18, 2015, 03:08:46 AM
Kolkute
Title: Re: Coding
Post by: vh on July 21, 2015, 02:09:30 PM
update on my simulation. fixed a shitton of physics bugs. each second is 1.5 billion years, the size of the simulation is about 32 Mpc. each point represents the mass of 40 Large Magellanic Clouds

https://dl.dropboxusercontent.com/u/42218552/kol4.gif
Title: Re: Coding
Post by: vh on July 26, 2015, 02:40:18 PM
A nifty script to compute area

Input: Image named map.png in equirectangular projection. Must be only black and white.
Output: prints a number between 0 and 1 which represents the proportion of the map which is black on a globe.

Code: [Select]
from PIL import Image
import numpy as np
from math import cos, pi
im = Image.open('map.png')
im = im.convert('L')
imarr = np.array(im)/255
dy, dx = imarr.shape
area = 0
for y, cir in enumerate(imarr):
    factor = cos(((y+.5)/dy-.5)*pi)
    area += factor*np.sum(cir)
area /= dx**2/pi
area = 1-area
print area
Title: Re: Coding
Post by: Bla on July 26, 2015, 03:38:47 PM
Kolkute

I was working on calcing some areas today but using another method where I used G.Projector to turn the map into an equal area projection and then counting pixels of various areas.
https://docs.google.com/spreadsheets/d/1uzJnsESvGT6UziUjPeLsWRpqULjNYzLxlUuaSia4ayM/edit#gid=0
Title: Re: Coding
Post by: vh on August 12, 2015, 01:30:27 PM
a script which computes the best way to release *vision votes in order to generate the most suspense.

currently it just brute forces random permutations and takes the best result. there's probably a much better way to do this
Title: Re: Coding
Post by: Bla on August 12, 2015, 02:29:19 PM
Idk how you did it in the code but in Videovision 2 I just started from the end with all the points, and then picked someone to release results last who would leave as many potential winners as possible. Then I did the same for the second last release, and so on.
Title: Re: Coding
Post by: vh on August 12, 2015, 05:35:45 PM
i basically just maximized a metric i made up to represent suspense

consider the time when a subset of all the votes has been released. at this point, the suspense is computed to be the sqrt(total points given out)*sum of x_max/(k+x_max-x_i) where x_max is the highest scoring entry and x_i are the scores of every other entry except that one.
k is a constant to avoid singularities on a tie.
as you can see, if many entries are close to the highest scoring entry, there's much more suspense.
the sqrt(total points) factor makes the suspense more heavily weighed when nearly all the votes are given out
i sum this suspense metric for every new vote that's released to get the total suspense, and that's what's maximized
Title: Re: Coding
Post by: vh on August 16, 2015, 08:04:45 AM
my gravity sim code
Title: Re: Coding
Post by: vh on August 16, 2015, 08:39:19 AM
i've pressed 10 million keys in the last year
Title: Re: Coding
Post by: Bla on August 16, 2015, 11:03:39 AM
Nice chart kol
Title: Re: Coding
Post by: Darvince on August 16, 2015, 03:11:17 PM
can i have whenpulse
Title: Re: Coding
Post by: vh on August 16, 2015, 04:22:22 PM
yes.
Title: Re: Coding
Post by: vh on September 03, 2015, 03:15:22 PM
omf https://github.com/munificent/vigil
Title: Re: Coding
Post by: Bla on September 03, 2015, 04:01:41 PM
Kol joke code languages are the best.
Title: Re: Coding
Post by: vh on September 04, 2015, 07:21:51 PM
i wrote some code to format c code for me
it turns this:

Code: [Select]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static heap_t *_heap_create(int s, long *f)
{
    heap_t *h;
    h = malloc(sizeof(heap_t));
    h->h = malloc(sizeof(int)*s);
    h->s = h->cs = s;
    h->n = 0;
    h->f = f;
    return h;
}
 
static void _heap_destroy(heap_t *heap)
{
    free(heap->h);
    free(heap);
}

int main()
{
    huffcode_t **r;
    int i;
    char strbit[MAXBITSPERCODE];
    const char *p;
    long freqs[BYTES];
 
    memset(freqs, 0, sizeof freqs);
 
    p = test;
    while(*p != '\0') freqs[*p++]++;
 
    r = create_huffman_codes(freqs);
 
    for(i=0; i < BYTES; i++) {
        if ( r[i] != NULL ) {
            inttobits(r[i]->code, r[i]->nbits, strbit);
            printf("%c (%d) %s\n", i, r[i]->code, strbit);
        }
    }

    free_huffman_codes(r);
 
    return 0;
}

into this:

Code: [Select]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static heap_t *_heap_create(int s, long *f)                                    {
    heap_t *h                                                                  ;
    h = malloc(sizeof(heap_t))                                                 ;
    h->h = malloc(sizeof(int)*s)                                               ;
    h->s = h->cs = s                                                           ;
    h->n = 0                                                                   ;
    h->f = f                                                                   ;
    return h                                                                  ;}
 
static void _heap_destroy(heap_t *heap)                                        {
    free(heap->h)                                                              ;
    free(heap)                                                                ;}

int main()                                                                     {
    huffcode_t **r                                                             ;
    int i                                                                      ;
    char strbit[MAXBITSPERCODE]                                                ;
    const char *p                                                              ;
    long freqs[BYTES]                                                          ;
 
    memset(freqs, 0, sizeof freqs)                                             ;
 
    p = test                                                                   ;
    while(*p != '\0') freqs[*p++]++                                            ;
 
    r = create_huffman_codes(freqs)                                            ;
 
    for(i=0; i < BYTES; i++)                                                   {
        if ( r[i] != NULL )                                                    {
            inttobits(r[i]->code, r[i]->nbits, strbit)                         ;
            printf("%c (%d) %s\n", i, r[i]->code, strbit)                    ;}}

    free_huffman_codes(r)                                                      ;
 
    return 0                                                                  ;}
Title: Re: Coding
Post by: vh on September 05, 2015, 02:51:15 PM
all the code i needed to make this post, all ~300 lines and 9 hours of it.

http://universesandbox.com/forum/index.php/topic,2724.msg155589.html#msg155589

Title: Re: Coding
Post by: Bla on September 07, 2015, 12:33:25 PM
From a Game of Life assignment for a computer science course
(written in MatLab though)

(http://i.imgur.com/zoyPvAT.png)

(http://i.imgur.com/HPMrvV4.png)
Title: Re: Coding
Post by: atomic7732 on September 07, 2015, 12:50:04 PM
cute

that figure looks like a replicator (high life?) or whatever ship thingy you can make from it in conway's life
Title: Re: Coding
Post by: vh on September 09, 2015, 06:50:32 AM
wowowowoowowowowowowowowowow
Title: Re: Coding
Post by: Bla on September 21, 2015, 03:28:30 PM
Finished a numeric integration-thing that calculates the path of n bodies affected by gravity (or an equivalent kind of force), in 3 dimensions (plots 2 only) for computer science class.
Timestep is calculated depending on how much the acceleration changes and end time, gravitational constant, how often it plots points and initial conditions are entered.

Examples:

(http://i.imgur.com/5q6GoMU.png)

(http://i.imgur.com/5XLtbrZ.png)

(The units are pretty arbitrary)

Oh and on the lower plot the upper line is kinetic energy, lower line is potential energy and the (fortunately) constant line is total energy.
Title: Re: Coding
Post by: vh on September 21, 2015, 04:10:42 PM
wow cute
Title: Re: Coding
Post by: atomic7732 on September 21, 2015, 04:16:55 PM
the new universe sandbox everyone :P
Title: Re: Coding
Post by: Darvince on September 21, 2015, 05:00:23 PM
universe sandbox 0.001
Title: Re: Coding
Post by: Bla on September 21, 2015, 11:59:54 PM
Kol :P

Here I let it run for 100 time units with the same conditions

(http://i.imgur.com/nNk07SG.png)

(http://i.imgur.com/Z54DhD7.png)

kol this is too addicting

(http://i.imgur.com/T0XagZs.png)

(http://i.imgur.com/4JiVYRo.png)

(http://i.imgur.com/S4gyapr.png)

(http://i.imgur.com/lKpDzCa.png)
Title: Re: Coding
Post by: Bla on October 01, 2015, 08:15:03 AM
>Saving a file
>Accidentally save entire matrix instead of specific matrix elements in loop
>End up with 10 GB file instead of 270 kB

(http://i.imgur.com/vd8KPBn.png)

wait nooo wait what it's still growing oshi- stop stop stope

(http://i.imgur.com/RujlH5L.png)

catalog.bin was keeled to death after reaching 23.8 GB. Rip in peach catalog.bin after reaching 29% of progress in trying to take over my remaining hard disk space.

(http://i.imgur.com/cDloTVA.png)
Title: Re: Coding
Post by: vh on October 01, 2015, 12:41:47 PM
is that nbt explorer i see there
Title: Re: Coding
Post by: Bla on October 01, 2015, 02:33:13 PM
Kolyes nbt-exploder is my default program for .dat files



Also the gravity sim got an upgrade so it now can make videos

https://www.youtube.com/watch?v=aEh9Y5kqUH8
Title: Re: Coding
Post by: atomic7732 on October 01, 2015, 02:59:59 PM
cute
Title: Re: Coding
Post by: Bla on October 01, 2015, 03:18:14 PM
Thank
Title: Re: Coding
Post by: atomic7732 on October 03, 2015, 12:59:26 AM
Hurricane Marty overlaid on top of every named Pacific storm from 2004-2013
green = tropical
yellow = subtropical
blue = extratropical
gray = disturbance
black = other

(http://i.imgur.com/VFwchU6.png)

and Hurricane Jimena

(http://i.imgur.com/F78nLUZ.png)
Title: Re: Coding
Post by: Darvince on October 03, 2015, 10:08:46 AM
jimena BIG
Title: Re: Coding
Post by: Bla on October 05, 2015, 03:03:25 PM
This week we had to make GUIs

It's depressing to think about the fact that Matlab costs $$$s though, and that even if I wrote e.g. Map War 2 in it, nobody would be able to play it I guess, since they'd have to buy Matlab. Or Idk about the Python Matlab thing. But some day, I hope I can use my experiences to revive the Map War project and program the Strategy Game I Always Dreamt of.

(http://i.imgur.com/u9Vlqsh.png)
Title: Re: Coding
Post by: atomic7732 on October 05, 2015, 03:30:05 PM
wow this is orange oppression
Title: Re: Coding
Post by: Bla on October 06, 2015, 02:37:35 AM
It has no simple orange command :(
Title: Re: Coding
Post by: Bla on October 07, 2015, 06:48:33 AM
Actually I think I've found a way to make Matlab compile scripts into .exe, that would be supercute. The first exe should run a figure demonstrating some Feynman clocks moving. The second one should run the oscillator GUI and plot stuff. If anyone wants to try, let me know if it works for you.

mcc -m <scriptname>
Title: Re: Coding
Post by: atomic7732 on October 07, 2015, 05:58:33 PM
i tried running it but it complained about some acronym

(https://i.gyazo.com/10249914e92f420b99bd5be7f20e258d.png)
Title: Re: Coding
Post by: Bla on October 08, 2015, 04:08:36 AM
Oh great apparently the .exes require this 400 MB thing...

http://se.mathworks.com/products/compiler/mcr/index.html

Thanks for testing though.

I was working on a GUI for Orbit for fun but I guess it won't be of much interest to others if they need to download and install over 400 MB to try it. Anyway this is how it looks

(http://i.imgur.com/nZsp5YF.png)

(http://i.imgur.com/jX86gkf.png)

(http://i.imgur.com/fgLfmiF.png)
Title: Re: Coding
Post by: vh on October 08, 2015, 09:01:43 AM
400 MB is ezpz
Title: Re: Coding
Post by: Bla on October 08, 2015, 11:22:18 AM
If you feel like it, the program in its current state is here

Also this

(http://i.imgur.com/AWuL7dy.png)
Title: Re: Coding
Post by: atomic7732 on October 08, 2015, 11:54:40 AM
what happened to 15% of the energy
Title: Re: Coding
Post by: Bla on October 08, 2015, 11:55:11 AM
Fuck energy conservation, just go with the colorful lines!
Title: Re: Coding
Post by: Lord DC on October 08, 2015, 01:24:35 PM
Fuck energy conservation, just go with the colorful lines!
Title: Re: Coding
Post by: atomic7732 on October 18, 2015, 09:58:29 PM
i'm play code windowed program

currently it handles not much more than a pannable and zoomable map (but it scales the pan when zoomed in! and stays centered!)

you can also adjust the text boxes at the top, and it tells you your cursor position

(https://i.gyazo.com/87e91377dccc38c22f6c2e31ce577b56.png)
Title: Re: Coding
Post by: Bla on October 19, 2015, 09:36:14 AM
Nice start, I expect to see Map War 2 gameplay implemented by November 1st
Title: Re: Coding
Post by: FiahOwl on October 25, 2015, 10:03:13 PM
got bored and worked on something today

Star System Generator 0.1.0!

Functionality includes a GUI that contains a button that you may press in order to generate a solar system in the console, and a text field that doesn't do anything.
Title: Re: Coding
Post by: atomic7732 on December 13, 2015, 03:48:00 AM
I wrote a cute little script today which generates this (http://paladinofstorms.net/meteo/npac/latest.jpg) every 30 minutes.
Title: Re: Coding
Post by: Bla on December 13, 2015, 06:10:07 AM
Cute colors thar
Title: Re: Coding
Post by: vh on December 27, 2015, 08:46:44 AM
going to talk about my code without actually posting it cause it's on my rl github account
i've been working on a gravity simulation to model the cosmological structure of the universe
here are how many gravitational interactions a brute force approach would have to compute:
Code: [Select]
2^10 (periodic boundary conditions)
2^12 (number of timesteps)
2^32 (number of bodies squared)
2^1  (number of acceleration calculations per step of verlet)
2^55 (total)
2^55 is about 36000 trillion, which is a bit even for modern computers.

anyway i managed to optimize it down. i added a counter to see how many computations i ran, and it ends up equivalent to 2^35 gravitational interactions, or about 34 billion, which my laptop does inside of an hour.

that's a speed of factor of 2^20 -- around a million, which is not so bad if i say so. also i managed to get multiprocessing working so that's another speedup of 2^3 on top of everything
Title: Re: Coding
Post by: vh on January 21, 2016, 02:03:43 PM
[16:00] <+syule> what the hell
[16:01] <+syule> i changed my code in a way that shouldn't speed it up
[16:01] <+syule> and my code sped up by a factor of like 100
[16:01] <+syule> what the fucking fuck
[16:01] <+syule> wait i know why
[16:01] <+syule> branch prediction
[16:01] <+syule> gdi

immediately before this i had a problem where multiprocessing slowed down my code by a factor of 6
Title: Re: Coding
Post by: vh on January 21, 2016, 02:26:59 PM
i just realized i was using the debugger in release mode

disabling it just sped up my code by another factor of 100+
this is glorious
Title: Re: Coding
Post by: atomic7732 on January 21, 2016, 03:30:06 PM
so is that a factor of 101 (after the second) and 10000 after the first?

how do factors work
Title: Re: Coding
Post by: Lord DC on January 21, 2016, 03:43:21 PM
factor is a fancy way of saying multiplied, atleast the way ive heard it used.

Ex: Training with Omnipotencian trainers ups your power by a factor of 1,000
Title: Re: Coding
Post by: atomic7732 on January 21, 2016, 06:27:29 PM
yes but multiply 100 by 100 or 1 by 100

they are different results
Title: Re: Coding
Post by: vh on January 21, 2016, 07:46:13 PM
so apparently the reason my code suddenly got so fast is because i accidentally created a bug which caused the code to actually not do any computations at all but still appear to work and yeah i fixed that and now it's back to not being super fast but still being 2 to 3 times faster than it was before

1 million bodies for ten thousand timesteps should take about a day to compute now
Title: Re: Coding
Post by: atomic7732 on January 25, 2016, 11:20:12 PM
(https://i.gyazo.com/cea4311f2d7d9cf3abc758e2c424b835.png)

it's not done yet
Title: Re: Coding
Post by: atomic7732 on January 26, 2016, 02:39:37 PM
so anyway, i calculated musical taste groupings for the 15 eligible past participants of univision

basically what I did was, I compared the votes of every nation with every other nation, and got values for every single pairing (vote similarity + whether both nations vote for each other)

then created an algorithm which would split the nations into 4 groups which internally matched the closest, ignoring the rest of the nations

the result is 4 different musical tastes, or "pots"

(https://i.gyazo.com/424d91a8a865058d75946e732dfdd441.png)

if you think you're in the wrong pot, you very well may be, but you likely were sacrificed for someone else who fit better. for example, darvincia fits very well into pot C (Solea, Dotruga, and Blaland are his 1st, 2nd, and 4th most similar nations), and not very well into B (with his 6th, 8th, and 13th)

but the nation that he switched with, Bielosia, fits worse in pot B (10th, 11th, 12th), but about equally as well as Darvincia did in pot C (1st, 2nd, 5th)

this switch increased total affinity by 17 units

this doesn't exactly serve any functional purpose in univision, since we have no semifinals, but it does give a quantified sense of musical tastes and voting similarities

a more detailed chart and calculations that were used to determine this can be found here (https://docs.google.com/spreadsheets/d/1_E0EyVikuYqi_X2t3wiAfqbVBu4s3-9wKmr7X1nQj8Y/edit#gid=32936945)
Title: Re: Coding
Post by: Darvince on February 02, 2016, 11:47:48 AM
can someone check all ips on wikipedia like contributions for 174.19.xxx.xxx
Title: Re: Coding
Post by: FiahOwl on February 02, 2016, 01:45:43 PM
that sounds like it'd take a long time
Title: Re: Coding
Post by: blotz on February 02, 2016, 02:00:26 PM
i think it might make individual pages for each IP so it should be relatively easy.
Title: Re: Coding
Post by: atomic7732 on February 02, 2016, 02:48:52 PM
there are contribs pages for every IP that has edited so yes
Title: Re: Coding
Post by: Darvince on February 02, 2016, 04:48:06 PM
fiah there's a reason i asked in the coding thread (hint hint)
Title: Re: Coding
Post by: atomic7732 on February 15, 2016, 12:32:40 AM
dar's number criteria thing i coded for him

even numbers not divisible by 10 whose digit sums are primes whose digit sums are prime

http://pastebin.com/dWrnN7VY

example: 14972 (even)

1+4+9+7+2 = 23 (prime)
sum again:
2+3 = 5 (prime)
Title: Re: Coding
Post by: blotz on February 15, 2016, 08:45:50 AM
do you even loop kalassak?
#rekt
http://pastebin.com/xNVqWXcj
Title: Re: Coding
Post by: vh on February 18, 2016, 11:42:48 AM
holyshit, i just discovered this new python built-in today

testing if all values in a list are positive:

old style:
Code: [Select]
false not in [val > 0 for val in lst]
with this built-in:
Code: [Select]
all(val > 0 for val in lst)
Title: Re: Coding
Post by: Bla on March 15, 2016, 06:26:12 AM
I was working on a script that needs to fit a function, which has decided that it wants to contain an integral. I spent more than an hour trying to figure out why many variables, starting with Rg, began to change to ridiculous values after the first turn in the loop. Well, it turns out I used c for the speed of light and forgot that I also trashed a useless matrix element into a variable called 'c' in the loop. gg. Do never use c for anything else than the speed of light.

(http://i.imgur.com/YgTT4gV.png)
Title: Re: Coding
Post by: vh on March 15, 2016, 07:28:35 AM
kol bad variable names have cost me many hours of debugging

also when i write physics simulations and i do something like
x_velocity += x_acceleration*t
the copy and paste it, changing x to y to update y_velocity -- but i only change some of the x's to y's and forget the rest
Title: Re: Coding
Post by: Bla on March 15, 2016, 07:44:58 AM
Yes also formulas with x1 v1 a1 t1... then you write a giant formula with lots of stuff and change half the x1's to x2's but forget this one a1 that screws up everything and takes 3*10^8 hours to find
Title: Re: Coding
Post by: atomic7732 on March 15, 2016, 03:07:32 PM
i am a goddess

uniformly distributed points on a sphere
Title: Re: Coding
Post by: blotz on March 15, 2016, 04:14:40 PM
dat looks like a circle
Title: Re: Coding
Post by: atomic7732 on March 15, 2016, 05:28:29 PM
it's a 2d projection of points on a sphere
Title: Re: Coding
Post by: blotz on March 15, 2016, 05:34:02 PM
oh so it is like see through
Title: Re: Coding
Post by: atomic7732 on March 15, 2016, 10:46:14 PM
it don't work
Title: Re: Coding
Post by: atomic7732 on March 15, 2016, 10:51:23 PM
ok so there's obviously a problem but i made the attractive force stronger and removed the initial random velocities

and it looks more like it works... i'm going to have to fix whatever problem showed up above (they start to collect around the poles by default?)
Title: Re: Coding
Post by: atomic7732 on March 16, 2016, 12:11:52 AM
[00:00] <+kalassak> two particles just decide that
[00:00] <+kalassak> they shouldn't repel directly away from each other
[00:00] <+kalassak> wth
[00:01] <+kalassak> something's wrong with the fundamental math
[00:01] <+kalassak> and i have no idea where to start
[00:10] <+kalassak> i wouldn't be surprised if i just typed sin where it was supposed to be cos or vice versa
Title: Re: Coding
Post by: atomic7732 on March 17, 2016, 04:41:46 PM
pole collection has kicked into overdrive

i fixed the math and the particles move in the right direction now (although toward each other in this example, because that's easier to test than repulsion)

i also updated the graphics... green = near hemisphere, purple = far hemisphere
Title: Re: Coding
Post by: atomic7732 on March 17, 2016, 05:05:30 PM
and repulsion
Title: Re: Coding
Post by: atomic7732 on March 17, 2016, 06:27:27 PM
good news

sometimes two particles on opposite sides of the planet interact with each other, take similar paths, and then shoot off at high speed

i have no idea why



also i have a theory as to why things get stuck at the poles... they basically cross over or near the pole but retain their velocity numerically... so like, they might have a positive y velocity near the north pole, cross it, then still have a positive y velocity... which causes them to cross near the pole again over and over.

not really sure how to fix it, maybe i could try to calculate the final bearing for every particle and if the bearing is southerly/northerly and it wasn't before then the y velocity will be inverted
Title: Re: Coding
Post by: blotz on March 17, 2016, 06:33:18 PM
can u make a circle so i can c the planet thx
Title: Re: Coding
Post by: vh on March 20, 2016, 06:55:24 PM
this was a five minute hack i put together.

ever wonder how much time you waste browsing reddit or playing minecraft? too lazy to track your habits? well this is the script for you.

it takes a screenshot of your entire screen (should work for multiple monitors too) with a 1/600 chance every second (so an image every 10 minutes on average), and saves it to a file in the same directory with the unix timestamp as filename.

at the end of the day, you should have 144 screenshots or so which you can look through quickly and get an idea of exactly how much time you wasted.

this works on windows only
requires:
PIL / Image
pywin32
Title: Re: Coding
Post by: vh on March 20, 2016, 07:01:25 PM
random dump of the code i used to compute optimal elytra flight. the first 45 lines are pretty beautiful code, the rest is sloppy
Title: Re: Coding
Post by: vh on March 20, 2016, 07:04:41 PM
simulation of this chaotic system, in which every point has two randomly selected target points that it wants to be equidistant to, and points cannot get too close or too far from each other

https://dl.dropboxusercontent.com/u/42218552/0test.mp4

"so what are the points trying to do?"

they're trying to go to perpendicular bisectors (which are drawn out) of their target points. this obviously makes them equidistant

"but senpai, why are the points so jittery"

well you see, having them actually move toward the bisector requires a good amount of math

"you're good at math ... right?"

i coded this on a friday night, when my brain was mush, so instead of doing the math, i just had each point make 10 random moves, compute how good each move was, and select the best move. which is why it's jittery, because it's searching for local optima and does no planning

Title: Re: Coding
Post by: atomic7732 on March 20, 2016, 08:11:11 PM
this was a five minute hack i put together.

ever wonder how much time you waste browsing reddit or playing minecraft? too lazy to track your habits? well this is the script for you.

it takes a screenshot of your entire screen (should work for multiple monitors too) with a 1/600 chance every second (so an image every 10 minutes on average), and saves it to a file in the same directory with the unix timestamp as filename.

at the end of the day, you should have 144 screenshots or so which you can look through quickly and get an idea of exactly how much time you wasted.

this works on windows only
requires:
PIL / Image
pywin32

perfect
Title: Re: Coding
Post by: vh on March 21, 2016, 11:50:05 AM
snip

now fixed so that if you lock your screen it won't crash
Title: Re: Coding
Post by: atomic7732 on May 06, 2016, 05:26:56 PM
(https://i.gyazo.com/cd2dbb118f1a04d1cc04390f8bcec6b4.png)

(https://i.gyazo.com/c8d7ec3049037a83d68c36af62432b2f.png)

i wrote a very rudimentary gravity simulator that's limited to 3 bodies but you can watch it as the simulation progresses

requires matplotlib
Title: Re: Coding
Post by: atomic7732 on May 24, 2016, 04:02:15 AM
this line is the death of my code:

Code: [Select]
input=open("coords.txt",'r')
which is funny, because it works just fine

but i'm running a script through cmd that runs in jython in some other program... and that causes it not to work

which is funny, because it should work just fine per this http://www.ssec.wisc.edu/~tomw/visadtutor/load.html

but, i did have some issues coding since some functions were changed from some earlier version of this program and had to updated to a new version of the function name... but that was for some other module presumably and not... normal... file... input/output... operations?????????????????????



anyway, i've been trying to get some help on the support forum for said program for a month now but my account hasn't been approved

so i made a new one

i figure this issue probably has a really simple fix and i'm just missing something really stupid... but i don't know, maybe i'll know in july
Title: Re: Coding
Post by: atomic7732 on May 24, 2016, 05:47:54 PM
a more detailed chart and calculations that were used to determine this can be found here (https://docs.google.com/spreadsheets/d/1_E0EyVikuYqi_X2t3wiAfqbVBu4s3-9wKmr7X1nQj8Y/edit#gid=32936945)
new univision pots

(https://i.gyazo.com/8981b2195d908b59a31a5bd1bf8bdc72.png)
Title: Re: Coding
Post by: FiahOwl on May 24, 2016, 06:36:44 PM
#shitposting club
Title: Re: Coding
Post by: Darvince on May 24, 2016, 09:31:45 PM
wouldn't that be

darvincia aeridani kallisto bongatar
Title: Re: Coding
Post by: vh on May 24, 2016, 09:34:36 PM
>implying i would stoop to the level of shitposting
Title: Re: Coding
Post by: Darvince on May 24, 2016, 10:32:13 PM
you shitpost in univision by sending yoko ono
Title: Re: Coding
Post by: vh on May 24, 2016, 10:41:42 PM
>no you shitpost by not sending enough yee
Title: Re: Coding
Post by: vh on May 26, 2016, 08:43:06 AM
we define the product function over the d-dimensional space as the product of the components of any point.
for example, product(.2) = .2, product([0.5,0.5,0.5]) = 0.125

if we integrate product over the unit interval [0,1], we get 1/2
if we integrate product over the unit square, with corners (0,0) and (1,1), we get 1/4
if we integrate product over the unit cube, we get 1/8
if we integrate product over the unit d-dimensional hypercube, we get 2^-d

notice that in high dimensions, this function has a very narrow peak which can trip up numerical integration methods.
therefore it is a good way to test how good a numerical integrator is.

we measure error of a numerical integrator as follows:
if the integrator returns some value y, and the actual solution is w, we say error is y/w-1

in the below graph, the x-axis is the number of dimensions
the y-axis is the error as computed previously

the blue line represents a perfect symbolic integrator
the red line is a non-adaptive monte carlo integrator
the green line is an adaptive monte carlo integrator (VEGAS) which i used from this python library which is really nice

parameters were set so that both numerical integrators sampled 150000 points
we can see that up to 12 dimensions or so, the adaptive integrator is off by no more than one part in a thousand
Title: Re: Coding
Post by: atomic7732 on June 10, 2016, 03:05:07 AM
(http://i.imgur.com/dBHWQl8.png)

I got WRF (an open-source regional weather model) running today and I've run a few test simulations... Here's my first "real" simulation:

It's a simulation using the North Atlantic basin as the domain for the model. I'll be using this as my region to see how the model forecasts Atlantic TCs throughout the season. I might also set up a region for the EPAC or WPAC but as of yet they haven't been doing anything.

I ran the simulation for 72hrs out from 2016-06-10 00:00:00 UTC with 30 km resolution, using the GFS model as data input and for the bounds of the sim (since it's a regional model). The run took about 55 minutes to complete. Here are a few of the types of data it can output that I've been messing around with:

http://imgur.com/a/6drUC

The first album here is just 6 hour precipitation between each frame for the whole length of the run.

(http://i.imgur.com/zIMWAQI.png)

Here is an outgoing longwave radiation plot which works well to visualize where clouds and convection are. There is definitely a better way to simulate infrared satellite (probably a combination of factors and some math) but I don't know how to do that yet.

(http://i.imgur.com/xHb5rFA.png)

And here is a plot of mean sea level pressure and 10m winds. I'm still working on the contour-fill color scheme.

I'm still messing around with it though and trying to figure out all the cool things you can do with it.

But finally... I'm in control. ^-^
Title: Re: Coding
Post by: FiahOwl on June 10, 2016, 09:58:19 AM
oh no Kalassak is in control of the weather pls be benevolent weather god
Title: Re: Coding
Post by: Darvince on June 10, 2016, 11:32:36 AM
kol
Title: Re: Coding
Post by: atomic7732 on June 29, 2016, 01:59:31 AM
(http://i.imgur.com/11obLHk.png)

ehhhh... what

y axis is time (date of year)
x axis is longitude (in degrees)

points are locations of the formation of tropical cyclones

i'm trying to see if there's a pattern in the longitude of their formation... something like this:

(http://i.imgur.com/e8uWFYp.png)

but i have no idea because the kernel function is predicting(?) places of high frequency of cyclone formation where there were none, specifically west of 60E

and not showing any frequency where cyclones did actually form

cause it likely follows a pattern similar to this:

(https://upload.wikimedia.org/wikipedia/commons/8/8d/MJO_5-day_running_mean_through_1_Oct_2006.png)
Title: Re: Coding
Post by: atomic7732 on July 03, 2016, 09:57:23 PM
(https://s31.postimg.org/ucjoeaxpn/dvorak.png)

[04:53] <+kalassak> i'm working on a game but since i can't code it on vacation i figured i'd mess around with mechanics
[04:53] <+kalassak> so i'm figuring out how to generate dvorak numbers based on a known correct intensity
[04:53] <+kalassak> so that the player can take the dvorak and use it for their tracking
[04:56] <+kalassak> less often a microwave estimate will be given (a bit more accurate) and even less often will you get a scatterometer pass (very accurate)
Title: Re: Coding
Post by: Darvince on July 03, 2016, 10:59:45 PM
for R E A L I S M scatterometer should only be accurate below hurricane strength
Title: Re: Coding
Post by: vh on September 09, 2016, 08:03:26 PM
A video of my repulsive gravity simulator.

The repulsion seems to slow down over time. that's just the universe expanding according to hubble's law
Title: Re: Coding
Post by: tuto99 on September 09, 2016, 09:25:09 PM
doesnt play 0/10
Title: Re: Coding
Post by: vh on September 10, 2016, 06:32:08 AM
yes it does
Title: Re: Coding
Post by: vh on September 10, 2016, 12:15:40 PM
https://www.youtube.com/watch?v=LrjYWNN5sQ8&feature=youtu.be

a small scale simulation before i actually run the full scale version of the simulation. if you view this in full screen, each white pixel weighs about 2 milk way galaxies. the reason there are bars on the side of this video is because the video itself is 1024 x 1024, yet youtube kept resizing it to 720p, losing information in the process, so i was forced to pad it until it was 1920 x 1080. there are 65536 objects in this simulation. the full scale sim will have just over a million (2^20). each second of this video is about 160 million years of time.

i will admit there are some "glitches" with this simulation. if you watch one of the blobs in the lower left corner, you'll see that at some point, it spontaneously explodes itself.
Title: Re: Coding
Post by: FiahOwl on September 10, 2016, 12:22:05 PM
that is really cool*
Title: Re: Coding
Post by: Bla on September 10, 2016, 12:41:01 PM
Very cool
Title: Re: Coding
Post by: vh on March 04, 2017, 11:34:08 PM
yall need to be more active



Start with the numbers from 3 through 10 billion (skip 1 and 2 because they have weird properties). Now compute a list of primes in that range -- there should be a bit less than 500 million of them.

Now consider these primes in groups of 3072 primes each, with groups separated by 2048 primes, so that there are 1024 primes of overlap. We will do some math with each group.

Take the second prime, subtract it from the first prime. This gives you the first number in a new sequence. Then take the third prime, subtract it from the second prime, giving you the second number. Continue doing this through all 3072 primes. This procedure is called the adjacent difference.

Now take the absolute values of this sequence. You don't have to do this really, because all the numbers are positive right now -- but that will change.

Go back to the start and take the adjacent difference of your sequence again. Then take he absolute value. Then the adjacent difference. Keep going. After a while, you will realize that all your numbers have become zeroes and twos.

You are done with the first group. Now take your second group of 3072 primes, and repeat. There are over 200 thousand groups in this first chunk of 500 million primes.

You finish your first chunk. Out of all the groups, what is the most repeats of adjacent difference and absolute value you had to take before everything became 0s and 2s? Let's call this value the "chunk maximum"

Now move on to your second chunk. And the third. And so on. The final goal is to process 10 million chunks (up to the number 10^17), containing an aggregate total of over 2600 trillion primes.

Now ask yourself, at any point in time, what is the most difficult group of primes you have seen before? In all the groups in all chunks which you have processed, which group took the most iterations of adjacent difference and absolute value? Let's call this value the "global maximum"

In the plot below, the blue line is a smoothed plot of the chunk maximum. The green line is the global maximum. On the x axis is the chunk number. As you can see, I'm not too close to the ultimate goal of 10 million yet. Then again, I've only been running my code for about a day.
Title: Re: Coding
Post by: atomic7732 on March 05, 2017, 12:15:18 AM
what is the significance of this?
Title: Re: Coding
Post by: Bla on March 05, 2017, 12:51:55 PM
Ok some recent stuff from my master project

A small script I wrote to determine the size of Sr atomic cloud from photos of its flourescence

(http://i.imgur.com/jbzPt7w.png)

A bit from another script I wrote that simulates the physics in the cloud inside a cavity and magneto-optical trap, and applying a Rabi pulse. This predicts the fraction that would be excited by different pulse durations (starting at 100 µs)

(http://i.imgur.com/woNgJKD.png)

The script can make sims with different experimental parameters to maximize the flash intensity or number of excited atoms. Here's an example of max excited fraction with different combinations of the waist sizes of the Rabi laser pulse

(http://i.imgur.com/i2CdnIm.png)

It takes into account temperature, magnetic field, cloud shape (gaussian but can be elongated along axes), seed and Rabi laser power, number of atoms, and uhh, lots of other things.
Bachelor students did some experiments in the lab and I hacked their results to compare with my simulation. However all this was from when we weren't very sure on the cloud size, temperature and stuff. The bachelor students worked on measuring temperature but I don't have their results yet.

(http://i.imgur.com/RmnC4EG.png)
Title: Re: Coding
Post by: vh on March 05, 2017, 09:08:33 PM
cute.

what is the significance of this?

well basically there's this conjecture which says that if you keep taking the absolute adjacent differences of the prime numbers (this will give you a bunch of sequences), the first number of each sequence is always 1.

an more efficient way of testing this is, at the nth iteration of this absolute adjacent difference, all the numbers (besides the first one of course) are 0 and 2. if this is the case up to the kth number in this sequence, you can be sure that the 1st number in the next k absolute adjacent differences is a 1 (convince yourself this is true by working it out on a piece of paper)

now instead of computing the adjacent difference all at once, i compute it in groups. think about this for a minute and it should be clear why the groups of primes i described above need to overlap. now it should also be clear what the significance of that plot is -- it's the number of iterations each group needs to go through

the amount of memory on the streaming multiprocessors i'm running this on is very small (32KB). therefore, i can only fit around 3072 primes on the each multiprocessor at once. i have an overlap of 1024 primes, which means i can do up to 1024 iterations without any problems. this may become problematic if there is some group which requires more than 1024 iterations, but we can fix this by making the overlap larger, say 1536, at the cost of computational efficiency

Title: Re: Coding
Post by: vh on March 06, 2017, 10:12:23 PM
ok well i redid that plot again... big surprise
Title: Re: Coding
Post by: vh on March 11, 2017, 10:32:12 AM
just found out google uses 2 space indents instead of 4

i could never work for them now.
Title: Re: Coding
Post by: atomic7732 on March 11, 2017, 11:41:29 AM
2 space indents are fine
Title: Re: Coding
Post by: Bla on March 11, 2017, 12:30:54 PM
Kol 2 space sounds nice if you have a lot of loops. Coding Map War and some other stuff I got tired of all the code ending up in a small spot on the right
Title: Re: Coding
Post by: vh on March 11, 2017, 09:17:21 PM
2 space indents are fine
no

Kol 2 space sounds nice if you have a lot of loops. Coding Map War and some other stuff I got tired of all the code ending up in a small spot on the right

right but if you have proper coding style, you should never have more than a nesting depth of 4-5 (and that's pushing it), which is only like 1/4th of your column if you follow the 80 character/row rule
Title: Re: Coding
Post by: FiahOwl on March 12, 2017, 10:49:31 AM
>spaces

>banned
Title: Re: Coding
Post by: atomic7732 on March 12, 2017, 12:02:11 PM
well spaces are bad yes

but you can set tab width
Title: Re: Coding
Post by: Bla on March 13, 2017, 02:23:02 PM
I'm using PyQt to make a gui to control the magneto-optical trap (and a new one we're gonna build) for my master project, keep thinking this is a Yqt conspiracy because 1) PyQt and 2) coding
Title: Re: Coding
Post by: vh on March 14, 2017, 12:07:58 AM
i'd like to magneto-optical trap bla in a small green box as well
Title: Re: Coding
Post by: vh on March 23, 2017, 01:07:50 AM
so i wrote some code to plot my time
numbers are in hours per week

code is pretty messy, only reason i'm posting it is cause this is the coding thread

let me tell you getting the plot to look as good as it does now was not very easy at all
i basically had to do everything from scratch
Title: Re: Coding
Post by: Darvince on March 23, 2017, 07:08:44 AM
dIslam
Title: Re: Coding
Post by: vh on March 23, 2017, 05:42:16 PM
i'd dlslam you if you know what i mean
Title: Re: Coding
Post by: vh on March 25, 2017, 07:42:56 PM
ai learning to play from pixels
(that is, it does not have any access to the game state, and is not told the objective or mechanics of the game)
Title: Re: Coding
Post by: Bla on March 26, 2017, 06:24:08 AM
Kolkute
Title: Re: Coding
Post by: Darvince on March 26, 2017, 06:44:11 AM
does it have to guess the controls too
Title: Re: Coding
Post by: vh on March 26, 2017, 07:49:04 AM
it knows there are 9 controls but not what they do ( it has to learn that)
Title: Re: Coding
Post by: Bla on March 26, 2017, 10:33:40 AM
Breaking news: A user on USF called 'vh' is reported missing after developing an AI that's supposed to learn how to play a game. Rumors say the AI took control of a robot factory to recreate the game irl and abducted vh, forcing him to complete the track over and over while detecting his movements.
Title: Re: Coding
Post by: vh on April 12, 2017, 01:18:43 PM
100 pareto optimal elytra flight trajectories over the course of 13 seconds, optimized for distance and altitude
you have the choice between traveling 300 meters and increasing your altitude by 30, or traveling 600 meters and decreasing your altitude by 210, or anything in between!

i'm hoping the chart is pretty self-explanatory. on the x is distance, on the y is altitude relative to initial point. i put a point on each line every 10 ticks (0.5 seconds) for convenience
Title: Re: Coding
Post by: vh on April 12, 2017, 01:19:19 PM
oh right since this is the coding thread i better post the code too
Title: Re: Coding
Post by: Bla on April 12, 2017, 05:08:44 PM
Verycute
Title: Re: Coding
Post by: vh on April 19, 2017, 01:00:06 PM
attempt at using a deep net to generate music.
i'll let you guys judge for yourself
Title: Re: Coding
Post by: FiahOwl on April 19, 2017, 10:03:24 PM
https://www.youtube.com/watch?v=SpKKYBkJ9Hw

skip to 0:38
Title: Re: Coding
Post by: atomic7732 on April 19, 2017, 10:10:53 PM
wtf that's freaky
Title: Re: Coding
Post by: Yqt1001 on April 19, 2017, 10:35:09 PM
That's actually really cool tbh

Anyways I've really taken a liking to being a JS dev. Here's code snippets for the same functions, one in the Java API the other in the Node API.
Java:
Code: [Select]
Customer cu = Customer.retrieve({CUSTOMER_ID});
Map<String, Object> updateParams = new HashMap<String, Object>();
updateParams.put("description", {NEW_DESCRIPTION});
...
cu.update(updateParams);

Node:
Code: [Select]
stripe.customers.update({CUSTOMER_ID}, {
  description: {NEW_DESCRIPTION},
  ...
});

Here's Python:
Code: [Select]
cu = stripe.Customer.retrieve({CUSTOMER_ID})
cu.description = {NEW_DESCRIPTION}
...
cu.save()

the language is freaking ridiculous idk how I survived for years using it
(also don't think about it too much, this example just has shitty java implementation, it could in theory be almost the same as the python implementation)
Title: Re: Coding
Post by: vh on April 21, 2017, 01:59:08 PM
hmm i promise it sounds much better this time around
Title: Re: Coding
Post by: vh on April 25, 2017, 09:13:20 PM
wrote some code to do more fine grained plotting of my time usage. each pie chart is a single week.
weeks arranged left to right first, and then top to bottom next (just like reading text guys)
this semester has pretty much exactly 16 weeks, which makes everything come out really nicely

https://drive.google.com/uc?export=view&id=0B6XNpALRcpv9TUYwV2ZQQkVxUFU

(https://drive.google.com/uc?export=view&id=0B6XNpALRcpv9TUYwV2ZQQkVxUFU)

warning: massive image
Title: Re: Coding
Post by: Bla on April 26, 2017, 03:05:02 AM
Access denied
Title: Re: Coding
Post by: vh on April 26, 2017, 05:55:13 AM
fixed link hopefully

direct linking to images from gdrive is made, for some reason, really difficult
Title: Re: Coding
Post by: vh on May 07, 2017, 07:29:20 PM
i gave my neural network the bottom img and it made the one on top

(https://i.imgur.com/GyHgqUk.png)
Title: Re: Coding
Post by: FiahOwl on May 07, 2017, 09:23:09 PM
oh I thought it was the other way around and I was really impressed
Title: Re: Coding
Post by: vh on May 07, 2017, 10:50:42 PM
oh you silly filly!
Title: Re: Coding
Post by: atomic7732 on May 07, 2017, 11:21:37 PM
silly filly

we 2011 now
Title: Re: Coding
Post by: Bla on May 07, 2017, 11:39:07 PM
Kol wow
Title: Re: Coding
Post by: tuto99 on May 08, 2017, 12:07:16 AM
syule, give your neural network this image:
http://i.imgur.com/7NjCVGg.png
Title: Re: Coding
Post by: vh on May 08, 2017, 01:15:35 PM
not gonna do that because nothing cool is going to come out. the picture i posted was a combination of careful hand tuning and a lot of luck.
Title: Re: Coding
Post by: vh on May 14, 2017, 02:59:40 AM
today in "really weird python functions":

>>> 'hello world'.title()
'Hello World'


come on guys was that really a necessary language feature?
Title: Re: Coding
Post by: Bla on May 30, 2017, 11:50:13 AM
I still don't get how I didn't mess up several times when typing in the second order dt terms and it didn't mess up my simulation to give e^308 photons. Now time to write the second order terms that include the extra laser pulse

Nop I haven't efficientized the math yet. I'm not even sure it's gonna be more efficient with the 2nd order terms than just making the time step lower and run the same amount of time. Obviously slows down the simulation a lot

(http://i.imgur.com/qL1RG81.png)
Title: Re: Coding
Post by: vh on May 30, 2017, 12:25:55 PM
o man dat subexpression elimination waiting to happen
Title: Re: Coding
Post by: atomic7732 on June 04, 2017, 03:42:38 AM
script to generate false color GOES-16 imagery

(http://i.imgur.com/3vsilmP.jpg)

(DATETIME will need to be modified cause the server i use only keeps like the past 24 hours of data)
Title: Re: Coding
Post by: FiahOwl on June 04, 2017, 11:27:10 PM
(https://i.gyazo.com/46c81712fee8ef4ed313bca8dea44c8a.png)
Title: Re: Coding
Post by: atomic7732 on June 13, 2017, 12:46:52 AM
have some messy code that does this

(https://i.gyazo.com/c5ab080d0b63b211ff2b535dda8c441a.png)

(https://i.gyazo.com/07ffa09e2f711c8cd9be25d86e93cc5c.png)
Title: Re: Coding
Post by: atomic7732 on June 14, 2017, 03:55:22 AM
waves and cyclones now have intensities

and waves have to form into cyclones

(https://i.gyazo.com/2429d809bd1d36f90c797eeed6f022cd.png)

oh yeah, and there's land now

requires numpy, matplotlib, netCDF4, and this dataset (http://ftp://ftp.cdc.noaa.gov/Datasets/noaa.oisst.v2/sst.mnmean.nc) from here (https://www.esrl.noaa.gov/psd/data/gridded/data.noaa.oisst.v2.html)
Title: Re: Coding
Post by: FiahOwl on June 15, 2017, 01:15:36 AM
can't wait for the pavala version tbh, when's that coming
Title: Re: Coding
Post by: atomic7732 on June 15, 2017, 01:16:48 AM
uh i'm not sure if i'll make a pavala version in full, but soleani cyclone center will feature the amalthean region at least

edit: some updates

(https://i.gyazo.com/1e23d7f8b9dbadae1e276257e05fbbb5.png)

(https://i.gyazo.com/e90c797092b91cf1d08784cc5dc76175.png)

the second one has a feature where if a cyclone is moving south quickly it weakens... cause it should

and fun fact, 15 epac storms with 5 atl storms in the months of july and august seems weird right but last year it was 13 and 4 (and the sim used last year's sst's so...)
Title: Re: Coding
Post by: Darvince on June 15, 2017, 08:14:54 AM
goond
Title: Re: Coding
Post by: atomic7732 on June 19, 2017, 02:20:05 AM
new update moves the ridges and troughs based on month so now you can run full seasons (and even years, although i haven't tested full years yet)

i did this 6 month run from june to november of 2012 and got

(https://i.gyazo.com/0b63f4aa18e5c1bfb8f26be6afccc4db.png)

simirl
EPAC17-8-217-10-5
ATL19-4-119-10-2

where in X-Y-Z
X is the number of tropical storms
Y is the number of hurricanes
Z is the number of major hurricanes (category 3 or higher)

so i am legit impressed at my own creation

also the color scheme i'm using:
white - tropical depression
yellow - tropical storm
yellow-orange - severe tropical storm
orange - hurricane (cat 1 or 2)
red - major hurricane (cat 3 or 4)
purple - cat 5 hurricane
Title: Re: Coding
Post by: atomic7732 on June 22, 2017, 03:14:55 AM
[07:54]   Kalassak   WEW
[07:54]   Kalassak   it runs so much quicker now
[07:54]   Kalassak   BLESS SYULE GOD FROM THE HEAVENS

(https://i.gyazo.com/0d312983ceca590692edeb6139872cba.png)

a two month sim like that used to take 9 minutes now it takes like 2.5 or less

and the pressure field calculations went from like 1 second to .001 seconds so that's great, now i just have to optimize the graphics time
Title: Re: Coding
Post by: vh on September 30, 2017, 12:08:58 AM
recorded in 1080p60 cause i can

https://www.youtube.com/watch?v=1ZbHdFGfQZk

watch a computer figure out how to swing this heavy pendulum into a vertical position.

the radial arrow indicates the direction and magnitude of torque applied.

this is super interesting: the algorithm decides it can't apply enough force to swing the pendulum into vertical position in one go, so instead, it pushes the pendulum up most of the way in one direction, then lets it fall and reach the top from the other direction!

none of this strategy is hardcoded of course -- the algorithm "discovers" it. the only thing the algorithm is given is a sandbox/simulator pendulum, where it can do arbitrary things to the pendulum and see what happens.
Title: Re: Coding
Post by: vh on October 05, 2017, 11:50:27 PM
(https://imgur.com/DTGAlVyl.png)

no code this time but here's the architecture of the code which runs blacraft. it probably totals to between 500 and 2000 loc.
edit: actually 642 nonblank lines, as computed by this great bash command i just wrote:
Code: [Select]
find -L . | grep py$ | xargs cat | sed '/^\s*$/d' | wc -l
blue boxes are external (such as irc, amazon web services, and blacraft's cloud server)
yellow boxes are pieces of code which sit on my computer

the right side is pretty simple -- we have the irc interface which parses and validates all irc lines and sends commands / forwards messages from the UBV box. the irc interface should also reconnect in case of time out or related issues, but that part of the code is untested. ubv handles the logic of handling irc commands, which right now is pretty simple -- it just passes them on to the coordinator on the top

on the left side, we have the aws interface, which talks to both the server and also aws. it does so through a bunch of different ways -- ssh connections, directly pinging the spigot server, and making requests to AWS to start up and shut down the machine. the aws interface provides all of the primitives such as acquiring a machine, shutting down a machine, or running the spigot jar on the server.

on top of that, we have the server controller, which assembles these primitives into a small number of commands, such as server startup, server shutdown, query population, etc. it has to take care of stuff such as : the ssh server on the blacraft machine doesn't boot up instantly, so even after the machine is up, you need to wait the right about of time. it also has to robustly handle errors and timing issues, so spamming server on and server off won't cause the interface to go haywire (yes the aws interface is rather fragile). huge potential for race conditions in this box that i had to be careful about

then, on top of that, we have the coordinator, which talks to both UBV and the server controller. the coordinator has the job of passing commands from ubv to the server controller, as well as passing messages (such as the success of the startup command), back over to UBV so we on irc will be able to know when the server is up. it uh also doubles as the main object which initializes everything, both the server controller and also ubv, which may or may not be bad design practice.

so yeah there you have it
Title: Re: Coding
Post by: Bla on October 06, 2017, 04:01:41 PM
Impressive
Title: Re: Coding
Post by: vh on October 26, 2017, 10:46:02 PM
figured out how to put text on images today

(https://i.imgur.com/INxuksC.png)
Title: Re: Coding
Post by: vh on October 27, 2017, 10:23:39 PM
second image: a picture of how the chair looks
first image: how the chair looks when melted (an attempted 3d reconstruction of the chair)
third image: how the chair is supposed to look from all those angles

basically i'm computing a 3d model of a chair based off of one picture
using brainz i mean ai i mean neural nitwerks
Title: Re: Coding
Post by: Bla on October 28, 2017, 05:27:32 AM
Note bade
Title: Re: Coding
Post by: Darvince on October 28, 2017, 06:23:05 AM
have you tried increasing the layers of neurons
Title: Re: Coding
Post by: vh on October 28, 2017, 07:57:00 AM
sYnThEsIzEd ChAiR

yeah this needs improving
Title: Re: Coding
Post by: vh on October 28, 2017, 08:14:02 AM
1. input image
2. sYnThEsIzEd ChAiR (yeah it's missing the legs)
Title: Re: Coding
Post by: vh on October 29, 2017, 02:35:31 PM
1. input image
2. generated 3d model
Title: Re: Coding
Post by: vh on November 16, 2017, 07:48:11 PM
i wrote a nifty utility function which basically takes a container object (list, dictionary, or tuple), and strips all the actual content out of it, replacing all the values with None

Code: [Select]
def iscontainer(obj):
    return isinstance(obj, list) or isinstance(obj, dict) or isinstance(obj, tuple)
   
def strip_container(container):
    assert iscontainer(container), 'not a container'
   
    if isinstance(container, list) or isinstance(container, tuple):
        return [(strip_container(obj) if iscontainer(obj) else None)
                for obj in container]

    else:
        return {k: (strip_container(v) if iscontainer(v) else None)
                for (k,v) in container.items()}

so if you have dictionaries and lists and nested dictionaries and lists containing a bunch of big strings and numbers and class instances, this replaces all those bottom level entries with None values, which makes it really easy to read the "outline" of a complicated "data structure"

for example, here's what it looks like when i apply it to some code i'm debugging:
Code: [Select]
{'gt': {'depths': None,
        'masks': None,
        'pose': None,
        'view': None,
        'views': None},
 'pred': {'flow': {'pred_flow': None, 'pred_view': None},
          'par': {'preds': {'depth': None,
                            'dx': None,
                            'dy': None,
                            'mask': None,
                            'view': None},
                  'reproj': {'body': {'depth': None,
                                      'mask': None,
                                      'view': None},
                             'view': {'depth': None,
                                      'mask': None,
                                      'view': None}}}}}

if i hadn't used this function, all of those None values would've printed with huge numpy arrays which would've made it impossible to read
Title: Re: Coding
Post by: vh on January 12, 2018, 10:18:44 PM
a mysterious memory leak -- a very slow one too, about 1gb per hour

vertical: memory used in GB
horizontal: iteration number
Title: Re: Coding
Post by: Bla on January 13, 2018, 05:10:55 AM
Mysterious. Imo it helps to close the window, when it's windy the memory tends to blow out
Title: Re: Coding
Post by: vh on January 15, 2018, 11:06:06 AM
this plot of a stripped down version of the code suggests that maybe the memory leak levels out after a few GB and stops
Title: Re: Coding
Post by: vh on January 15, 2018, 01:30:28 PM
the following images are plots of how many milliseconds are used to process each chunk. in order to run at 20 tps, the server cannot spend more than 50ms on all currently loaded chunks.

the following are maps of 100x100 chunk areas, or 800m by 800m
leftmost: synthetically generated lag map by me. brighter means more ms used to process chunk
rightmost: naive estimates of the chunk lag by simply diving 1000.0 by the tps
middle: my algorithm for estimating the chunk lag

things the algo can deal with
 - the fact that tps is averaged over the last minute, during which you could've moved a lot
 - multiple players simultaneously loading many chunks
 - in the first image, there is a single chunk which takes 100ms to process. in the second image, there are 20 chunks, each which has 40ms of processing time. note that by itself, the server could still operate at 20tps -- so it's only when two of these chunks are loaded that the tps lag happens. yet, my algorithm can still locate which chunks caused the lag

actually the multiple player support is in theory -- haven't implemented it yet. but don't fear. i'm about to implement it.
Title: Re: Coding
Post by: vh on January 15, 2018, 02:02:19 PM
so here's a demonstration of multi-player lag computations

so first look at the right most plot. there are two horizontal lines -- one top on bottom, which shows the paths taken by the two players.

for about 1h of irl time, the top player moves right across the map, while the bottom player stays in the bottom left corner.

then in the next 1h of irl time, the top player moves left across the map, while the bottom player moves right. they do this at the same speed so that they cross in the middle

as shown by the leftmost ground truth lagmap, there is only one laggy chunk, which is in the middle of the top player's path. however, the naive "observation based" strategy would get confused and think that the bottom player is also responsible for the lag, due low tps observed when the bottom player is in the middle.

on the other hand, my algo pretty much pinpoints the lag just in the top player's path. note that there's a lot of vertical spread to the prediction, since both players are moving horizontally, and it's impossible to tell which chunk out of the 21 chunks in the vertical column was the lag causer without some vertical movement.
Title: Re: Coding
Post by: vh on January 19, 2018, 07:51:53 PM
wrote a long rambly thing about my OO approach to DL
Title: Re: Coding
Post by: vh on January 19, 2018, 07:53:44 PM
in each of these images, one row was generated by a neural network and the other one is human generated
Title: Re: Coding
Post by: Jorster on January 21, 2018, 09:47:56 PM
I made a Darvince IRC Markov chain bot
Code: [Select]
import json
import markovify
import socket
import random
import time
       
server = "irc.freenode.net" # Server
channel = "##universesandbox" # Channel
botnick = "BotVince" # Your bots nick
print("Opening Brainfile")
corpus = open("darvincelines.txt").read()
print("Converting Brainfile to json")
text_model = markovify.Text(corpus, state_size=3)
model_json = text_model.to_json()
print("Success")
reconstituted_model = markovify.Text.from_json(model_json)

def ping(): # Respond to server pings
  ircsock.send("PONG :pingis\n")

def joinchan(chan): # Join a channel
  ircsock.send("JOIN "+ chan +"\n")

ircsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ircsock.connect((server, 6667)) # Here we connect to the server using the port 6667
ircsock.send("USER "+ botnick +" "+ botnick +" "+ botnick +" :Jister - A bot made by Jorster on USF\n") # user authentication
ircsock.send("NICK "+ botnick +"\n") # here we actually assign the nick to the bot

joinchan(channel) # Join the channel using the functions we previously defined

while 1: # Be careful with these! it might send you to an infinite loop
ircmsg = ircsock.recv(2048) # receive data from the server
ircmsg = ircmsg.strip('\n\r') # removing any unnecessary linebreaks.
ircmsg = ircmsg.lower() # Converting to lowercase for easier finding of kol
print(ircmsg) # Here we print what's coming from the server
if ircmsg.find("ping :") != -1: # If the server pings us then we've got to respond!
ping()
if ircmsg.find("##universesandbox") != -1: # Make sure we're getting a message from the irc channel
if ircmsg.find("darvince") != -1:
if random.randint(1,10) == 1:
try:
markov = str(reconstituted_model.make_short_sentence(340))
except:
try:
markov = str(reconstituted_model.make_short_sentence(340))
except:
try:
markov = str(reconstituted_model.make_short_sentence(340))
except:
markov = "markov failed yell at jorster"
ircsock.send("PRIVMSG " + channel + " :" + markov + "\n")
if ircmsg.find("!dar") != -1:
print("!dar found")
try:
markov = str(reconstituted_model.make_short_sentence(340))
except:
try:
markov = str(reconstituted_model.make_short_sentence(340))
except:
try:
markov = str(reconstituted_model.make_short_sentence(340))
except:
markov = "markov failed yell at jorster"
print(markov)
ircsock.send("PRIVMSG " + channel + " :" + markov + "\n")
It was a fun experiment in markov chains and irc bots
Title: Re: Coding
Post by: vh on January 22, 2018, 06:19:04 PM
some thoughts on a next gen irc bot

gen 0: old old ubv, using some weird-ass bespoke key word search i made up. could repeat previously said text. actually was quite coherent

gen 1: trigram model (old ubv and current jister). attention span of 2 words max.

gen 2: standard lstm model with single line attention span. would also expect much lower perplexity than trigrams

gen 3: both a line and paragraph lstm model, where the paragraph level lstm model produces some context vector which is fed in to the line lstm. this would allow bot to have a long attention span

gen 4: gen 3 + pointer networks attention mechanism, which would be very useful for irc, due to the limited amount of training data.

gen 5: gen 4 + gan loss, cause why not.

references
thought vectors: https://arxiv.org/abs/1506.06726
pointer networks: https://arxiv.org/abs/1506.03134
seqgan: https://arxiv.org/abs/1609.05473
Title: Re: Coding
Post by: vh on March 04, 2018, 07:04:31 PM
(https://i.imgur.com/SElRhQz.png)

x-axis: log2(hours i think some task will take)
y-axis: log2(hours it actually took)

performed gaussian process regression. inner blue region is 1 std, outer blue region is 2 stds

red points are actual tasks from my collected dataset-- slightly jittered so you can see overlapping points. note that the majority of tasks i predict as taking 0.5, 1, or 2 hours. note the incredible spread of times taken for "1 hour" tasks -- predicting time is hard.

although it's not visible from this plot -- gaussian processes can model heteroskedastic trends -- so if i became really accurate at predicting tasks which took less than 1 hour but really bad at tasks which took more, then the predictive intervals would vary in thickness along the horizontal axis

Title: Re: Coding
Post by: blotz on March 07, 2018, 01:21:20 PM
welp
i might've mostly used someone elses code as a template and this picture may have been really easy and i might've only had 3 letters to pick from and i might've used the simplest machine learning algo in existance but:
Title: Re: Coding
Post by: Darvince on March 07, 2018, 02:09:16 PM
in each of these images, one row was generated by a neural network and the other one is human generated
i wonder how it would look if you asked the human brain to generate the numbers instead of the human hand
Title: Re: Coding
Post by: atomic7732 on March 15, 2018, 12:27:30 AM
(a quick note: paladinofstorms.net/cyclone == tropicalcyclonedata.net, the folder is literally the same)

dae have any idea what's going on

[07:17]   Kalassak   http://paladinofstorms.net/cyclone/adv/view.php
[07:17]   Jister   title: Tropical Cyclone Tracking Data: page 1
[07:17]   Kalassak   http://tropicalcyclonedata.net/adv/view.php
[07:17]   Jister   title: Tropical Cyclone Tracking Data: page 1
[07:20]   Darvince   the second one has no CSS
[07:20]   Darvince   for some reason
[07:20]   Kalassak   yeah
[07:21]   Kalassak   i can't figure that one out
[07:21]   Kalassak   interesting
[07:21]   Kalassak   if i link to http://paladinofstorms.net/cyclone/adv/tables.css
[07:21]   Jister   type: text/css, size: 624 bytes
[07:21]   Kalassak   it works
[07:21]   Kalassak   but
[07:22]   Kalassak   why can't i just link to tables.css
[07:22]   Kalassak   it's in the same
[07:22]   Kalassak   fucking
[07:22]   Kalassak   folder
[07:23]   Kalassak   yeah
[07:23]   Kalassak   the link
[07:23]   Kalassak   <a href="search.php">
[07:23]   Kalassak   takes you to search.php
[07:23]   Kalassak   which is in the same folder
[07:23]   Kalassak   that works
[07:23]   Kalassak   why doesn't <link rel="stylesheet" type="text/css" href="tables.css" />
[07:23]   Kalassak   take you to tables.css
[07:23]   Kalassak   which is in the same folder
[07:24]   Kalassak   https://i.gyazo.com/0dd62a22a8f61600400bc2297ed38aa3.png
[07:24]   Kalassak   wow look at that
[07:24]   Kalassak   they're in the same folder
[07:25]   Kalassak   <link rel="stylesheet" type="text/css" href="http://tropicalcyclonedata.net/adv/tables.css" />
[07:25]   Kalassak   doesn't work
[07:25]   Kalassak   http://tropicalcyclonedata.net/adv/tables.css look what's here
[07:25]   Jister   type: text/css, size: 624 bytes
[07:25]   Kalassak   the fucking file
[07:26]   Kalassak   i guess we'll use the way that works
[07:26]   Kalassak   since it works
[07:26]   Kalassak   by linking to paladinofstorms
[07:26]   Kalassak   which makes no fucking sense
Title: Re: Coding
Post by: vh on March 17, 2018, 11:04:17 AM

this time, with proper h e t e r o s k e d a s t i c i t y
and no, it's not a linear trend, it just looks like it (cause it's pretty close)

(https://i.imgur.com/KVFwiNf.png)
Title: Re: Coding
Post by: vh on March 21, 2018, 11:43:33 AM
it's good to have a simple "dump this object to disk" and "read this file as an object" function in every programming language, so here's mine for java

Code: [Select]
public class Database <T extends Serializable> {
   
    private final String filename;
   
    public Database(String filename) {
        this.filename = filename;
    }
   
    public void save(T obj) {
        try {
            FileOutputStream fos = new FileOutputStream(filename);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
              oos.writeObject(obj);
              oos.close();
              fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   
    public T read() {
        File f = new File(filename);
        if(!f.exists() || f.isDirectory()) {
            return null;
        }
       
        T obj = null;
        try {
            FileInputStream fis = new FileInputStream(filename);
            ObjectInputStream ois = new ObjectInputStream(fis);
           
            @SuppressWarnings("unchecked")
            T tmp = (T) ois.readObject();
            obj = tmp;
           
            ois.close();
            fis.close();
        } catch (IOException e) {
             e.printStackTrace();
        } catch(ClassNotFoundException e) {
             e.printStackTrace();
        }
        return obj;
    }
}

in python pickling is builtin. why can't you be more like python, java
Title: Re: Coding
Post by: vh on March 22, 2018, 08:57:36 AM
here's my famously complex backup script which i run once whenever i remember and upload to dropbox

Code: [Select]
cat /dev/sda3 | gpg --symmetric --output backup.gpg
i should probably back up the entire /dev/sda while i'm at it, since my boot sector is in /dev/sda4. it's not technically important but it would be a pain to have to set that up again

i did consider compression before encryption but note that
1. there are attacks that exploit compressing data before you encrypt it -- so you have to be very careful
2. most of my drive either contains many small files which take up little space and are not worth compressing, and a small number of large files -- usually binary data, images, or videos -- all of which have either already been compressed using image/video compression algs which would do better than any general purpose compression -- or in the case of binary data files, probably cannot be compressed much, if at all. so i suspect compressing wouldn't actually shrink the size of the backup
Title: Re: Coding
Post by: Gurren Lagann TSS on March 22, 2018, 09:31:49 AM
Code: [Select]
public class Database <T extends Serializable> {
   
    private final String filename;
   
    public Database(String filename) {
        this.filename = filename;
    }
   
    public void save(T obj) {
        try {
            FileOutputStream fos = new FileOutputStream(filename);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
              oos.writeObject(obj);
              oos.close();
              fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   
    public T read() {
        File f = new File(filename);
        if(!f.exists() || f.isDirectory()) {
            return null;
        }
       
        T obj = null;
        try {
            FileInputStream fis = new FileInputStream(filename);
            ObjectInputStream ois = new ObjectInputStream(fis);
           
            @SuppressWarnings("unchecked")
            T tmp = (T) ois.readObject();
            obj = tmp;
           
            ois.close();
            fis.close();
        } catch (IOException e) {
             e.printStackTrace();
        } catch(ClassNotFoundException e) {
             e.printStackTrace();
        }
        return obj;
    }
}

Code: [Select]
cat /dev/sda3 | gpg --symmetric --output backup.gpg
wut
Title: Re: Coding
Post by: vh on April 11, 2018, 02:21:18 AM
thinking about how resources should be allocated on a cluster. specifically gpu resources

proposal: users use an artificial currency to buy or sell gpu time on an open market.

1. every user gets a baseline number of gpu-hours (GPUH) per hour/day. the reason we hand out GPUH directly instead of handing out credits is because it avoids the need for the sysadmins to act as a market maker.

2. by default, users have a recurring sell order which sells their GPUH for dirt cheap on an open exchange. users can remove this order and configure their own buy/sell orders at will.

3. obviously you need credits to buy GPUH on the market. the nth user starts off by being given 1/n of the credits on the market, which is collected by the admins using some form of taxation (maybe tax stored credits at 1%/day, or tax transactions with a 1% fee). but the overall monetary supply is constant.

4. whenever the computing resources increase (a new node with gpus added to the cluster), all users get a bonus paycheck to spend

5. in times of little activity, everyone will be selling their GPUH on the market, and the price will drop. before a paper deadline, when everyone wants GPUH, the prices will skyrocket. this is reasonable and efficient behaviour, rewarding users who make the effort to help everyone out by using GPUs when they are least needed.

6. of course, users are not obligated to participate in the market at all, since they may simply use their own GPU hours as they would otherwise.

7. want to do some long term planning? need to run an experiment for 1 week and don't want to be surprised by GPUH price spikes? no problem. introducing the GPUH futures markets, where you can lock in GPUH at a fixed price ahead of time.

The Major Issue

despite the fact that GPUH is an asset which allows gpu access on the cluster, it can't possibly guarantee access on the cluster (consider, for example, the case where all 50 users decide to spend their GPUH at once on a cluster with only 40 gpus).

there seems to be a lot of ad hoc tricks you can do here (perhaps the admins can buy back GPUH at a high price to prevent the server from being oversubscribed), or maybe something like first-come-first-serve could work, but all those seem like sloppy, fragile fixes, stemming from the fact that theses GPUH are not *pinned* to a time slot

----------------

8. Pinned GPU hours (PGPUH)
in this scenario, instead of there just being one asset (GPUH), a new type of asset is created hourly. so if there are 100 users and 10 gpus, then a user will get 0.1 of a march-18th-5-am GPU hour, 0.1 of a march-18th-6-am GPU hour, and so on.

obviously users will want to sell their GPU unless they want to run an experiment, in which case they'd spend enough money to buy one full PGPUH (out of 10 available). because each time slot is a different asset, you don't run into oversubscription problems

9. if you want to run a 48h experiment, it's pretty bad to have to scramble to buy 1 full PGPUH every hour, or risk getting your experiment be terminated. when running an experiment, you'll want to buy a block of GPU allocations. this can be fairly easily automated

10. the GPU hogging problem.
suppose 90% of your users are inactive, but also disabled the autosell order. how do you cope with the fact that 90% of your PGPUH are being distributed to users who aren't participating in the market and no one else can use their PGPUH?

one answer: automatically sell PGPUH after 3 days of inactivity or something
another answer: raise the amount of PGPUH distributed by the server so that GPUs may be oversubscribed in theory, but rarely so in practice

11. the user interface
ok all this market nonsense is pretty complicated to the end user, who usually wants nothing more than the ability to compute things without trouble. so we've got to automate it somehow...

first, let's say that PGPUH are distributed maybe 2 months ahead of time, with the assumption that no one wants to plan their experiments down to the hour more than 2 months ahead of time.

second, to allow for ability of people to plan ahead, an automatic sell order for all PGPUHs is issued by every user. so for example, if PGPUH on april 3 is worth 3 credits historically, a sell order will be automatically issued for that.

third, users can buy blocks of PGPUH ahead of time. so if you plan on running experiments in 3 days, you can run a script which will automatically issue an order for that.

finally, a user who doesn't want to participate in any of this nonsense (mainly point 3), can just run their GPUs at any time, and purchase unused PGPUH at runtime at the current market value. this is basically how the current system works, except instead of being able to do this forever, you have to be able to afford it of course, which is more fair.

12. if everything is taken care of automatically, how will accurate pricing be done? for example, if everyone wants to use GPUs simultaneously, and 80 of 100 users have sold their 0.1 PGPUH for the hour, leaving 2 free GPUs, will the pricing actually go up? what if only 1 out of 100 users want to use a gpu for the hour. will the price of the next PGPUH fall to near 0, as expected of an efficient system? of course this is true in a real market with traders, but we are trying to automate most of it so researchers don't have to waste their time.

answer: each user will have a customizable hard-sell price, where if GPU prices reach a certain level, they are willing to kill their currently running experiments and sell their GPUH to another user. this will make it so that you can almost always get a gpu by paying enough

answer: a reasonable hard-coded auto-sell order based on remaining gpu capacity and historical data will further result in reasonable prices. users can customize this too

answer: as an hour starts, the value of a PGPUH gradually decreases to 0. so the auto-seller takes care of things, by adjusting the auto-sell price to be able to consistently sell of unused PGPUH a good fraction of the time. this should converge to a level where if only one user wants a GPU, all the auto-sellers would be willing to sell for pretty cheap.

a

Title: Re: Coding
Post by: vh on April 11, 2018, 02:46:45 AM
what if 3 users want to share 2 gpus -- a worked example

suppose there are 3 users, A, B, and C, each starts with 10 credits, and owns 0.7, 0.7, and 0.6 of the next PGPUh. and suppose they all want to run a job at 5 pm today. what happens?

well first suppose the historical price is 1 credit per PGPUH, which means there are already 3 autosell orders on the market for 0.7, 0.7, and 0.6 credits. furthermore, suppose A, B, and C have their hard-sell price at 2, 5, and 8 credits resp, so they're willing to sell their PGPUH no matter what for 1.4, 3.5, and 4.8 credits resp.

then, suppose A, B, and C are willing to pay 1, 1.5, and 2 credits to run the job in that one hour block.

so here's the order book, ordered by the issue date

1. A: sell @ 2, all
2. B: sell @ 5, all
3. C: sell @ 8, all
4. A: sell @ 1, amount 0.7
5. B: sell @ 1, amount 0.7
6. C: sell @ 1, amount 0.6
-- (below: didn't happen yet) --
7. A: buy @ 1, amount 0.3
8. B: buy @ 1.5, amount 0.3
9. C: buy @ 2, amount 0.4

when order 7 comes out, that cancels order 4, and suppose A buys from B, so the book looks like this

1. A: sell @ 2, all
2. B: sell @ 5, all
3. C: sell @ 8, all
5. B: sell @ 1, amount 0.4
6. C: sell @ 1, amount 0.6
-- (below: didn't happen yet) --
8. B: buy @ 1.5, amount 0.6
9. C: buy @ 2, amount 0.4

now A has 1 PGPUH in the bank and 9.7 credits, and B has 0.4 PGPUH and 10.3. B adjusts order amount up from 0.3 to 0.6, cause it needs to buy more now.

next B executes. i don't know how exchanges actually do this, but i'll go with the convention that the trade price is determined by the first order, so C sells at 1 instead of 1.5, leaving us with

1. A: sell @ 2, all
2. B: sell @ 5, all
3. C: sell @ 8, all
-- (below: didn't happen yet) --
9. C: buy @ 2, amount 1

B has now 1 PGPUH and 9.4 credits as well, and C has 10.6 credits

note that order 3 and 6 was cancelled, since C can't sell anymore, and C adjusted it's order amount

next, C buys from A, which basically clears the book.

2. B: sell @ 5, all
3. C: sell @ 8, all

Now A has 0 PGPUH and 11.7 credits, B has 1 PGPUH and 10.3 credits, C has 1 PGPUH and 8.6 credits, so GPUs were properly allocated.

but wait, what if C's order went first. let's rewind a bit...

1. A: sell @ 2, all
2. B: sell @ 5, all
3. C: sell @ 8, all
5. B: sell @ 1, amount 0.4
6. C: sell @ 1, amount 0.6
-- (below: didn't happen yet) --
8. C: buy @ 2, amount 0.4
9. B: buy @ 1.5, amount 0.6

C fills B's order

1. A: sell @ 2, all
2. B: sell @ 5, all
3. C: sell @ 8, all
-- (below: didn't happen yet) --
9. B: buy @ 1.5, amount 1

C ends up with 1 PGPUH and spends 0.4, B now has 10.7 credits

Now A has 1 PGPUH and 9.7 credits, B has 0 PGPUH and 10.7 credits, C has 1 PGPUH and 9.6 credits, again we have success

Title: Re: Coding
Post by: vh on April 15, 2018, 10:08:07 AM
huh, organizing classes in OOP is actually pretty similar to solving a k-cut problem, using semantics as a heuristic

https://en.wikipedia.org/wiki/Minimum_k-cut
Title: Re: Coding
Post by: vh on April 23, 2018, 08:41:41 AM
so i had the sin and cosine of an angle, and i wanted to add perturb that angle by some delta value. so i looked up some sin / cos addition identities on wikipedia. here's the code.
Code: [Select]
sin_delta = tf.sin(delta)
cos_delta = tf.cos(delta)
#from wikipedia
#sin(α + β) = sin α cos β + cos α sin β
#cos(α + β) = cos α cos β - sin α sin β.
sin = sin * cos_delta + cos * sin_delta
cos = cos * cos_delta - sin * sin_delta

can you spot the bug?
Title: Re: Coding
Post by: atomic7732 on April 23, 2018, 10:24:05 AM
you are recalculating sine before calculating the cosine

mess
Title: Re: Coding
Post by: vh on April 23, 2018, 10:42:12 AM
gj. i was printing out sin^2 + cos^2 and getting confused about why it wasn't 1
Title: Re: Coding
Post by: vh on April 26, 2018, 03:26:04 PM
decided to test out some numerical integrators here. using a very simple spring motion a(x) = -x

first compare euler to "semi-implicit euler" to leapfrog. euler and semi-implicit euler are first order while leapfrog is second order (supposedly better). semi-implicit and leapfrog are symplectic (good) and euler isn't symplectic.

so first, euler vs si-suler vs leapfrog, time steps of 0.1:
(https://i.imgur.com/I9rTL8Y.png)

so euler goes crazy pretty fast and the other two are so close to each other you almost can't tell the difference and you definitely can't tell which one is better.

so then i unironically named a function "make_god" which basically modifies an integrator into a god integrator which secretly does 100 steps at 1/100th the delta t but only reports the results from the last step. so there's a god euler (really god si euler) and a god leapfrog integrator. i made two gods just incase dividing the time-step by 100 didn't actually make them sufficiently accurate and there would still be errors. i also ramped the time-steps up to 0.5 from 0.1

(https://i.imgur.com/dHE7KV0.png)

so just starting out, both the gods are in such close agreement with each other you can't even see the orange line. it looks like in terms of the amplitude of the oscillations, leapfrog wins over si-euler.

(https://i.imgur.com/ppdyMkB.png)

very interestingly, the error accumulates in the form of precession for both si-euler and leapfrog, and the amount of precession is the same for both. after doing some quick google searches, this is supposed to be the mode of failure for symplectic integrators: they conserve a quantity which is almost energy, so obviously the error comes from elsewhere (aka phase error)

conclusion: hypothesis was confirmed that leapfrog > si euler > euler

note that the popular RK4 integrator is not symplectic and would probably blow up like the euler integrator over sufficiently long time-spans, so i didn't bother trying to implement it, which is a pain anyway

question: wait a second, i just read the wikipedia page and si euler is identical to leapfrog and the only difference is that one of them has the velocity offset by half a time-step. so are they the same integrator?

answer: as far as i can tell, pretty much. the initial starting configuration i used was x = 1, v = 1, so the si euler integrator is actually equivalent to the leapfrog integrator with starting configuration x = 1, v_-1/2dt = 1. notice this has slightly less total energy, since at time 0, velocity would be slightly less than 1, corresponding to the lesser amplitude.

so yeah, if i just initialized the si-euler configuration with slightly more energy it'd be identical to the leapfrog method, which makes me wonder why leapfrog is second order and si euler is first order.

code attached
Title: Re: Coding
Post by: vh on April 26, 2018, 03:53:13 PM
hm, but then i came up with another devious scheme to compare leapfrog and si euler. this time the spring force is nonlinear: a(x) = -sign(x) * x**2 (basically the typical -x but quadratic)

this is apparently a substantially more difficult problem and i had to turn the time steps back down to 0.1 or else even the gods started diverging.

(https://i.imgur.com/ETA3Rjo.png)

ok so clearly si euler is messing up. let's zoom in

(https://i.imgur.com/OgnWLc0.png)

veeery interesting. this definitively shows the superiority of leapfrog over si euler
Title: Re: Coding
Post by: vh on April 26, 2018, 08:38:16 PM
based on playing around with that integrator i found some bugs in my old gravity sim code

so here's it with everything fixed: a one million body gravity simulation, where each point mass is an entire galaxy, played back at 5 quadrillion times real time

https://youtu.be/pUGAGZvvMpk

edit: eww youtube compression artifacts
Title: Re: Coding
Post by: Darvince on April 26, 2018, 11:04:33 PM
when is now?
Title: Re: Coding
Post by: vh on April 27, 2018, 02:03:33 AM
near the end, seeing as the simulation starts near the beginning of the universe and runs for 16 billion years

the area of the simulation is about 6 millionths of the observable universe (assuming it was 2d)
Title: Re: Coding
Post by: Bla on April 27, 2018, 02:17:53 AM
Wow
Title: Re: Coding
Post by: vh on May 07, 2018, 06:19:38 PM
playing around with sounds -- pretty messy code i whipped up in 5 minutes just to try it out. sample attached.
Title: Re: Coding
Post by: atomic7732 on May 07, 2018, 06:23:05 PM
is that a univision entry in the making i hear?
Title: Re: Coding
Post by: vh on May 07, 2018, 06:25:56 PM
lmao maybe. technically if i put enough work into it, i could generate sounds as varied as anything you can get out of professional software. i was thinking of doing some xenakis type stuff
Title: Re: Coding
Post by: Darvince on May 07, 2018, 08:12:58 PM
wow is ponyreiter going to be making new avant garde music
Title: Re: Coding
Post by: Gurren Lagann TSS on May 08, 2018, 02:34:31 PM
NERD
Title: Re: Coding
Post by: vh on May 08, 2018, 02:43:00 PM
i ain't no nerd i'm a MUI nerd
Title: Re: Coding
Post by: Darvince on May 08, 2018, 05:08:43 PM
>calling someone a nerd on an astronomical simulation program forum
Title: Re: Coding
Post by: vh on May 09, 2018, 02:39:17 PM
so for some strange reason, no one has ever produced a robust and performant clustering algorithm for unbalanced clusters on python yet... so i had to implement my own

gt.png: the ground truth clusters. the green cluster contains 99% of all the points

scikit.png: using the standard "k means" algorithm

kc.png: using a k-centers algorithm i made up on the spot

none of scikit-learn's algorithms can really solve this task -- at least not any of the reasonably fast and well known algorithms anyway. my implementation in tensorflow runs about 20x faster than k-means by scikit-learn AND it actually solves the task.

the algorithm is pretty simple: initialize k centers using the well known 2-apx solution. then iteratively optimize the centers a la lloyd's algorithm for k means.
Title: Re: Coding
Post by: vh on July 07, 2018, 10:14:18 AM
i have just written the most useful piece of python code ever

Code: [Select]

def iscollection(obj):
    return isinstance(obj, list) or isinstance(obj, dict) or isinstance(obj, tuple)

def apply_recursively(collection, f):

    def dict_valmap(g, dct):
        return {k:g(v) for (k,v) in dct.items()}

    def f_prime(x):
        if iscollection(x):
            return apply_recursively(x, f)
        else:
            return f(x)
   
    if not iscollection(collection):
        return f(collection)
    else:
        map_fn = dict_valmap if isinstance(collection, dict) else map
        return type(collection)(map_fn(f_prime, collection))


Title: Re: Coding
Post by: vh on August 18, 2018, 05:10:11 PM
i coded a ray tracer. two sample images with glass on metal
Title: Re: Coding
Post by: Bla on August 19, 2018, 06:06:12 AM
Cool
Title: Re: Coding
Post by: FiahOwl on August 19, 2018, 09:49:22 AM
Neat
Title: Re: Coding
Post by: tuto99 on August 19, 2018, 11:38:43 AM
Nice
Title: Re: Coding
Post by: vh on August 19, 2018, 07:30:09 PM
Good
Title: Re: Coding
Post by: atomic7732 on August 20, 2018, 11:16:49 AM
Like
Title: Re: Coding
Post by: Darvince on August 20, 2018, 12:54:12 PM
Thumbsup
Title: Re: Coding
Post by: tuto99 on August 20, 2018, 04:58:14 PM
Subscribed
Title: Re: Coding
Post by: vh on December 07, 2018, 12:39:40 PM
my emails-sent-per-month plot has gotten more advanced

new features include formatted dates on the x axis, which was surprisingly difficult
and also an end-of-month projection for the current month, in red

(http://i.imgur.com/YHkx0L2.png)
Title: Re: Coding
Post by: vh on December 07, 2018, 12:56:14 PM
i can't tell if the colors make this more insightful or just more confusing

green = summer break
turqoise = fall semester
purple = spring semester

(http://i.imgur.com/pCEzHrE.png)
Title: Re: Coding
Post by: vh on December 29, 2018, 10:31:52 AM
a minimal cuda project -- it's always annoying to have to remember how to set these up, which is why i've done so right here.

(https://i.imgur.com/peyaKdY.png)
Title: Re: Coding
Post by: vh on February 02, 2019, 12:29:49 AM
i labeled my axes and have a legend so you should be able to figure out what this plot is of

for konisshi <-> spawntown, which lies at roughly (1000, 100) on this graph, it's close to a tie between overworld elytra, nether elytra, and nether ice roads. however since spawntown nether hub is quite clunky, i think overworld elytra ends up being significantly faster

for konisshi <-> laplaya, which lies at maybe (4000, 1000) on this graph, nether elytra clearly wins.

for konisshi <-> yqtland, which i have no idea how far it is let's say it's at (300, 1000) on this graph, overworld elytra wins

konisshi <-> darvincia happens like 5 times a year, so let's say (3000, 10), so nether elytra and overworld elytra are pretty close

if for some reason i went from world-corner to world-corner twice a day for a year, that would be about (22000, 1000), that would be a legit reason to build a nether ice boat route

and finally to get from one end of my storage to the other end, 40 blocks away, and something i do constantly, beacon sprinting is the fastest, as expected

factors this graph takes into account
1. how long it takes to build the infrastructure for a given mode of transport, which consists of a one-time-cost plus a cost-per-meter
2. how long it takes to use infrastructure, which includes a per-trip-cost (such as the 10 seconds you pay to go through two portals) as well as a per-distance cost
3. the "efficiency" of a method -- ice boat has less than 1 efficiency since it's hard to make turns. elytra in nether also has < 1 efficiency due to the fact that paths aren't perfectly straight.
Title: Re: Coding
Post by: Bla on February 02, 2019, 05:16:13 AM
Interesting, though it's missing all our glorious rail lines
Title: Re: Coding
Post by: vh on February 02, 2019, 08:53:37 AM
they didn't show up because they are strictly worse than elytra. maybe when mojang puts high speed rail back in the game
Title: Re: Coding
Post by: vh on February 26, 2019, 06:53:59 PM
ubv now supports SASL, a method of authentication which allows ubv to be hosted at ip addresses which are othrewise blacklisted by freenode

here's the relevant bits of code, which are definitely not guaranteed to be correct but it works for me

Code: [Select]
    def initialize(self):
       
        self.send("CAP REQ :sasl")       
        self.send('NICK %s' % conf.NICK)
        self.send('USER %s %s %s: Hello World' % (conf.NICK, conf.NICK, conf.NICK))

        while u"ACK :sasl" not in self.receive():
            pass

        self.send("AUTHENTICATE PLAIN")

        while u"AUTHENTICATE +" not in self.receive():
            pass

        key = '%s\0%s\0%s' % (conf.NICK, conf.NICK, conf.SASL_PW)
        auth_msg = bytes('AUTHENTICATE '+base64.b64encode(key.encode('utf8').decode('utf8'))+'\n')
        print 'sending', auth_msg
        self.s.send(auth_msg)

        while u"authentication successful" not in self.receive():
            pass

        self.send("CAP END")
        self.send('JOIN %s' % conf.CHANNEL)

the reason this is important is that i'll be moving around for the next few months and my desktop is unlikely to be reliably on, so ubv is now hosted on another aws instance but wait you say doesn't it kind of defeat the point of having blacraft on a temporarily hosted aws instance if you're putting ubv on a permanently hosted instance? well no, because ubv runs on the lightest instance possible, with 487M of ram and something like 1/10th of a cpu core
Title: Re: Coding
Post by: atomic7732 on March 08, 2019, 01:02:01 AM
coding a sea surface temperature simulator so that i can have some inputs for wrf that make sense on pavala, as sea surface temperatures play a huge part of atmospheric forcing and simulating pavala with pavalan land and earth sea surface temperatures provides a worthless result, basically

it doesn't really simulate radiation or advection very well so it's just a shallow water simulation right now, that means there isn't like a sea surface temperature variable being advected around, hence the uniformly colored light blue background

i'm really amazed that with a simple initialization of a symmetric low height ("pressure", kinda) region about the equator you get slow westward propagation of a rossby wave and fast eastward propagation of a kelvin wave

we've been learning about equatorial waves in my tropical meteorology class so it's really cool to see that with basically 3 equations i can see them in action... and like... i made them!

currently wrapping only works going from the eastern hemisphere to the west (so that the kelvin wave can go around), so when the rossby wave reaches the western boundary toward the end of the run it creates weird artifacts

you also get to see the model break down and do weird stuff and i'm not entirely sure what that's all about, but the main important thing to see is that the kelvin wave makes it around the planet almost 1.5 times in the same time (20 days) the rossby wave only goes about halfway, which is about what you would expect.

https://www.youtube.com/watch?v=h-lv_D14T14

contours are height/layer depth, arrows are flow in the layer
Title: Re: Coding
Post by: vh on March 13, 2019, 06:12:59 PM
seems like this would make for a fun computation/graphics project

https://en.wikipedia.org/wiki/Kuramoto_model#/media/File:Spatial_synchronization_patterns_in_variants_of_the_Kuramoto_Model.png
Title: Re: Coding
Post by: vh on April 08, 2019, 01:14:50 AM
coding challenge: write an algorithm that determines if a sigmar's garden game (from opus magnum) is solvable, and if so, then solve it
Title: Re: Coding
Post by: vh on April 16, 2019, 05:45:13 PM
so i've been doing some lagbusting on blacraft

first i measured tps while loading various sets of chunks in blacraft, making 36 measurements, each covering a different subset of 28 predefined "subregions".

(https://media.discordapp.net/attachments/255420814114029568/567599138015805458/unknown.png)

then the mspt (milliseconds per tick) is described by mspt = Ax + noise, and the cost is |mspt - Ax|
i used l1 norm (laplacian noise model) because the measurement error is probably pretty heavy tailed
A is the matrix of coefficients which contains information on which subregions were loaded for each measurement

there are some more details and details, such as the fact that mspt under 50 is not measurable, mspt is always positive, etc, which i took into account

after optimizing the cost, this is what i get

each row is a separate measurement
column 1: the cost associated with this measurement
column 2: the expected mspt for this measurement
column 3: the actual mspt for this measurement
column 4: the error in mspt
column 5/6: the expected and actual tps

anyway if you compare the predicted and actual results they're actually pretty close -- under 0.5 tps error in almost all cases, which i'm sure is less than my measurement error

Code: [Select]
[[  0.49   50.     50.      0.     20.     20.   ]
 [ 12.603 136.241 125.     11.241   7.34    8.   ]
 [  1.64   58.201  57.143   1.058  17.182  17.5  ]
 [  0.691  62.434  62.5    -0.066  16.017  16.   ]
 [  1.328  70.809  71.429  -0.62   14.123  14.   ]
 [ 10.701  73.366  83.333  -9.967  13.63   12.   ]
 [  1.191  70.947  71.429  -0.481  14.095  14.   ]
 [  0.564  51.333  51.282   0.051  19.481  19.5  ]
 [  0.465  50.     50.      0.     20.     20.   ]
 [  2.578  50.     52.083  -2.083  20.     19.2  ]
 [  2.741  72.054  74.074  -2.02   13.879  13.5  ]
 [  2.867  60.235  62.5    -2.265  16.602  16.   ]
 [  9.116  68.492  76.923  -8.431  14.6    13.   ]
 [  0.804  53.788  54.054  -0.267  18.592  18.5  ]
 [  0.431  50.     50.      0.     20.     20.   ]
 [  1.606  52.89   51.813   1.077  18.907  19.3  ]
 [  1.216  51.935  52.632  -0.696  19.255  19.   ]
 [  7.083  80.354  74.074   6.279  12.445  13.5  ]
 [  0.074  50.     50.      0.     20.     20.   ]
 [  1.606  94.578  95.238  -0.66   10.573  10.5  ]
 [  0.165  50.     50.      0.     20.     20.   ]
 [  0.208  50.     50.      0.     20.     20.   ]
 [  0.543  50.     50.251  -0.251  20.     19.9  ]
 [  2.949  50.     52.632  -2.632  20.     19.   ]
 [  1.575  50.     51.282  -1.282  20.     19.5  ]
 [  0.097  50.     50.      0.     20.     20.   ]
 [  0.049  50.     50.      0.     20.     20.   ]
 [  0.078  50.     50.      0.     20.     20.   ]
 [  1.586  50.     51.282  -1.282  20.     19.5  ]
 [  0.186  50.     50.      0.     20.     20.   ]
 [  0.52   50.     50.251  -0.251  20.     19.9  ]
 [  0.121  50.     50.      0.     20.     20.   ]
 [  0.014  50.     50.      0.     20.     20.   ]
 [  0.112  50.     50.      0.     20.     20.   ]
 [  0.103  50.     50.      0.     20.     20.   ]
 [  0.638  50.     50.251  -0.251  20.     19.9  ]]

this also gives the mspt cost of each subregion -- remember each measurement consists of a set of subregions, so this is a decomposition of where that cost comes from
Code: [Select]
[ 1.193  9.595 33.261  6.168  5.874  5.641  0.187 -0.     0.374  3.268
 13.511  0.61   0.007  0.012  0.634  4.804  4.96   1.652  2.778  0.001
 15.503  3.059  3.746  0.574  0.703  6.552 12.687  6.248]

the first 4 subregions are in order
1. 441 chunks in the end void
2. spawntown spawn chunks
3. 21x21 chunk region in spawntown minus spawn chunks (a donut shape)
4. 500ish chunks of random terrain

and the rest of the subregions are actually a grid pattern over konisshi, which was the main target of this exercise. each of the rest of the subregions are pretty much 5x5 chunks of konisshi.

you can see that all of konisshi adds up to almost 94 mspt, which is pretty hefty. spawntown by comparison is a lightweight 43 mspt (although i'm comparing 540 chunks of konisshi to 289 of spawntown here)

i've attached a plot of these subregions in the correct geographic orientation, and you can see most of the lag is concentrated in a few of these subregions (yellower is laggier)

also attached code, which contains the Greatest List Comphrenension of All Time

Code: [Select]
    measurement_regions = [
        [item for sublist in [subregion_map[x] for x in region] for item in sublist]
        for region in measurement_regions
    ]
Title: Re: Coding
Post by: vh on June 26, 2019, 08:54:47 PM
i am coding optics sim

(https://cdn.discordapp.com/attachments/255420814114029568/593647955081297940/unknown.png)

how does it work? basically it's a limited form of raytracing in 2D, where i use newton raphson to compute the intersection between arbitrary differentiable surfaces (lens surfaces) and rays. i know the ordering of the lens components, so i can just process them sequentially.

here i show light passing through an aspherical lens with a refractive index of 2 (really the "lens" is just composed of two separate surfaces, the first with a refraction *ratio* of 2 and the second 0.5.) and then hitting a plane.



code is complete hacky garbage btw
Title: Re: Coding
Post by: vh on June 28, 2019, 01:00:03 AM
(https://cdn.discordapp.com/attachments/255420814114029568/594073052434792472/unknown.png)

today's OPTIK sim upgrades include

1. refactoring the code completely so it's guud and ez to work with instead of hacky
2. adding in an aperture object which blocks out of bound light rays
3. refining the plotting
Title: Re: Coding
Post by: tuto99 on June 28, 2019, 10:27:28 AM
thats pretty cool
Title: Re: Coding
Post by: Darvince on June 28, 2019, 06:42:55 PM
this is an excellent dialogue between man and nature. thank you for providing this informatical stimulus to us.
Title: Re: Coding
Post by: vh on June 28, 2019, 11:39:31 PM
thats pretty cool

thank

this is an excellent dialogue between man and nature. thank you for providing this informatical stimulus to us.

Oh! Oh! I know why!

(https://cdn.discordapp.com/attachments/255420814114029568/594415459567140866/unknown.png)

(https://cdn.discordapp.com/attachments/255420814114029568/594393342532648979/unknown.png)

3 updates today

1. code for automatically generating light sources which point in the right direction (aka into the lenses) so that it's less painful to set up simulations

2. some trickery with adaptive newton raphson step sizes, so for this simulation with 9 surfaces and roughly 1k rays the time went from 250ms down to 18ms, and with increased precision too

3. most importantly, rays have wavelength, plotting converts wavelength to rgb!!!, AND sellmeier dispersion is implemented, resulting in physically accurate chromatic aberration
Title: Re: Coding
Post by: atomic7732 on June 29, 2019, 01:33:41 AM
simulate light rays reflecting inside a raindrop to create a rainbow
Title: Re: Coding
Post by: vh on June 30, 2019, 10:40:44 PM
(https://cdn.discordapp.com/attachments/255420814114029568/595124394930733067/unknown.png)

TODAY on optik sim we have a few more upgrades

1. native support for geometric planes. previously i'd only implemented a class of spherical surfaces with quadratic and quartic asphericities. this very general class of surfaces includes a simple plane of course, but also is computationally much more expensive.

2. with the help of blazing fast planar geometry from [1], i implemented autofocus -- a search algorithm used to move the camera sensor back and forth to minimize the variance of where rays hit on the sensor. the main importance of this is that i can start designing optical systems without having to painfully manually focus the setup

3. my previous experiments with chromatic aberration used a made up material with ridiculous dispersion parameters, because chromatic aberrations are actually generally quite small and hard to see. but now, i've reverted back to using typical borosilicate glass, and i've upgraded the plotting code to show super zoomed in views of exactly where each light source hits the sensor (so even small aberrations are visible)!
Title: Re: Coding
Post by: vh on July 02, 2019, 12:19:23 AM
(https://cdn.discordapp.com/attachments/255420814114029568/595510473584279611/unknown.png)

TODAY ok optik sim we have a huge image -- seriously, this thing is almost 5k by 5k, and i rendered this at half of full res just to make uploading less painful.

1. i set up a standard set of test cases for testing lenses: there are objects at 3 different distances, and 3 different angles relative to the camera, making for 9 objects. i focus the lens to the same 3 different distances, which gives me 27 triplets of (angle, distance, focus point).

2. i wrote code to plot all of this nonsense. i also added code to plot a coarser version of the light (visible in the big 3 subplots on the left), since i think it's useful to be able to see exactly how the rays travel through the system.

3. i fixed some numerical problems with the ray tracing math

interpreting the plot:
first, mentally break down the plot into 3 chunks on the vertical axis, with each chunk containing a big plot of the entire system and 9 small plots on the right.

the 3 chunks correspond to the 3 focus distances: in the first vertical chunk, the camera is focused to the closest object (0.5 m), in the second vertical chunk, 5m, and the third, 100m.

for each focus distance, i simulate how light from all 9 objects travel through the lens. however, in order to keep the figure readable, in the left subplots, i visualize only the 3 lights which are located at the same distance which the lens is focused on.

ON the right 9 subplots, i do visualize how all 9 objects look like as they hit the sensor. each COLUMN of the 9 subplots corresponds to a different distance: the 3 objects at 0.5m, the 3 at 5m, the 3 at 100m. each ROW of the 9 subplots corresponds to a different angle.

so to make this clear: in the first chunk, i would expect the middle row of the first col to be the sharpest, because that's what i'm focusing on. i would still hope that the other rows of the first col are pretty sharp. finally, i don't expect the second and third cols (objects at 5 and 100m away) to be sharp. likewise, in the second chunk, i would expect the middle row of the Second col to be sharp, etc.

each of the 9 small subplots covers an area of 1mm x 1mm. on a typical camera, there are probably somewhere in the ballpark of 50 pixels / mm. so you can see this made up lens is pretty shit because even the best focused points of light (i call them objects but they're really point light sources), are spread out over like 10px

anyway i feel like almost all of the setup is now complete and i can start designing lenses soon

-----

ALSO if you're wondering why the right plots have color but the left rays are white, it's because on the left, you're zoomed out enough that the R, G, and B rays blend together into white!, however if you zoom in enough, even on the left you can see slight chromatic aberrations leading to colors
Title: Re: Coding
Post by: vh on July 04, 2019, 01:14:52 AM
today we have some Real World Optics.

(https://cdn.discordapp.com/attachments/255420814114029568/596251774730502155/unknown.png)

(https://cdn.discordapp.com/attachments/255420814114029568/596251868481716236/unknown.png)

i generated a picture of a checkerboard, took a bunch of pictures with my phone. then i used it to jointly optimize homographies and distortion parameters of my phone's camera lens

(https://cdn.discordapp.com/attachments/255420814114029568/596251859782729740/unknown.png)

this is a picture of some perfectly horizontal stripes i found on google images
left: a photo i took of my monitor of those stripes
right: same photo, but corrected for lens distortion
Title: Re: Coding
Post by: atomic7732 on July 04, 2019, 01:31:09 AM
can we get a subtraction (or other diff) between the two pics
Title: Re: Coding
Post by: FiahOwl on July 04, 2019, 11:02:23 AM
here you go
Title: Re: Coding
Post by: Darvince on July 04, 2019, 08:38:05 PM
This is, to give a dog and in recompense desire my dog again.