17. Offline-Echtzeit So lösen Sie Schreibprobleme mit Python

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

17. Offline-Echtzeit So lösen Sie Schreibprobleme mit Python
13. Offline-Echtzeit So lösen Sie Schreibprobleme mit Python
Das 18. Offline-Echtzeit-Schreibproblem in Python
Das 19. Offline-Echtzeit-Schreibproblem in Python
Das 14. Referenzproblem beim Schreiben in Echtzeit in Python
Das 18. Offline-Echtzeit-Schreiben eines Referenzproblems in Python
17. In Python implementiertes Referenzproblem für das Offline-Schreiben in Echtzeit
Das 16. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
Das 19. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
Beim 15. Offline-Echtzeitversuch habe ich versucht, das Problem des Schreibens mit Python zu lösen
So schreiben Sie offline in Echtzeit Lösen von E04-Problemen mit Python
Das 16. Offline-Echtzeit-Schreibproblem wurde mit Python gelöst
Das 15. Offline-Problem beim Schreiben in Echtzeit wurde mit Python gelöst
Das 14. Referenzproblem beim Offline-Schreiben in Echtzeit mit Python
So schreiben Sie offline in Echtzeit Lösen von E05-Problemen mit Python
Das 10. Referenzproblem beim Schreiben in Echtzeit. Implementierungsbeispiel von Python.
Das 11. Referenzproblem beim Schreiben in Echtzeit. Implementierungsbeispiel von Python.
So schreiben Sie offline in Echtzeit Lösen von F01-Problemen mit Python
Verwendung der C-Bibliothek in Python
So erhalten Sie die Dateien im Ordner [Python]
So rufen Sie den n-ten größten Wert in Python ab
So erhalten Sie den Variablennamen selbst in Python
So ermitteln Sie die Anzahl der Stellen in Python
Wie Sie das aktuelle Verzeichnis in Python in Blender kennen
Verwendung des in Lobe in Python erlernten Modells
Lösen Sie einen Strich (Backtrack ohne Rekursion in Python)
Lösen Sie Optimierungsprobleme mit Python
Wie man in Python entwickelt
[Python] So geben Sie Listenwerte der Reihe nach aus
[Python] So überprüfen Sie, ob der Schlüssel im Wörterbuch vorhanden ist
Offline-Echtzeit zum Schreiben eines E14 Python-Implementierungsbeispiels
So debuggen Sie eine Standard-Python-Bibliothek in Visual Studio
Verwendung der Methode __call__ in der Python-Klasse
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
Das zwölfte Offline-Echtzeit-Schreibreferenzproblem. Implementiert von Python
[Python] Wie man PCA mit Python macht
So sammeln Sie Bilder in Python
Im Python-Befehl zeigt Python auf Python3.8
So erhalten Sie die Python-Version
Wie man MySQL mit Python benutzt
So verpacken Sie C in Python
Verwendung von ChemSpider in Python
Verwendung von PubChem mit Python
Umgang mit Japanisch mit Python
Ich habe versucht, das Problem von F02 zu lösen, wie man mit Python offline in Echtzeit schreibt
So bestimmen Sie die Existenz eines Selenelements in Python
Offline in Echtzeit, wie man ein Implementierungsbeispiel für E11 Ruby und Python schreibt
Wie Sie die interne Struktur eines Objekts in Python kennen
So überprüfen Sie die Speichergröße einer Variablen in Python
So stellen Sie fest, dass in Python3 ein Kreuzschlüssel eingegeben wurde
Offline-Echtzeit zum Schreiben eines Python-Implementierungsbeispiels für das E15-Problem
Verwendung von Sternchen (*) in Python. Vielleicht ist das alles? ..
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
Löse den kleinsten Wert in Python (entspricht Paiza Rang D)
[Anfängernotiz] So legen Sie den Lesepfad der Bibliothek in Python fest
So zeigen Sie Bytes in Java und Python auf die gleiche Weise an
[Einführung in Python] Wie verwende ich eine Klasse in Python?
Antwort auf "Offline in Echtzeit, wie man ein F04-Problem schreibt"