0817 upside down cake problem

ph
Admin (토론 | 기여)님의 2017년 8월 17일 (목) 18:44 판 (새 문서: <source lang=python> def cakeflip(x): # invert and reverse x = np.array(x) if x[0]+x[1] != 1: # [1,0], [0,1] are isomorphic tmp = (x[1]+1)%2 x[1] = (x[0]+...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)
이동: 둘러보기, 검색
def cakeflip(x):
    # invert and reverse 
    x = np.array(x)
    if x[0]+x[1] != 1: # [1,0], [0,1] are isomorphic
        tmp = (x[1]+1)%2
        x[1] = (x[0]+1)%2
        x[0] = tmp
    return np.append(x[2:],x[0:2])

import numpy as np
for a in range(2,4):
    print '-'*40
    arr = np.zeros(a+a-1, dtype=np.uint8)
    #first filp
    arr[-2:] = 1
    cnt=1
    while np.any(arr):
        print cnt, "\t", arr
        arr = cakeflip(arr)
        cnt += 1
    print cnt, "\t", arr
    assert ((a*2-1)**2 - 1 )/2 == cnt
    # cnt = 2*n*(n-1) = (len(arr)^2 - 1) / 2
    # https://oeis.org/A046092
    # why? can you prove?
    
def simple_cakeflip(arr):
    return (len(arr)**2 - 1 )/2

def cakeflip2(x, idx=0):
    lx = len(x)
    assert lx>1
    idx0 = idx % lx
    idx1 = (idx+1) % lx
    if x[idx0] + x[idx1] == 1: #[0,1] or [1,0] are stable.
        return x 
    x0 = (x[idx1]+1)%2
    x[idx1] = (x[idx0]+1)%2
    x[idx0] = x0
    return x

for a in range(2,4):
    print '-'*40
    arr = np.zeros(a+a-1, dtype=np.uint8)
    idx = 0
    cnt = 0
    while cnt < 1 or np.any(arr):
        print cnt,"\t",arr
        arr = cakeflip2(arr, idx)
        idx += 2
        cnt += 1
    print cnt,"\t",arr
    assert cnt == simple_cakeflip(arr)