17e comment résoudre les problèmes d'écriture en temps réel hors ligne avec Python

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

17e comment résoudre les problèmes d'écriture en temps réel hors ligne avec Python
13th Offline en temps réel Comment résoudre les problèmes d'écriture avec Python
Le 18ème problème d'écriture en temps réel hors ligne en Python
Le 19ème problème d'écriture en temps réel hors ligne en Python
Le 14ème problème de référence d'écriture en temps réel hors ligne en python
Le 18ème comment écrire un problème de référence en temps réel hors ligne en Python
17ème problème de référence d'écriture en temps réel hors ligne implémenté en Python
Le 16ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
Le 19ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
Le 15e temps réel hors ligne, j'ai essayé de résoudre le problème de l'écriture avec python
Comment écrire en temps réel hors ligne Résolution des problèmes E04 avec Python
Le 16ème problème d'écriture en temps réel hors ligne a été résolu avec Python
Le 15e problème d'écriture en temps réel hors ligne a été résolu avec python
Le 14ème problème de référence d'écriture en temps réel hors ligne avec Python
Comment écrire hors ligne en temps réel Résolution des problèmes E05 avec Python
Le 10ème problème de référence d'écriture en temps réel hors ligne. Exemple d'implémentation par Python.
Le 11ème problème de référence d'écriture en temps réel hors ligne. Exemple d'implémentation par python.
Comment écrire hors ligne en temps réel Résolution des problèmes F01 avec Python
Comment utiliser la bibliothèque C en Python
Comment obtenir les fichiers dans le dossier [Python]
Comment récupérer la nième plus grande valeur en Python
Comment obtenir le nom de la variable lui-même en python
Comment obtenir le nombre de chiffres en Python
Comment connaître le répertoire actuel en Python dans Blender
Comment utiliser le modèle appris dans Lobe en Python
Résoudre un coup (retour en arrière sans récursivité en Python)
Résoudre les problèmes d'optimisation avec Python
Comment développer en Python
[Python] Comment afficher les valeurs de liste dans l'ordre
[python] Comment vérifier si la clé existe dans le dictionnaire
Comment écrire un exemple d'implémentation E14 Python en temps réel hors ligne
Comment déboguer une bibliothèque Python standard dans Visual Studio
Comment utiliser la méthode __call__ dans la classe Python
Comment obtenir la dernière (dernière) valeur d'une liste en Python
Le douzième problème de référence d'écriture en temps réel hors ligne. Implémenté par python
[Python] Comment faire PCA avec Python
Comment collecter des images en Python
Dans la commande python, python pointe vers python3.8
Comment obtenir la version Python
Comment utiliser Mysql avec python
Comment envelopper C en Python
Comment utiliser ChemSpider en Python
Comment utiliser PubChem avec Python
Comment gérer le japonais avec Python
J'ai essayé de résoudre le problème de F02 comment écrire en temps réel hors ligne avec Python
Comment déterminer l'existence d'un élément sélénium en Python
Comment écrire un exemple d'implémentation E11 Ruby et Python en temps réel hors ligne
Comment connaître la structure interne d'un objet en Python
Comment vérifier la taille de la mémoire d'une variable en Python
Comment déterminer qu'une clé croisée a été entrée dans Python3
Comment écrire un exemple d'implémentation Python du problème E15 en temps réel hors ligne
Comment utiliser l'astérisque (*) en Python. C'est peut-être tout? ..
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
Résolvez la plus petite valeur en Python (équivalent au rang D de paiza)
[Note du débutant] Comment spécifier le chemin de lecture de la bibliothèque en Python
Comment afficher les octets de la même manière en Java et Python
[Introduction à Python] Comment utiliser la classe en Python?
Réponse à "Comment écrire le problème F04 en temps réel hors ligne"