Uganka: Prevedene funkcije

(The English translation is at the bottom of the page.)

(Pri teh nalogah ne uporabljajte različnih decompilerjev, ker ... ni fora. To zna vsak.)

  1. FRI ima, kot gotovo veste, pogodbe z različnimi uglednimi tujimi organizacijami (NSA, MI5, Mossad - you name it) za izvajanje občasnih del. Nekoč je ena od njih prestregla tole funkcijo v Pythonu. No, pravzaprav ne funkcije, temveč že prevedeno kodo te funkcije. Zanimalo jih je, kaj počne, kaj računa, kaj izpiše, kaj vrne (če kaj). Torej?

    Eni pravijo, naj bi bil n menda argument funkcije. Pa še tega ne smemo pozabiti, da funkcija print vrne rezultat (objekt None).

  2           0 LOAD_CONST               1 (1)
              2 DUP_TOP
              4 STORE_FAST               1 (a)
              6 STORE_FAST               2 (b)

  3     >>    8 LOAD_FAST                0 (n)
             10 LOAD_CONST               2 (0)
             12 COMPARE_OP               4 (>)
             14 POP_JUMP_IF_FALSE       48

  4          16 LOAD_GLOBAL              0 (print)
             18 LOAD_FAST                1 (a)
             20 CALL_FUNCTION            1
             22 POP_TOP

  5          24 LOAD_FAST                2 (b)
             26 LOAD_FAST                1 (a)
             28 LOAD_FAST                2 (b)
             30 BINARY_ADD
             32 ROT_TWO
             34 STORE_FAST               1 (a)
             36 STORE_FAST               2 (b)

  6          38 LOAD_FAST                0 (n)
             40 LOAD_CONST               1 (1)
             42 INPLACE_SUBTRACT
             44 STORE_FAST               0 (n)
             46 JUMP_ABSOLUTE            8
        >>   48 LOAD_CONST               0 (None)
             50 RETURN_VALUE
  1. Če ste, draga študentka ali študent, potencialni kandidat za občasna pogodbena dela na FRI, se boste morali izkazati še z nekoliko težjo funkcijo. Kaj izračuna in vrne tale?

    Videti je, da naj bi bila n in x argumenta funkcije, saj jima nihče ne prireja vrednosti. r pa je, bi rekel, neka spremenljivka znotraj funkcije. Vsaj meni tako izgleda.

  2           0 LOAD_CONST               1 (1)
              2 STORE_FAST               2 (r)

  3     >>    4 LOAD_FAST                1 (n)
              6 LOAD_CONST               2 (0)
              8 COMPARE_OP               4 (>)
             10 POP_JUMP_IF_FALSE       50

  4          12 LOAD_FAST                1 (n)
             14 LOAD_CONST               3 (2)
             16 BINARY_MODULO
             18 LOAD_CONST               1 (1)
             20 COMPARE_OP               2 (==)
             22 POP_JUMP_IF_FALSE       32

  5          24 LOAD_FAST                2 (r)
             26 LOAD_FAST                0 (x)
             28 BINARY_MULTIPLY
             30 STORE_FAST               2 (r)

  6     >>   32 LOAD_FAST                0 (x)
             34 LOAD_FAST                0 (x)
             36 BINARY_MULTIPLY
             38 STORE_FAST               0 (x)

  7          40 LOAD_FAST                1 (n)
             42 LOAD_CONST               3 (2)
             44 BINARY_FLOOR_DIVIDE
             46 STORE_FAST               1 (n)
             48 JUMP_ABSOLUTE            4

  8     >>   50 LOAD_FAST                2 (r)
             52 RETURN_VALUE

(For these puzzles, do not use any decompilers. That's cheating. Anybody can do that.)

  1. As you may be aware, our faculty is a subcontractor for various respectable foreign organisations (NSA, MI5, Mossad - you name it). One of them (I'm not allowed to disclose which) once intercepted the following Python function. The function is already translated. The task is to find what it does, computes, prints, returns ...

    Some say that n is probably an argument of the function. Also don't forget that function print returns a result (an object None). The function probably discards it.

  2. If you, dear student, are a potential candidate for this job, you should prove yourself some more. What does the second function compute?

    It seems that n and x are arguments because they are not assigned a value before they're used. r is, I'd say, a local variable.