dAnjou schrieb:
WUIII, das so ganz ohne Erklärung hier abzuladen, ist ziemlich gemein 😈
Hm, so schwer finde ich den Code gar nicht - die Grundidee ist, in Zeilen statt in Spalten zu denken, dann ist der Rest eigentlich recht naheliegend. Ein bisschen was zum Nachdenken wollte ich dem Fragesteller aber natürlich lassen. ☺
Wirklich gemein wäre sowas wie
print '\n'.join(map(lambda i: ' '.join(('0','X')[int(c)&i==i] for c in t if '0' <= c <='9'), (2**i for i in range(4)[::-1])))
gewesen. Wobei sich auch das sicher noch "optimieren" lässt 😉
EDIT: OK, ich versuch's mal, obwohl meinem Hirn dieser, ich kann es nicht anders sagen, geile Scheiß niemals entsprungen wäre.
Zeile 2 ist noch relativ einfach: Alles, was in t eine Zahl zwischen 0 und 9 ist, wird als integer-Wert in das Array ziffern gepackt. (Ergebnis kannst du ja mit einem print nachsehen.)
Das Folgende ist ziemlich harter Tobak (zumindest für mich). Zudem kann man es unkommentiert auf die Schnelle kaum nachvollziehen.
Du hast das doch sehr gut hinbekommen ☺
Die Schleifen dienen dazu, jede einzelne Zahl in ziffern mit jeder Zahl aus der Menge (8,4,2,1) zu vergleichen. 8, 4, 2 und 1 stellen dabei offensichtlich die Zeilen deiner Binär-Uhr dar. In z & i == i wird z mit i binär ver"und"et und anschließend mit i verglichen. Vereinfacht gesagt, wird hier geprüft, ob z binär gesehen in i enthalten ist.
Da i immer eine Zweierpotenz > 0 ist, ist in i immer genau ein Bit gesetzt, und z & i == i prüft, ob dieses Bit auch in z gesetzt ist.
Wenn ja, kommt bei dem Vergleich eine 1 heraus und ein "X" wird ausgegeben.
Eigentlich kommt bei dem Vergleich dann True heraus, aber als Index auf das Tupel kommt das auf das Gleiche raus.
print ('0', 'X')[z & i == i],
ist also einfach eine kürzere Schreibweise für
if z & i == i:
print 'X',
else:
print '0',
Die Ver"und"ung geschieht dabei so:
|8 4 2 1
-+-------
3|0 0 1 1
-+-------
2|0 0 1 0 -> 0 & 0 = 0, 0 & 0 = 0, 1 & 1 = 1, 1 & 0 = 0
0 0 1 0 -> die 1 sagt, dass die 2 in der 3 enthalten ist
1|0 0 0 1 -> 0 & 0 = 0, 0 & 0 = 0, 0 & 1 = 0, 1 & 1 = 1
0 0 0 1 -> die 1 sagt, dass die 1 in der 3 enthalten ist
Man kann sich das als eine Art Bit-Filter vorstellen: a & b lässt nur die Bits aus a durch, die in b gesetzt sind, und setzt den Rest auf 0.