20. Offline-Echtzeit So schreiben Sie Probleme in Python

Problem

http://nabetani.sakura.ne.jp/hena/ord20meetime/

Antwort einer anderen Person

http://qiita.com/Nabetani/items/5791f8ae1bb5d069a49b

Erstellungszeitpunkt

Ich glaube, es hat ungefähr anderthalb Stunden gedauert, einschließlich der Korrekturzeit, weil ich süchtig danach war, das Problem falsch zu verstehen (Misshandlung von Herrn I und Herrn J). Obwohl ich mich nicht darauf konzentrieren konnte, es zu schaffen, während ich mit dem Zug unterwegs war, glaube ich, dass ich es nicht rechtzeitig schaffen konnte, selbst wenn ich es vor Ort gemacht hätte.

Lösung Python-Skript

time2min = lambda t: int(t)/100*60 + int(t)%100
reserve = lambda r: bin(1<<24*60 | r)[3+10*60:3+18*60].find("1"*60) + 10*60

def solve(data):
    A = B = I = J = Z = R = (1<<24*60)-1
    for d in data.split(","):
        start, end = map(time2min, d[1:].split("-"))
        exec(d[0]+" &= "+str(~R>>start | R>>end))
    r = min([r for r in map(reserve, (A&B&I&~Z, A&B&J&~Z)) if r >= 10*60] or [-1])
    return "-" if r < 0 else "%d%02d-%d%02d"%(r/60, r%60, r/60+1, r%60)

def test(data, correct):
    answer = solve(data)
    print "xo"[answer == correct], data, correct, answer

