Example #1
0
def solve(car_string):
    assert car_string.strip() != "0"

    car = Car.from_stream(car_string.strip())
    if VERBOSE:
        print car

    suffix = find_fuel_stream(car)

    if suffix is None:
        print "fail"
        return

    if len(suffix) > 2000:
        print "too long"
        return

    print len(suffix), suffix

    suffix = map(int, suffix)
    if len(suffix) < max_suffix:
        scheme = generate_scheme_for_fuel(suffix)
    else:
        scheme = fast_generate_scheme_for_fuel(suffix)

    if scheme is None:
        return None
    s = str(scheme)

    print len(s.split("\n")) - 2, "gates"
    return s
def generate_car():
    n = 6
    fuel_scale = 1000
    pipe_scale = 40
    offset = 4 #pipe_scale//2
    num_chambers = 60
    
    car = Car(n)
    
    
    fuel = [randrange(1,fuel_scale) for i in range(n)]
    
    print 'fuel', fuel
    
    #d = [random()-0.5 for i in range(n)]
    
    for chamber_no in range(num_chambers):
        vec = [random()-0.5 for i in range(n)]
        
        ave = 1.0*sum(vec)/n
        for i in range(n):
            vec[i] -= ave
            
        vec_len = sqrt(sum(x*x for x in vec))
        assert vec_len > 1e-6
    
        for i in range(n):
            vec[i] /= vec_len
            
        #print vec
        
        def coeffs(alpha):
            return [int(floor(pipe_scale*(alpha+vec[i]))) for i in range(n)]
        
        def f(alpha):
            result = sum(c*log(x) for c,x in zip(coeffs(alpha), fuel))
            return result
            
        alpha = bin_search(-1e6,1e6, f)
        
        #print f(alpha)
    
        coeffs = coeffs(alpha)
        
        #print coeffs
        
        upper = []
        lower = []
        
        for i in range(n):
            up = lo = randrange(offset+1)
            if coeffs[i] > 0:
                up += coeffs[i]
            else:
                lo += -coeffs[i]
            upper += up*[i]
            lower += lo*[i]
            
            #shuffle(upper)
            #shuffle(lower)
            
        car.main_chambers.append(Chamber(upper, lower))
        
    #print car
    
    fuel = numpy_fuel(fuel)
    assert car.test_on_fuel(fuel)
    
    #print 'ok'
    #print len(car.to_stream())
    
    
   
    car_stream, perm = car.to_stream()
    
    print 'car of length', len(car_stream)
    if len(car_stream) > 22889:
        assert False, 'too long'
        
    new_fuel = [None]*n
    for i,p in enumerate(perm):
        new_fuel[p] = fuel[i]
    fuel = new_fuel
        
    
    fuel_stream = fuel_to_stream(fuel)
    print 'fuel size', len(fuel_stream)

    scheme = fast_generate_scheme_for_fuel(map(int,fuel_stream))
    
    return (car_stream, str(scheme))