Elementos de Programação - LMAC, MEBiom 2019/20

Ficha 1 - Enunciado A (1 valor, 15 minutos)

Número:

Nome:

Neste exercício não pode usar definições por compreensão nem métodos. As únicas construções sobre listas permitidas são: lista vazia ([]), acesso aos elementos da lista por posição (lista[posição]), seccionamento da lista (lista[posição:posição]), comparação com a lista vazia (==[]) ou comprimento da lista (len(lista)), e concatenação (+).

Dado um número natural n, usamos ddif(n) para denotar a diferença entre o maior e o menor dígito que ocorrem na representação decimal de n. Por exemplo, ddif(1353) é 4=5-1, enquanto ddif(90) é 9=9-0. Obviamente, ddif(n) é 0 precisamente quando todos os dígitos de n são iguais.

Defina recursivamente em Python a função ddif, bem como uma outra função ddifbig que dada uma lista w de números naturais e um valor k devolve a sublista contendo apenas os valores em w cuja diferença entre o maior e o menor dígito seja maior do que k. Por exemplo, ddifbig([1353,244,90,558],3) deverá ser [1353,90] pois ddif(244) é apenas 2, e ddif(558) é apenas 3.

In [36]:
def update(extr,n):
    if n<extr[0]:
        return [n,extr[1]]
    elif n>extr[1]:
        return [extr[0],n]
    else:
        return extr
    
def extremos(n):
    if n<10:
        return [n,n]
    else:
        return update(extremos(n//10),n%10)
    
def dif(p):
    return p[1]-p[0]
    
def ddif(n):
    return dif(extremos(n))

### ou em alternativa (mais simples, mas menos eficiente)

def dmax(n):
    if n<10:
        return n
    else: 
        return max(n%10,dmax(n//10))
    
def dmin(n):
    if n<10:
        return n
    else:
        return min(n%10,dmax(n//10))

def ddif(n):
    return dmax(n)-dmin(n)

### e finalmente

def ddifbig(w,k):
    if w==[]:
        return []
    elif ddif(w[0])>k:
        return [w[0]]+ddifbig(w[1:],k)
    else:
        return ddifbig(w[1:],k)

Elementos de Programação - LMAC, MEBiom 2019/20

Ficha 1 - Enunciado B (1 valor, 15 minutos)

Número:

Nome:

Neste exercício não pode usar definições por compreensão nem métodos. As únicas construções sobre listas permitidas são: lista vazia ([]), acesso aos elementos da lista por posição (lista[posição]), seccionamento da lista (lista[posição:posição]), comparação com a lista vazia (==[]) ou comprimento da lista (len(lista)), e concatenação (+).

Dado um número natural n, usamos ddif(n) para denotar a diferença entre o maior e o menor dígito que ocorrem na representação decimal de n. Por exemplo, ddif(1335) é 4=5-1, enquanto ddif(80) é 8=8-0. Obviamente, ddif(n) é 0 precisamente quando todos os dígitos de n são iguais.

Defina recursivamente em Python a função ddif, bem como uma outra função maiorddif que dada uma lista não-vazia w de números naturais devolva o valor (ou um dos valores) em w com maior diferença entre o maior e o menor dígito. Por exemplo, maiorddif([1335,919,80,312]) deverá devolver 919 ou 80 (pois ddif(919) também é 8), já que ddif(1335) é apenas 4, e ddif(312) é apenas 2.

In [14]:
### como acima, e também

def maiorddif(w):
    assert w!=[]
    if len(w)==1:
        return w[0]
    elif ddif(w[0])<ddif(w[1]):
        return maiorddif(w[1:])
    else:
        return maiorddif([w[0]]+w[2:])

Elementos de Programação - LMAC, MEBiom 2019/20

Ficha 1 - Enunciado C (1 valor, 15 minutos)

Número:

Nome:

Neste exercício não pode usar definições por compreensão nem métodos. As únicas construções sobre listas permitidas são: lista vazia ([]), acesso aos elementos da lista por posição (lista[posição]), seccionamento da lista (lista[posição:posição]), comparação com a lista vazia (==[]) ou comprimento da lista (len(lista)), e concatenação (+).

Dado um número natural n, usamos ddif(n) para denotar a diferença entre o maior e o menor dígito que ocorrem na representação decimal de n. Por exemplo, ddif(1353) é 4=5-1, enquanto ddif(90) é 9=9-0. Obviamente, ddif(n) é 0 precisamente quando todos os dígitos de n são iguais.

Defina recursivamente em Python a função ddif, bem como uma outra função ddifsmall que dada uma lista w de números naturais e um valor k devolve a sublista contendo apenas os valores em w cuja diferença entre o maior e o menor dígito seja menor do que k. Por exemplo, ddifsmall([1353,254,90,575],4) deverá ser [254,575] pois ddif(254) é apenas 3, e ddif(575) é apenas 2.

In [5]:
### como acima, e também

def ddifsmall(w,k):
    if w==[]:
        return []
    elif ddif(w[0])<k:
        return [w[0]]+ddifsmall(w[1:],k)
    else:
        return ddifsmall(w[1:],k)

Elementos de Programação - LMAC, MEBiom 2019/20

Ficha 1 - Enunciado D (1 valor, 15 minutos)

Número:

Nome:

Neste exercício não pode usar definições por compreensão nem métodos. As únicas construções sobre listas permitidas são: lista vazia ([]), acesso aos elementos da lista por posição (lista[posição]), seccionamento da lista (lista[posição:posição]), comparação com a lista vazia (==[]) ou comprimento da lista (len(lista)), e concatenação (+).

Dado um número natural n, usamos ddif(n) para denotar a diferença entre o maior e o menor dígito que ocorrem na representação decimal de n. Por exemplo, ddif(1323) é 2=3-1, enquanto ddif(80) é 8=8-0. Obviamente, ddif(n) é 0 precisamente quando todos os dígitos de n são iguais.

Defina recursivamente em Python a função ddif, bem como uma outra função menorddif que dada uma lista não-vazia w de números naturais devolva o valor (ou um dos valores) em w com menor diferença entre o maior e o menor dígito. Por exemplo, menorddif([1323,949,80,779]) deverá devolver 1323 ou 779 (pois ddif(779) também é 2), já que ddif(80) é 8, e ddif(949) é 5.

In [23]:
### como acima, e também

def menorddif(w):
    assert w!=[]
    if len(w)==1:
        return w[0]
    elif ddif(w[0])>ddif(w[1]):
        return menorddif(w[1:])
    else:
        return menorddif([w[0]]+w[2:])