0, test( "A1050-1130,B1400-1415,I1000-1400,I1600-1800,J1100-1745,Z1400-1421,Z1425-1800", "1425-1525" );
1, test( "A1000-1200,B1300-1800,Z1000-1215,Z1230-1800", "-" );
2, test( "Z0800-2200", "1000-1100" );
3, test( "A1000-1700,Z0800-2200", "1700-1800" );
4, test( "A1000-1701,Z0800-2200", "-" );
5, test( "A1000-1130,B1230-1800,Z0800-2200", "1130-1230" );
6, test( "A1000-1129,B1230-1800,Z0800-2200", "1129-1229" );
7, test( "A1000-1131,B1230-1800,Z0800-2200", "-" );    
8, test( "A1000-1130,B1229-1800,Z0800-2200", "-" );    
9, test( "A1000-1130,B1231-1800,Z0800-2200", "1130-1230" );    
10, test( "A1000-1130,B1230-1800,Z0800-1130,Z1131-2200", "-" );    
11, test( "A1000-1130,B1231-1800,Z0800-1130,Z1131-2200", "1131-1231" );    
12, test( "Z0800-0801", "-" );    
13, test( "Z0800-1031,Z1129-1220,Z1315-1400,Z1459-1600", "1459-1559" );    
14, test( "Z0800-2200,I1000-1600,J1030-1730", "1600-1700" );    
15, test( "Z0800-2200,I1000-1600,J1130-1730", "1000-1100" );    
16, test( "Z0800-2200,I1000-1600,J1130-1730,A0800-1025", "1025-1125" );    
17, test( "Z0800-2200,I1000-1600,J1130-1730,A0800-1645", "1645-1745" );    
18, test( "Z0800-2200,I1000-1600,J1130-1730,A0800-1645,I1735-2200", "-" );    
19, test( "Z0800-2200,I1000-1600,J1130-1730,A0800-1645,J1735-2200", "1645-1745" );    
20, test( "Z1030-2200,I1000-1600,J1130-1730", "1030-1130" );    
21, test( "Z1035-1500,I1000-1600,J1130-1730,Z1644-2200", "1644-1744" );    
22, test( "I2344-2350,A2016-2253,Z1246-1952", "1246-1346" );    
23, test( "Z2155-2157,B1822-2032,Z1404-2000,Z2042-2147,Z2149-2154", "1404-1504" );    
24, test( "Z2231-2250,Z2128-2219,B2219-2227,B2229-2230,Z0713-2121,A0825-1035,B1834-2001", "1035-1135" );    
25, test( "J0807-1247,I0911-1414,B1004-1553,Z0626-1732,Z1830-1905,A1946-1954,A0623-1921", "-" );    
26, test( "J1539-1733,J0633-1514,Z1831-1939,J1956-1959,I0817-1007,I1052-1524,Z1235-1756,Z0656-1144", "1524-1624" );    
27, test( "Z2319-2350,B0833-2028,I2044-2222,A1410-2201,Z2044-2228,Z0830-2023,Z2242-2306,I2355-2359", "-" );    
28, test( "B2001-2118,Z0712-1634,I1941-2102,B1436-1917", "1000-1100" );    
29, test( "A0755-1417,B2303-2335,Z0854-2150,Z2348-2356,Z2156-2340,I1024-1307,Z2357-2359", "1417-1517" );    
30, test( "A1958-1959,B0822-1155,I1518-1622,Z1406-1947,A1800-1822,A0904-1422,J1730-1924,Z1954-1958,A1946-1956", "1422-1522" );    
31, test( "B1610-1910,I2121-2139,A0619-1412,I2147-2153,Z0602-2111,I0841-2031,A1657-1905,A1956-2047,J0959-1032,Z2131-2147", "1412-1512" );    
32, test( "Z0623-1900,A0703-1129,I1815-1910,J1956-1957,I0844-1518,Z1902-1935,B1312-1342,J1817-1955", "1129-1229" );    
33, test( "J1246-1328,B1323-1449,I1039-1746,Z1218-2111", "1449-1549" );    
34, test( "A1958-1959,I1943-1944,I0731-1722,Z0845-1846,J1044-1513,Z1910-1923,B1216-1249", "1513-1613" );    
35, test( "A1855-2047,Z0946-1849,Z2056-2059,I1855-1910,B1946-2058,I1956-2025,Z1905-2054,J0644-1800,I0720-1618", "1618-1718" );    
36, test( "J1525-1950,Z0905-1933,A1648-1716,I2051-2054,I2015-2044,I0804-1958,B0934-1100,Z1953-2037", "1100-1200" );    
37, test( "Z1914-1956,J0823-1610,Z0641-1841,J1800-1835,A0831-1346,I1926-1941,I1030-1558,I1738-1803", "1558-1658" );    
38, test( "Z0625-1758,J1033-1351,B1816-2236,I0838-1615,J2247-2255", "1351-1451" );    
39, test( "J0603-1233,A1059-1213,I1326-2103,Z0710-1459", "1213-1313" );    
40, test( "B1302-1351,J1410-2038,A0755-1342,J0637-0658,Z2148-2159,Z1050-2131,A1543-1844,I1615-1810", "1351-1451" );    
41, test( "Z0746-2100,A2122-2156,I1022-1144,J0947-1441,A1333-1949", "1144-1244" );    
42, test( "J0718-1243,Z1443-1818,B2055-2057,A0714-1238,Z1045-1344,A1643-1717,B1832-2039,J1623-1931", "1238-1338" );    
43, test( "Z1921-1933,A1208-1418,I0827-1940,Z0757-1917,J0653-1554,B1859-1909", "1554-1654" );

Kommentar

reserve = lambda r: bin(1<<24*60 | r)[3+10*60:3+18*60].find("1"*60) + 10*60

Es handelt sich um eine Reservefunktionsdefinition, die von 10:00 bis 18:00 Uhr nach 60 Minuten ununterbrochener Freizeit aus dem Zeitplan sucht und die Startzeit zurückgibt. Der Zeitplan jeder Person besteht aus 1-Minuten-Bitmap-Daten, und die Bitmap-Daten r, die den Zeitplan jeder Person logisch erstellen, werden übergeben. Verwenden Sie die Funktion bin, um die Zeitplan-Bitmap-Daten in eine Binärzeichenfolge zu konvertieren, und konvertieren Sie sie in eine 1-Minuten-Zeichenfolge von "1", wenn der Zeitplan frei ist, und "0", wenn der Zeitplan geplant ist. Der Grund, warum 1 << 24 * 60 logisch summiert wird, ist, dass, wenn der Zeitplan ab 0 Uhr geplant ist, die führende 0 von der Bin-Funktion gelöscht wird und 24 Stunden lang keine 24 * 60 Zeichen sind, also definitiv 24 * Um 60 Zeichen zu erhalten, wird 1 << 24 * 60 logisch summiert und in eine Binärzeichenfolge von 24 * 60 + 1 Zeichen konvertiert. Da es sich bei der binären Zeichenfolge um Bitmap-Daten von 0:00 bis 23:59 handelt, wird der Teil von 10:00 bis 18:00 Uhr der Besprechungszeit mit [3 + 10 * 60: 3 + 18 * 60] ausgeschnitten. Was 3+ ist, ist das Lesen von insgesamt 3 Zeichen, einschließlich "0b" zu Beginn des Konvertierungsergebnisses durch die Bin-Funktion und "1", die mit 1 << 24 * 60 addiert wird. Verwenden Sie find ("1" * 60), um das Teil mit einem freien Zeitplan für 60 Minuten hintereinander zu finden. Wenn nicht gefunden, ist es -1. Da es aus der nach 10:00 ausgeschnittenen binären Zeichenfolge gefunden wird, wird 0 zurückgegeben, wenn es 60 Minuten ab 10:00 gefunden wird, und + 10 * 60 wird zurückgegeben, um die Zeitdaten um 10:00 zurückzugeben. .. Wenn keine freie Zeit gefunden wird, gibt -1 + 10 * 60 9:59 zurück.

    A = B = I = J = Z = R = (1<<24*60)-1

(1 << 24 * 60) -1 erstellt Bitmap-Daten, in denen 24 * 60 1 Bits angeordnet sind. Ein Bit entspricht einem einminütigen Termin. Die Zeitpläne von Herrn A, Herrn B, Herrn I, Herrn J und Herrn Z werden mit Bitmap-Daten initialisiert, in denen 24 * 60 1s angegeben sind, dass sie 24 Stunden lang frei sind. R wird in der Berechnung verwendet, um die geplante Zeit jeder Person auf 0 zu setzen.

        exec(d[0]+" &= "+str(~R>>start | R>>end))

Wenn die Eingabedaten "A1050-1130" sind, berechnen Sie A & = (~ R >> (10 * 60 + 50) | R >> (11 * 60 + 30)). Jedes Bit im Bereich von 10:50 bis 11:30 der Zeitplan-Bitmap-Daten von Herrn A ist 0, was geplant darstellt.

    r = min([r for r in map(reserve, (A&B&I&~Z, A&B&J&~Z)) if r >= 10*60] or [-1])

In A & B & I & ~ Z werden die Freizeit von Herrn A, Herrn B und Herrn I und die geplante Zeit (Bitinversion) von Herrn Z logisch multipliziert. Auf diese Weise erhalten Sie bequeme Zeitplan-Bitmap-Daten für 4 Personen. Da entweder Herr I oder Herr J von Anfang bis Ende anwesend sein sollten, fragen wir auch nach den Zeitplan-Bitmap-Daten von A & B & J & ~ Z. Finden Sie die mit der frühesten Startzeit mit min (Karte (Reserve, (A & B & I & ~ Z, A & B & J & ~ Z))) äquivalent zu min ([Reserve (A & B & I & ~ Z), Reserve (A & B & J & ~ Z)]). Wenn jedoch keine freie Zeit gefunden wird, gibt die Reservefunktion die Daten um 9:59 zurück und 9:59 wird ausgewählt. Wenn also r> = 10 * 60 um 10 Uhr ist, wird die Einschlussnotation verwendet. Es werden nur die nachfolgenden Daten extrahiert. Wenn in beiden Fällen keine freie Zeit vorhanden ist, handelt es sich um eine leere Liste [], und min ([]) führt zu einem Fehler. Wenn es sich also um eine leere Liste handelt, wird min ([-1]) berechnet oder [-1]. Ich werde.

Recommended Posts

20. Offline-Echtzeit So schreiben Sie Probleme in Python
13. Offline-Echtzeit So lösen Sie Schreibprobleme mit Python
Das 15. Offline-Echtzeit-Schreiben eines Referenzproblems in Python
17. Offline-Echtzeit So lösen Sie Schreibprobleme mit 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
So schreiben Sie offline in Echtzeit Lösen von E05-Problemen mit Python
So schreiben Sie offline in Echtzeit Lösen von E04-Problemen mit Python
Das 16. Offline-Echtzeit-Schreibproblem wurde mit Python gelöst
Das 16. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
Das 19. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
Das 15. Offline-Problem beim Schreiben in Echtzeit wurde mit Python gelöst
Offline-Echtzeit zum Schreiben eines E14 Python-Implementierungsbeispiels
Wie schreibe ich Ruby to_s in Python
Beim 15. Offline-Echtzeitversuch habe ich versucht, das Problem des Schreibens mit Python zu lösen
Offline in Echtzeit, wie man ein Implementierungsbeispiel für E11 Ruby und Python schreibt
Offline-Echtzeit zum Schreiben eines Python-Implementierungsbeispiels für das E15-Problem
So schreiben Sie offline in Echtzeit Lösen von F01-Problemen mit Python
Antwort auf "Offline in Echtzeit, wie man ein F02-Problem schreibt"
Das 18. Offline-Echtzeit-Schreibproblem in Python
Antwort auf "Offline-Echtzeit, wie man ein F01-Problem schreibt"
Antwort auf "Offline-Echtzeit, wie man ein E13-Problem schreibt"
Das 19. Offline-Echtzeit-Schreibproblem in Python
Wie man in Python entwickelt
So schreiben Sie in Python die Verkettung von Zeichenfolgen in mehrere Zeilen
[Python] Wie man PCA mit Python macht
Wie man nüchtern mit Pandas schreibt
So sammeln Sie Bilder in Python
Verwendung von SQLite in Python
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
[Python] Wie schreibe ich eine if-Anweisung in einen Satz?
[Einführung in Python] Wie verwende ich eine Klasse in Python?
Dynamisches Definieren von Variablen in Python
So machen Sie R chartr () in Python
So schreiben Sie Python-Dokumentkommentare (Docstrings)
[Itertools.permutations] So löschen Sie eine Sequenz in Python
So arbeiten Sie mit BigQuery in Python
Wie bekomme ich Stacktrace in Python?
So zeigen Sie die neunundneunzig Tabelle in Python an
So extrahieren Sie einen Polygonbereich in Python
So überprüfen Sie die Version von opencv mit Python
So wechseln Sie die Python-Version in Cloud9
So passen Sie den Bildkontrast in Python an
Verwendung von __slots__ in der Python-Klasse
So füllen Sie mit Python dynamisch Nullen aus
Verwendung regulärer Ausdrücke in Python
So zeigen Sie Hello World in Python an
Wie schreibe ich diesen Prozess in Perl?
Verwendung ist und == in Python
Teil 1 Ich habe die Antwort auf das Referenzproblem geschrieben, wie man in Python in Echtzeit offline schreibt
So schreiben Sie den richtigen Shebang in Perl-, Python- und Ruby-Skripten
Wie man offline in Echtzeit schreibt Ich habe versucht, E11 mit Python zu lösen
So schreiben Sie eine Zeichenfolge, wenn Python mehrere Zeilen enthält