Skip to content

Instantly share code, notes, and snippets.

@jordi-petit
Last active November 23, 2017 11:53
Show Gist options
  • Save jordi-petit/7f2dfd72d76be6fdc5c3a9b20c3b21c8 to your computer and use it in GitHub Desktop.
Save jordi-petit/7f2dfd72d76be6fdc5c3a9b20c3b21c8 to your computer and use it in GitHub Desktop.
AP1 2017-11-24 Parcial

Solució possible

from jutge import read

def zeros_o_uns(n):
    z = 0 # nombre de zeros
    u = 0 # nombre de uns
    while n != 0:
        if n % 2 == 1:
            u += 1
        else:
            z += 1
        n = n // 2
    if z > u:
        return 0
    elif z < u:
        return 1
    else:
        return 2

Solució alternativa

Enlloc de comptar el nombre uns i de zeros, comptar la seva diferència, amb una sola variable.

Errors freqüents

Conceptuals

  • No adonar-se que cal fer una funció que rep un valor i en retorna un altre:

    Fer un read(n) al començar fa que es perdi el valor sobre el qual cal aplicar la funció. Fer un print(0 o 1 o 2) al final provoca dos errors:

    • en primer lloc, s'ecriu un valor espuri a la sortida.
    • en segon lloc, es fa que la funció no retorni res (de fet, retorna None).
  • Construir un nou nombre b que representa n en binari quan es llegeix en decimal!

    Sempre és mala idea:

    • Al cap i a la fi, els nombres es representen ja en binari.
    • Es perd el temps fent la conversió: és un pas intermig inútil.
    • Els nombres en binari escrits en decimal solen ser molt llargs, poden haver-hi sobreeixements (per sort, en Python no, però en C++ sí).
    • No funciona per a bases més grans que 10.

Tècnics

  • Afegir condicions inútils.

  • Tractar casos "especials" que no ho són. Per exemple, iterar mentre n > 1 i tractar els casos n==0 o n==1 a fora del bucle, quan a dins hagués fet el mateix. Un altre exemple: Tractar el cas `n==0

  • Oblidar-se que la divisió enter en Python3 és // i no /. Al posar /, comencen a aparèixer nombres reals i el bucle no acaba mai.

  • Posar parèntesis al voltant de les condicions.

  • No utilitzar elif.

  • Documentació que fa una paràfrasi del codi (per exemple, z = z + 1 # incrementa la z).

  • Usar variables auxiliars que contenen una expressió molt senzilla que no s'utilitza mai més. Per exemple:

    r = x % 2
    if r == 1: ... else ...
  • Enviar-ho al Jutge com a programa en C++ enlloc de Python3.

  • Enviar al Jutge el notebook de Jupyter.

Solució possible

#include <iostream>
using namespace std;


bool eval() {
    char c;
    cin >> c;
    if (c == '(') {
        bool b1 = eval();
        char op;
        cin >> op;
        bool b2 = eval();
        cin >> c;       /* c == ')' */
        if (op == '*') {
            return b1 and b2;
        } else /* op == '+' */  {
            return b1 or b2;
        }
    } else if (c == '0') {
        return false;
    } else if (c == '1') {
        return true;
    } else /* c == '!' */ {
        return not eval();
    }
}


int main () {
    cout << eval() << endl;
}

Errors freqüents

Conceptuals

  • No haver-se preparat aquests tipus de problemes de recursivitat (n'hi havia tres a les llsites d'exercicis).

  • No utilitzar booleans sinó enters. Es pot fer, però demostra que no s'ha entès el concepte de booleà. En particular, si no es calculen bé les operacions (per exemple per a la or de (1+1)).

  • No fer-ho recursivament. Aquest problema sense memòria extra només es pot resoldre amb recursivitat.

  • No seguir la gramàtica que donava l'enunciat com a pista.

Tècnics

  • Crear operacions ja existents pels booleans, com ara

    bool nega(bool b) {
      if (b) return false;
      else return true;
    }

 ```

enlloc de not b.

  • Fer-se un embolic convertint caràcters a enters o a booleans.

  • Enviar-ho al Jutge com a programa en Python enlloc de C++.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment