http://nabetani.sakura.ne.jp/hena/ord20meetime/
http://qiita.com/Nabetani/items/5791f8ae1bb5d069a49b
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.
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" );
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