Cliquez ici pour le problème http://nabetani.sakura.ne.jp/hena/ord17foldcut/
Cliquez ici pour d'autres exemples de réponses http://qiita.com/Nabetani/items/ebd9d7deb30c57447806
Dans la première méthode décrite plus tard, la quantité de données de tableau augmente à mesure que le nombre de plis augmente, j'ai donc toujours essayé de traiter avec un tableau 3x3. On a l'impression de plier et de réduire les données du tableau, d'étirer les données c au centre et de les pousser à la fin comme un gâteau de riz pour les ramener à 3x3.
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)
Commentaire:
def solve(data): #Exemple de données d'entrée:'LRTB-br'
fold, (cut_y, cut_x) = data.split('-')
#Données d'entrée fractionnées.'-'Le côté gauche divisé par est l'instruction de pliage, et le côté droit est les positions verticale et horizontale du coin de coupe
paper = reduce(lambda p,f: eval(f+'(p)'), fold, [[0,0,0],[0,1,0],[0,0,0]])
#Disposition initiale p correspondant au pliage du papier:Même si vous coupez la circonférence, il n'y a pas de trou, donc 0, le nombre de plis de papier au centre est de 1
# [ [ 0, 0, 0 ],Rangée supérieure: [en haut à gauche,Nakagami,En haut à droite]
# [ 0, 1, 0 ],Rangée du milieu: [Milieu gauche,Milieu moyen,Milieu droit]
# [ 0, 0, 0 ] ]Rangée inférieure: [En bas à gauche,Nakashita,En bas à droite]
#Fonction de pliage L pour chaque caractère d'instruction de pliage avec réduction(p)Ou R(p)Ou T(p)Ou B(p)Faire un papier
return str(paper[{'t':0,'b':-1}[cut_y]][{'l':0,'r':-1}[cut_x]]/4)
# paper[{'t':0,'b':-1}{cut_y]]Sur le dessus du papier(0 est le premier élément)Ou rangée inférieure(-1 est le dernier élément)choisir
# {'l':0,'r':-1}{cut_y]À gauche(0 est le premier élément)Ou à droite(-1 est le dernier élément)choisir
#Le nombre de trous, str, correspond au nombre de plis aux coins spécifiés du papier plié divisé par 4.()Stringifié avec
L = lambda p: [[c+c, c+c, l+r] for l,c,r in p] #Pliez le côté gauche vers la droite
#Exemple:État initial La gauche est ajoutée à la droite, le milieu est doublé, la gauche est identique au milieu
# p l, c, r c+c,c+c,l+r
# [[0, 0, 0] [[0, 0, 0]
# [0, 1, 0] -> [2, 2, 0]Aucun trou ne sera ouvert, peu importe où vous coupez le carré
# [0, 0, 0]] [0, 0, 0]]
R = lambda p: [[l+r, c+c, c+c] for l,c,r in p] #Pliez le côté droit vers la gauche
#Exemple:Dans l'état ci-dessus, la droite est ajoutée à la gauche, le milieu est doublé, la droite est identique au milieu
# p l, c, r l+r,c+c,c+c
# [[0, 0, 0] [[0, 0, 0]
# [2, 2, 0] -> [2, 4, 4]Aucun trou ne sera ouvert, peu importe où vous coupez le carré
# [0, 0, 0]] [0, 0, 0]]
T = lambda p: zip(*[[c+c, c+c, t+b] for t,c,b in zip(*p)]) #Pliez le haut vers le bas
#Exemple:Échange vertical et horizontal avec le zip d'état ci-dessus, à gauche(Vers le haut)Droite(en dessous de)Ajouter à, doubler au milieu, comme au milieu à gauche, revenir avec zip
# p zip(*p) t, c, b c+c,c+c,t+b zip(*[...])Zip *: français*Prend le contenu du tableau comme argument
# t [[0, 0, 0] [[0, 2, 0] [[4, 4, 0] [[4, 8, 8]Si vous coupez le coin supérieur gauche, le trou est 1
# c [2, 4, 4] -> [0, 4, 0] -> [8, 8, 0] -> [4, 8, 8]Si vous coupez le coin supérieur droit, le trou est 2
# b [0, 0, 0]] [0, 4, 0]] [8, 8, 0]] [0, 0, 0]]Si vous coupez le fond, le trou est 0
B = lambda p: zip(*[[t+b, c+c, c+c] for t,c,b in zip(*p)]) #Pliez le bas vers le haut
#Exemple:Échange vertical et horizontal avec le zip d'état ci-dessus, à droite(en dessous de)La gauche(Vers le haut)に加算、中2倍、en dessous deは中と同じ、zipで戻す
# p zip(*p) t, c, b t+b,c+c,c+c zip(*[...])Zip *: français*Prend le contenu du tableau comme argument
# t [[4, 8, 8] [[4, 4, 0] [[4, 8, 8] [[4, 8, 8]Si vous coupez le coin supérieur gauche, le trou est 1
# c [4, 8, 8] -> [8, 8, 0] -> [8,16,16] -> [8,16,16]Si vous coupez le coin supérieur droit, le trou est 2
# b [0, 0, 0]] [8, 8, 0]] [8,16,16]] [8,16,16]]En bas à gauche est 2, en bas à droite est 4
La première méthode à laquelle j'ai pensé était de préparer des données de tableau de taille suffisante pour ressembler à du papier, de les plier et de compter le nombre de plis. Instruction de pliage Préparez un papier quadrillé avec une taille de côté en fonction de la longueur du pli (nombre de plis) et initialisez la valeur initiale avec le nombre de plis de 1. Cependant, la valeur initiale (nombre de plis) est 0 car aucun trou ne peut être réalisé même si la circonférence extérieure est coupée. Chaque fois qu'il est plié, les valeurs des positions de chevauchement sont ajoutées pour diviser par deux la taille du papier matriciel. Le nombre de trous est le nombre de trous découpés en divisant le nombre de plis du coin coupé coupé par 4, car les trous sont réalisés en coupant les coins.
#!/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