Llicència
Pots copiar i redistribuir aquest material seguint la llicència Attribution-NonCommercial-ShareAlike 4.0 International CC BY-NC-SA 4.0, indicant-ne autors originals, l'origen (aquesta web), sense fins comercials i mantenint-ne aquesta la llicència
Autors:
Exercicis Llistes
- Usa el mateix projecte que l'usat als exercicis
- Crea un package …m03.uf1.lists.
- La classe de cada exercici ha de ser el nom de l'exercici
Sumari
- List
- MutableList
- Recorregut de llistes
- Llistes i classes
- Llistes mida dinàmica
- Matrius
- Avançats
- Acepta el reto
List
DayOfWeek
Donat un enter, printa el dia de la setmana amb text (dilluns, dimarts, dimecres…), tenint en compte que dilluns és el 0. Els dies de la setmana es guarden en una llista
Input
6
Output
diumenge
PlayerNumbers
Volem fer un petit programa per guardar l'alineació inicial de jugadors d'un partit de bàsquet. L'usuari introduirà els 5 números dels jugadors. Imprimeix-los després amb el format indicat.
Input
3 9 44 11 6
Output
[3, 9, 44, 11, 6]
CandidatesList
Volem fer un petit programa per un partit polític. Quan hi ha eleccions, el partit presenta una llista de candidats. Cada candidat té una posició a la llista.
El programa primer llegirà la llista de candidats (primer introduïrem la quantitat i després un candidat per línia).
Un cop llegida la llista, l'usuari podrà preguntar quin candidat hi ha a cada posició. El programa acaba quan introdueixi -1. Tingues en compte que els politics no són informàtics, i si indiquen la posició 1, volen dir el primer polític de la llista.
Input
3
Mar Pi
Yun Om
Ali Puig
1
1
3
-1
Output
Mar Pi
Mar Pi
Ali Puig
LetterInWord
Donada una paraula i un valor indica quina lletra hi ha a la posició indicada
Els strings funcionen com si fossin llistes de chars
var paraula:String = "Hello"
print(paraula[0])
Input
Hello 1
Ouput
e
MutableList
AddValuesToList
Inicialitza un list de floats de mida 50, amb el valor 0.0f a tots els elements.
Després asigna els els valors següents a les posicions indicades i printa la llista:
- primera: 31.0f
- segona: 56.0f
- vintena: 12.0f
- última: 79.0f
Sortida
[31.0, 56.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 12.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 79.0]
Swap
Donada una llista de 4 números de tipus int,intercanvia el primer per l'últim element.
Input
9 4 6 7
Output
[7, 4, 6, 9]
PushButtonPadlockSimulator
Volem fer un simulador d'un candau com el de la foto:
La nostra versió, taḿbé tindrà 8 botons, però el primer serà el 0. A l'inici tots els botons estaran sense apretar.
L'usuari introduirà enters indicant quin botó ha d'apretar (o desapretar)
Quan introdueixi el -1, és que ja ha acabat i hem d'imprimir l'estat del candau
Input
1 2 3 4 4 4 4 3 5 -1
Output
[false, true, true, false, false, true, false, false]
BoxesOpenedCounter
Un banc té tot de caixes de seguretat, enumerades del 0 al 10.
Volem registar quan els usuaris obren una caixa de seguretat, i al final del dia, fer-ne un recompte.
L'usuari introduirà enters del 0 al 10 quan s'obri la caixa indicada.
Quan introduiexi l'enter -1, és que s'ha acabat el dia. Printa per pantalla el nombre de cops que s'ha obert.
Input
5 4 9 0 0 5 5 5 3 5 -1
Output
[2, 0, 0, 1, 1, 5, 0, 0, 0, 1, 0]
Recorregut de llistes
MinOf10Values
L'usuari entra 10 enters. Crea un list amb aquest valors.
Imprimeix per pantalla el valor més petit introduit.
Busca quin mètode de llistes et permet fer aquesta tasca que has realitzat.
IsThereAMultipleOf7
Donat el següent vector, imprimeix true si algún dels números és divisible entre 7 o false sinó.
val values = listOf(4,8,9,40,54,84,40,6,84,1,1,68,84,68,4,840,684,25,40,98,54,687,31,4894,468,46,84687,894,40,846,1681,618,161,846,84687,6,848)
IsThereAMultipleOf7v2
kotlin té diferents utilitats sobre llistes. Mira aquest exemple
val anyNegative = numbers.any { it < 0 }
val allEven = numbers.all { it % 2 == 0 }
val allLess6 = numbers.none { it > 6 }
anyNegative -> true si la llista conté algun element que compleix el predicat (element negatiu)
allEven -> true si tots els elements compleixen el predicat (l'element és parell)
allLess6 -> true si cap dels elements compleixen el predicat (l'element és més gran que sis)
Fes l'exercici anterior utilitzant el mètode any
SearchInOrdered
Donat una llista d'enters ordenats de menor a major indica si un cert valor existeix en el bucle, sense utilitzar el mètode any
Input
10
1 2 4 6 8 10 15 34 89 96
4
Output
true
InverseOrder
L'usuari entra 10 enters. Imprimeix-los en l'odre invers al que els ha entrat.
Existeix algun mètode de llistes que ja implementa aquesta tasca?
Palindrom
Indica si una paraula és palíndrom.
Els strings funcionen com si fossin llistes de chars
Exemples de palíndroms:
- cec, cuc, gag, mínim, nan, nen, pipiripip…
ListSortedValues
Printa per pantalla ordenats si la llista de N valors introduïts per l'usuari estan ordenats.
L'usuari primer entrarà el número d'enters a introduir i després els diferents enters.
Input
5
1 25 25 81 90
Output
ordenats
Input
5
1 25 24 81 90
Output
desordenats
ListReader
Crea una funció ListReader i defineix la funció següent, que llegeix una llista d'enters de l'usuari. L'usuari primer entrarà el número d'enters a introduïr i després els diferents enters.
Nota: a l'exercici ListSortedValues ja has fet aquesta funció.
/**
* Reads an int of lists from user input.
* The user first introduces the number (N).
* Later it introduces the integers one by one.
* @return int list of values introduced of size N
*/
fun readIntList(scanner:Scanner):List<Int>
Utilitza aquesta funció quan la necessitis.
Per fer-la servir, l'has de cridar de la següent manera:
val scanner = Scanner(System.`in`).useLocale(Locale.US)
/// ...
val values = readIntList(scanner)
ListMaxValue
L'usuari introduirà una llista d'enters, com s'indica al mètode readIntList.
Un cop llegits tots, printa per pantalla el valor més gran.
El mètode que has implementat forma part de les utilitats de llistes, és a dir és una funció de la classe List. A partir d'ara el pots utilitzar quan el necessitis fent ús de maxOf()
Comprova que saps utilitzar aquest mètode.
CapICuaValues
Printa per pantalla cap i cua si la llista de N valors introduïts per l'usuari són cap i cua (llegits en ordre invers és la mateixa llista).
Input
4 10 5 5 10
Output
cap i cua
ListSameValues
L'usuari introduirà 2 llistes de valors, com s'indica al mètode readIntList.
Printa per pantalla són iguals si ha introduït la mateixa llista, o no són iguals si són diferents
Input
2 5 10
2 5 10
Output
són iguals
ListSameValuesV2
A l'exercici anterior has comparat element a element?
Kotlin en permet utilitzar el comparador d'igualtat entre llistes
list1 == list2
Si ja ho havies descobert fes l'exercici element per element
ListSumValues
L'usuari introduix una llista de valors tal i com s'indica al mètode readIntList.
Imprimeix per pantalla la suma d'aquests valors.
Input
3 5 10 12
Output
27
Aquest mètode que has implementat ja està inclòs dins la classe List, a partir d'ara el pots fer servir, i no et cal implementar-lo cada vegada.
Funciona de la manera següent:
val myIntList = listOf(3, 4, 2)
myIntList.sum() // = 9
IvaPrices
En una botiga volem convertir tot de preus sense a IVA al preu amb IVA. Per afegir l'IVA a un preu hem de sumar-hi el 21% del seu valor.
L'usuari introduirà el preu de 10 artícles. Imprimeix per pantalla el preu amb l'IVA afegit amb el següent format indicat a continuació. El programa no pot imprimir res fins a que hagi llegit tots els valors.
Input
8 4 45 2 48 12 48 55 15 1
Output
8.0 IVA = 9.68
4.0 IVA = 4.84
45.0 IVA = 54.45
2.0 IVA = 2.42
48.0 IVA = 58.08
12.0 IVA = 14.52
48.0 IVA = 58.08
55.0 IVA = 66.55
15.0 IVA = 18.15
1.0 IVA = 1.21
CovidGrowRate
El departament de salut ens ha demanat que calculem la taxa de infecció que està tenint la Covid en la nostre regió sanitaria. Donat un nombre de casos en una setmana, si la següent tenim un nombre de casos , podem calcular la taxa d'infecció amb la fórmula
L'usuari introduirà un llistat de casos detectats cada setmana (usant el format del ListReader). Imprimeix la taxa d'infecció detectada cada setmana. El programa no pot imprimir res fins a que hagi llegit tots els valors.
Input
10 5 7 9 21 45 100 260 240 230 201
Output
1.4 1.2857142857142858 2.3333333333333335 2.142857142857143 2.2222222222222223 2.6 0.9230769230769231 0.9583333333333334 0.8739130434782608
BicicleDistance
Donada una velocitat d'una bicicleta en metres per segon, indica els metres que haurà recorregut quan hagi passat 1,2,3,4,5,6,7,8,9 i 10 segons.
Input
2.5
Output
2.5 5.0 7.5 10.0 12.5 15.0 17.5 20.0 22.5 25.0
ValueNearAvg
L'usuari introduix una llista de valors tal i com s'indica al mètode readIntList.
Imprimeix per pantalla el valor que està més proper a la mitjana dels valors de la llista (calcula la mitjana dels valors primer i cerca el més proper després).
Input
4 1 3 9 20
Output
9
Isbn
Es vol fer un programa que verifiqui que un codi ISBN (International Standard Book Code) és correcte. El format d’un codi ISBN és: Codi de grup (1 dígit), Codi de l’editor (4 dígits), Codi del llibre (4 dígits), Caràcter/dígit de control (1 caràcter/dígit)
Així, per exemple, el codi ISBN d’un llibre és 84-7602-561-0. La verificació del codi es fa a partir d’aplicar una sèrie d’operacions sobre els primers 9 dígits del resultat de les quals se n’extreu el dígit/caràcter de control. Per a l’obtenció del control, cal fer els passos següents:
Es multiplica cadascun dels dígits per la posició que ocupa dins l’ISBN i se sumen totes les multiplicacions. Es divideix el resultat per 11 i el residu és el dígit de control. Si aquest residu és 10 es fa anar la lletra “X” com a control.
Per exemple el ISBN: 84-7602-561-0 , el caràcter de control és el 0
(8x1)+(4x2)+(7x3)+(6x4)+(0x5)+(2x6)+(5x7)+(6x8)+(1x9) = 165 165 mod 11 = 0
El residu és igual al caràcter de control per tant és un ISBN vàlid
Input
0 7 6 4 5 2 6 4 1 3
Output
true
Isbn13
A partir de l'any 2006 els ISBN van passar a tenir 13 dígits i es va adaptar per a què fos compatible amb el sistema de codi de barres EAN-13.
Volem verificar si un codi ISBN és correcte. Mitjançant el dígit de control que és el dígit número 13. Es calcula de la manera següent:
Es multiplica el primer dígit dels 12 digits
per 1, el segon per 3, el tercer per 1, el quart per 3, i així
succesivament fins al número 12;
El dígito de control és el valor que s'ha d'afegir a la suma de tots aquests productes per fer-la divisible per 10. Si
el resultat de la suma ja fos múltiple de 10, el dígito de control seria 0.
Aquest ISBN 978-84-92493-70-8 ens el donarien de la manera següent, indica si él dígit de control és correcte.
Input
9 7 8 8 4 9 2 4 9 3 7 0 8
Output
true
Llistes i classes
MostPopulatedCountries
Donada una llista de països amb la seva població, volem imprimir els noms dels països amb més població d'un numero indicat per l'usuari.
L'usuari primer introduirà el nombre de països i la informació de cada país (nom i població).
Finalment introduirà el mínim de població desitjada. Imprimeix els noms dels països amb més població que la introduida.
Input
10
Bangladesh
164689383
India
1380004385
Brazil
212559417
Indonesia
273523615
Mexico
128932753
Pakistan
220892340
Nigeria
206139589
China
1439323776
United States
331002651
Russia
145934462
200000000
Output
India
Brazil
Indonesia
Pakistan
Nigeria
China
United States
MultiProductInfoPrinter
Llegeix el nom i preu de diferents productes i imprimeix-los per pantalla amb el format indicat.
Intput
3 Taula 232.32 Cadira 90.90 Bolígraf 76.22
Output
El producte Taula val 232.32€
El producte Cadira val 90.90€
El producte Bolígraf val 76.22€
FromAvgSallaryInfo
En una empresa ens diuen que volen coneixer el salari mitjà dels seus treballadors, i veure quin cobre per sota.
L'usuari introduirà una línia per cada treballador amb el seu sou, i el seu nom.
Un cop introduits els treballadors printa per pantalla el nom dels treballadors que cobren per sota del sou mitjà.
input: 3 Mar 3000 Ona 3500 Ot 2500
output: Ot
Llistes mida dinàmica
AnotherInverseOrder
L'usuari entrarà un conjunt d'enters per pantalla. Quan introdueixi el -1, és que ja ha acabat.
Imprimeix-los en odre invers.
Input
1 2 3 4 8 2 -1
Output
[2, 8, 4, 3, 2, 1]
StrangeOrder
L'usuari entrarà un conjunt d'enters per pantalla. Quan introdueixi el -1, és que ja ha acabat. Afegeix el primer a l'inici de la llista, el segon al final, el tercer a l'inici, etc.
Printa el resultat:
Input
1 2 3 4 5 6 -1
Output
[5,3,1,2,4,6]
PassaLlista
Volem fer un programa que ens digui quins alumnes no han vingut a classe.
L'usuari introduirà enters ordenats de major a menor, indicant la posició dels alumnes que han vingut a classe.
Quan introdueixi un -1 és que ja ha acabat.
Tenim la següent llista d'alumnes:
"Magalí", "Magdalena", "Magí","Màlika", "Manel", "Manela", "Mar", "Marc", "Margalida", "Marçal", "Marcel", "Maria", "Maricel", "Marina", "Marta", "Martí", "Martina", "Mausi", "Mei-Xiu", "Miquel", "Ming", "Mohamed"
Input
3 2 1 0 -1
Output
[Manel, Manela, Mar, Marc, Margalida, Marçal, Marcel, Maria, Maricel, Marina, Marta, Martí, Martina, Mausi, Mei-Xiu, Miquel, Ming, Mohamed]
StoreFirstOnly
L'usuari introduirà enters. Enmagatzema en una llista la primera vegada que l'usuari entri un valor.
Quan introdueixi un -1 és que ja ha acabat.
Input
1 3 9 3 5 1 9 2 -1
Output
[1, 3, 9, 5, 2]
StrangeCountDown
Demana a l'usuari dos enters. Imprimeix per pantalla els números que hi ha entre els dos enters, alternant, el més petit amb el més gran.
Input
3 9
Output
4 8 5 7 6
AllwaysSorted
L'usuari introduirà enters. Enmagatzema'ls en una llista de tal manera que la llista estigui sempre ordenada.
Quan introdueixi un -1 és que ja ha acabat.
Al final imprimeix la llista:
Input
3 5 9 2 7 -1
Output
2 3 5 7 9
Matrius
SimpleBattleshipResult
Donada la següent configuració del joc Enfonsar la flota, indica si a la posició x, y hi ha aigua o un vaixell (tocat)
- Configuració
On x són baixells i els 0 aigua, casella superior esquerra és la 0,0 i la superior dreta la 0,6
x x 0 0 0 0 x
0 0 x 0 0 0 x
0 0 0 0 0 0 x
0 x x x 0 0 x
0 0 0 0 x 0 0
0 0 0 0 x 0 0
x 0 0 0 0 0 0
- Exemples
Input
1 1
Output
aigua
Input
3 1
Output
tocat
MatrixElementSum
Donada la següent matriu
val matrix = listOf(listOf(2,5,1,6),listOf(23,52,14,36),listOf(23,75,81,64))
Imrimeix la suma de tots els seus valors.
MatrixBoxesOpenedCounter
Un banc té tot de caixes de seguretat en una graella, enumerades per fila i columna del 0 al 3.
Volem registar quan els usuaris obren una caixa de seguretat, i al final del dia, fer-ne un recompte.
- L'usuari introduirà parells d'entrers del 0 al 3 quan s'obri la caixa indicada.
- Quan introduiexi l'enter -1, és que s'ha acabat el dia. Printa per pantalla el nombre de cops que s'ha obert.
Input
1 1 1 3 3 3 1 1 3 3 3 0 0 3 -1
Output
[[0, 0, 0, 1], [0, 2, 0, 1], [0, 0, 0, 0], [1, 0, 0, 2]]
MatrixIsThereADiv13
Donada la següent matriu
val matrix = listOf(listOf(2,5,1,6),listOf(23,52,14,36),listOf(23,75,81,62))
Imprimeix true si algún dels números és divisible entre 13, false altrement.
HighestMountainOnMap
Usant les imatges d'un satel·lit hem pogut fer raster o (mapa de bits)[https://ca.wikipedia.org/wiki/Mapa_de_bits] que ens indica l'alçada d'un punt concret d'un mapa. Hem obtingut la següent informació:
val map =listOf(listOf(1.5,1.6,1.8,1.7,1.6),listOf(1.5,2.6,2.8,2.7,1.6),listOf(1.5,4.6,4.4,4.9,1.6),listOf(2.5,1.6,3.8,7.7,3.6),listOf(1.5,2.6,3.8,2.7,1.6));
Digues en quin punt(x,y) es troba el cim més alt i la seva alçada
Output
x, y: 1.5 metres
Substituint x i y, per les cordenades i 1.5 metres per l'alçada del cim més alt.
HighestMountainScaleChange
El govern britànic ens ha demanat que també vol accedir a les dades de l'exercici anterior i que les necessitaria en peus i no metres.
Per convertir un metre a peus has de multiplicar els metres per 3.2808.
Fes la conversió i imprimeix la matriu per pantalla.
MatrixReader
Dins del fitxer ListReader defineix la funció següent, que llegeix una matriu d'enters de l'usuari.
L'usuari primer entrarà el número de files i columnes i després els diferents enters.
Nota: semblant a ListReader
/**
* Reads an int matrix from user input.
* The user first introduces the size of the matrix(NxM).
* Then, introduces the integers one by one.
* @return matrix of values introduced of size NxM
*/
fun scannerReadIntMatrix(scanner: Scanner ):List<List<Int>>
Utilitza aquesta funció quan la necessitis.
Per fer-la servir, l'has de cridar de la manera següent:
val scanner = Scanner(System.`in`).useLocale(Locale.US)
val matrix = scannerReadIntMatrix(scanner)
Format d'entrada d'una matriu d'exemple:
3 4
1 2 3 4
2 1 2 1
3 2 1 5
MatrixSum
Implementa un programa que demani dos matrius a l'usuari i imprimeixi la suma de les dues matrius.
Input
3 4
1 2 3 4
2 1 2 1
3 2 1 5
3 4
1 2 3 4
4 3 2 1
2 2 2 2
Output
2 4 6 8
6 4 4 2
5 4 3 7
RookMoves
Programa una funció que donat un tauler d'escacs, i una posició, ens mostri per pantalla quines són les possibles posicions a les que es pot moure una torre.
Primer caldrà llegir la posició de la torre, que simbolitzarem en el tauler amb el valor ♜ (fes copy & paste del simbol, és un string ja que ocupa dos chars), les posicions on aquesta es pugui moure les simbolitzarem amb el valor ♖ i la resta de posicions amb el valor x.
El moviment de la torre és el següent: Es pot moure al llarg d'una fila o d'una columna (però no successivament en una mateixa jugada); se la pot fer avançar tantes caselles com es vulgui.
Input
d 4
Output
x x x ♖ x x x x
x x x ♖ x x x x
x x x ♖ x x x x
x x x ♖ x x x x
♖ ♖ ♖ ♜ ♖ ♖ ♖ ♖
x x x ♖ x x x x
x x x ♖ x x x x
x x x ♖ x x x x
Per imprimir la torre còpia la línia següent
print("♖")
Avançats
SortArray
Implementa un programa que demani una llista a l'usuari i ordeni els nombres de menor a major.
Input
4 2 -1 6 5
Output
-1 2 5 6
MatrixSimetric
Donada una matriu quadrada, el programa imprimeix true si la matriu és simètrica, false en cas contrari.
Input
3 3
1 2 3
2 1 2
3 2 1
Output
true