Klicken Sie hier für das Problem http://nabetani.sakura.ne.jp/hena/ord17foldcut/
Klicken Sie hier für weitere Beispielantworten http://qiita.com/Nabetani/items/ebd9d7deb30c57447806
Bei der später beschriebenen ersten Methode nimmt die Menge der Array-Daten mit zunehmender Anzahl der Falten zu, daher habe ich immer versucht, mit einem 3x3-Array zu verarbeiten. Es fühlt sich an, als würde man die Array-Daten falten und reduzieren, die Daten c in der Mitte dehnen und wie einen Reiskuchen bis zum Ende schieben, um sie auf 3x3 zurückzusetzen.
L = lambda p: [[c+c, c+c, l+r] for l,c,r in p]
R = lambda p: [[l+r, c+c, c+c] for l,c,r in p]
T = lambda p: zip(*[[c+c, c+c, t+b] for t,c,b in zip(*p)])
B = lambda p: zip(*[[t+b, c+c, c+c] for t,c,b in zip(*p)])
def solve(data):
fold, (cut_y, cut_x) = data.split('-')
paper = reduce(lambda p,f: eval(f+'(p)'), fold, [[0,0,0],[0,1,0],[0,0,0]])
return str(paper[{'t':0,'b':-1}[cut_y]][{'l':0,'r':-1}[cut_x]]/4)
Kommentar:
def solve(data): #Beispiel für Eingabedaten:'LRTB-br'
fold, (cut_y, cut_x) = data.split('-')
#Eingabedaten teilen.'-'Die durch geteilte linke Seite ist die Faltanweisung, und die rechte Seite ist die vertikale und horizontale Position der Schneidecke
paper = reduce(lambda p,f: eval(f+'(p)'), fold, [[0,0,0],[0,1,0],[0,0,0]])
#Anfangsanordnung p entsprechend Faltpapier:Selbst wenn Sie den Umfang abschneiden, gibt es kein Loch, also 0, die Anzahl der Papierfalten in der Mitte ist 1
# [ [ 0, 0, 0 ],Obere Reihe: [Oben links,Nakagami,Oben rechts]
# [ 0, 1, 0 ],Mittlere Reihe: [Mitte links,Mitte Mitte,Mitte rechts]
# [ 0, 0, 0 ] ]Untere Reihe: [Unten links,Nakashita,Rechts unten]
#Faltfunktion L für jedes Faltanweisungszeichen mit Reduzieren(p)Oder R.(p)Oder T.(p)Oder B.(p)Ein Papier machen
return str(paper[{'t':0,'b':-1}[cut_y]][{'l':0,'r':-1}[cut_x]]/4)
# paper[{'t':0,'b':-1}{cut_y]]Oben auf dem Papier(0 ist das erste Element)Oder untere Reihe(-1 ist das letzte Element)wählen
# {'l':0,'r':-1}{cut_y]Auf der Linken(0 ist das erste Element)Oder richtig(-1 ist das letzte Element)wählen
#Die Anzahl der Löcher, str, ist die Anzahl der Falten an den angegebenen Ecken des gefalteten Papiers geteilt durch 4.()Stringifiziert mit
L = lambda p: [[c+c, c+c, l+r] for l,c,r in p] #Falten Sie die linke Seite nach rechts
#Beispiel:Ausgangszustand Links wird rechts hinzugefügt, Mitte wird verdoppelt, links ist das gleiche wie Mitte
# p l, c, r c+c,c+c,l+r
# [[0, 0, 0] [[0, 0, 0]
# [0, 1, 0] -> [2, 2, 0]Es wird kein Loch geöffnet, egal wo Sie das Quadrat schneiden
# [0, 0, 0]] [0, 0, 0]]
R = lambda p: [[l+r, c+c, c+c] for l,c,r in p] #Falten Sie die rechte Seite nach links
#Beispiel:Im obigen Zustand wird rechts nach links addiert, die Mitte wird verdoppelt, rechts entspricht der Mitte
# p l, c, r l+r,c+c,c+c
# [[0, 0, 0] [[0, 0, 0]
# [2, 2, 0] -> [2, 4, 4]Es wird kein Loch geöffnet, egal wo Sie das Quadrat schneiden
# [0, 0, 0]] [0, 0, 0]]
T = lambda p: zip(*[[c+c, c+c, t+b] for t,c,b in zip(*p)]) #Falten Sie das Oberteil nach unten
#Beispiel:Vertikaler und horizontaler Tausch mit dem obigen Statusreißverschluss links(Oben)Richtig(unter)Hinzufügen, doppelt in der Mitte, wie in der Mitte links, mit Reißverschluss zurückkehren
# p zip(*p) t, c, b c+c,c+c,t+b zip(*[...])Postleitzahl*Nimmt den Array-Inhalt als Argument
# t [[0, 0, 0] [[0, 2, 0] [[4, 4, 0] [[4, 8, 8]Wenn Sie oben links schneiden, ist das Loch 1
# c [2, 4, 4] -> [0, 4, 0] -> [8, 8, 0] -> [4, 8, 8]Wenn Sie oben rechts schneiden, ist das Loch 2
# b [0, 0, 0]] [0, 4, 0]] [8, 8, 0]] [0, 0, 0]]Wenn Sie den Boden schneiden, ist das Loch 0
B = lambda p: zip(*[[t+b, c+c, c+c] for t,c,b in zip(*p)]) #Falten Sie den Boden nach oben
#Beispiel:Vertikaler und horizontaler Wechsel mit dem oben genannten Reißverschluss rechts(unter)Links(Oben)に加算、中2倍、unterは中と同じ、zipで戻す
# p zip(*p) t, c, b t+b,c+c,c+c zip(*[...])Postleitzahl*Nimmt den Array-Inhalt als Argument
# t [[4, 8, 8] [[4, 4, 0] [[4, 8, 8] [[4, 8, 8]Wenn Sie oben links schneiden, ist das Loch 1
# c [4, 8, 8] -> [8, 8, 0] -> [8,16,16] -> [8,16,16]Wenn Sie oben rechts schneiden, ist das Loch 2
# b [0, 0, 0]] [8, 8, 0]] [8,16,16]] [8,16,16]]Unten links ist 2, unten rechts ist 4
Die erste Methode, an die ich dachte, bestand darin, Array-Daten von ausreichender Größe vorzubereiten, um wie Papier auszusehen, es zu falten und die Anzahl der Falten zu zählen. Faltanweisung Bereiten Sie ein quadratisches Array-Papier mit einer Seitenlänge entsprechend der Länge der Falte (Anzahl der Faltungen) vor und initialisieren Sie den Anfangswert mit der Anzahl der Falten von 1. Der Anfangswert (Anzahl der Falten) ist jedoch 0, da keine Löcher gemacht werden können, selbst wenn der Außenumfang geschnitten wird. Jedes Mal, wenn es gefaltet wird, werden die Werte der überlappenden Positionen hinzugefügt, um die Größe des Array-Papiers zu halbieren. Die Anzahl der Löcher ist die Anzahl der Löcher, die durch Teilen der Anzahl der Falten der geschnittenen Ecke durch 4 geschnitten werden, da die Löcher durch Schneiden der Ecken hergestellt werden.
#!/usr/bin/env python
#-*- coding:utf8 -*-
L = lambda p: [[l+r for l,r in zip(y[:len(y)/2][::-1], y[len(y)/2:])] for y in p]
R = lambda p: [[l+r for l,r in zip(y[:len(y)/2], y[len(y)/2:][::-1])] for y in p]
T = lambda p: [[t+b for t,b in zip(*y)] for y in zip(p[:len(p)/2][::-1], p[len(p)/2:])]
B = lambda p: [[t+b for t,b in zip(*y)] for y in zip(p[:len(p)/2], p[len(p)/2:][::-1])]
def solve(data):
fold, (cut_y, cut_x) = data.split('-')
size = 2<<len(fold)
paper = [[0]*size] + [[0]+[1]*(size-2)+[0] for y in xrange(size-2)] + [[0]*size]
paper = reduce(lambda p,f: eval(f+'(p)'), fold, paper)
return str(paper[{'t':0,'b':-1}[cut_y]][{'l':0,'r':-1}[cut_x]]/4)
def test(data, correct):
answer = solve(data)
print 'xo'[answer==correct], data, correct, answer
0, test( "RRTRB-bl", "6" );
1, test( "R-tr", "0" );
2, test( "L-br", "0" );
3, test( "T-tl", "0" );
4, test( "B-tl", "0" );
5, test( "BL-br", "0" );
6, test( "LB-tl", "0" );
7, test( "RL-tl", "0" );
8, test( "BL-tl", "0" );
9, test( "TL-bl", "0" );
10, test( "RT-tr", "1" );
11, test( "TRB-tl", "0" );
12, test( "TRL-bl", "0" );
13, test( "TRB-br", "2" );
14, test( "LLB-bl", "2" );
15, test( "RTL-tr", "1" );
16, test( "LBB-tr", "0" );
17, test( "TLL-tl", "2" );
18, test( "RLRR-tr", "0" );
19, test( "BBTL-tl", "4" );
20, test( "TBBT-tr", "0" );
21, test( "LLBR-tl", "0" );
22, test( "LBRT-tl", "2" );
23, test( "RLBL-bl", "4" );
24, test( "BRRL-br", "3" );
25, test( "TBBTL-tl", "8" );
26, test( "TLBBT-br", "0" );
27, test( "LRBLL-br", "7" );
28, test( "TRRTT-br", "6" );
29, test( "BBBLB-br", "0" );
30, test( "RTTTR-tl", "4" );
31, test( "BBLLL-br", "6" );
32, test( "RRLLTR-tr", "16" );
33, test( "TTRBLB-br", "8" );
34, test( "LRBRBR-bl", "14" );
35, test( "RBBLRL-tl", "8" );
36, test( "RTRLTB-tl", "12" );
37, test( "LBLRTR-tl", "14" );
38, test( "RRLTRL-tl", "16" );
39, test( "TBLTRR-br", "12" );
40, test( "TTTRLTT-bl", "30" );
41, test( "TBBRTBL-tr", "15" );
42, test( "TRTRTLL-tr", "28" );
43, test( "TLLRTRB-tr", "24" );
44, test( "RLLBRLB-tr", "15" );
45, test( "LTLRRBT-tr", "32" );
46, test( "RBBRBLT-br", "21" );
47, test( "LLRLRLR-tr", "0" );
Recommended Posts