El estilo de vida de la colección

Ejercicio 4.1

Abre el browser de protocolo en la clase String, busca el método allButFirst: implementado en SequenceableCollection. Lee en su código fuente el comentario.

'Hello My Friend' allButFirst: 6
⇒ 'My Friend'

Ejercicio 4.2

(-80 to: 50) asArray

Ejercicio 4.3

(1 to: 100) difference: (25 to: 75)
⇒ #(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
22 23 24 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
92 93 94 95 96 97 98 99 100) 

Ejercicio 4.4

(-20 to: 45) select: [:z | z odd]

Ejercicio 4.5

((101 to: 200) select: [:n | n isPrime]) size
⇒ 21 

Ejercicio 4.6

(1 to: 100) select:[:n | n isDivisibleBy: 7]
⇒ #(7 14 21 28 35 42 49 56 63 70 77 84 91 98) 

Ejercicio 4.7

Esta solución, basada en operaciones con conjuntos y el uso múltiple del mensaje #select:, es muy compatible con los conocimientos adquiridos hasta este punto del libro.

| primeNumbers nonPrimeNumbers |
primeNumbers := (1 to: 100) select: [:n | n isPrime].
nonPrimeNumbers := (1 to: 100) difference: primeNumbers.
nonPrimeNumbers select: [:n | n odd]
⇒ #(1 9 15 21 25 27 33 35 39 45 49 51 55 57 63 65 69 75
77 81 85 87 91 93 95 99) 

Una solución más corta con operaciones lógicas se discutirá más adelante:

(1 to: 100) select:[:n | n isPrime not and: [n odd]]

Ejercicio 4.8

'Zpv!bsf!b!cptt' collect: [:c |
   Character codePoint: c asciiValue - 1]
⇒ 'You are a boss' 

Ejercicio 4.9

($A to: $Z) collect: [:c |
   Character codePoint: c asciiValue - 65 + 3 \\ 26 + 65]

Cada carácter de la A a la Z se referencia con el parámetro c del bloque y se convierte a su valor ASCII31: c asciiValue. Se desplaza 65, por lo que la letra A cuenta como 0 y la Z como 25 en la lista alfabética. Para aplicar el cifrado César, enviamos el mensaje + 3 al resultado anterior.

Ya casi lo tenemos, solo los caracteres X, Y, Z desbordarán el alfabeto, de hecho estos caracteres se cifrarán como 26, 27, 28. Para solucionarlo, enviamos \\ 26 al resultado anterior, es un viejo truco de programación: el resto de la división euclidiana por 26 enmarca el valor entre 0 y 25.32.

Por último se desplaza de nuevo 65 antes de convertir el valor ASCII al carácter.

Ejercicio 4.10

En la solución del Ejercicio 4.9 sólo necesitamos reemplazar el intervalo de caracteres por una cadena:

'SMALLTALKEXPRESSION' collect: [:c |
   Character codePoint: c asciiValue - 65 + 3 \\ 26 + 65]
⇒ 'VPDOOWDONHASUHVVLRQ' 

Ejercicio 4.11

  'DOHDMDFWDHVW' collect: [:c |
    Character codePoint: c asciiValue - 65 - 3 \\ 26 + 65]
⇒ 'ALEAJACTAEST'

Ejercicio 4.12

El mensaje apropiado es #first:, definido en la clase madre SequenceableCollection. Necesitas utilizar el visor de protocolo o jerarquía para descubrirlo en Array:

array1 first: 2
⇒ #(2 'Apple') 

Ejercicio 4.13

Simplemente hacer un conteo:

array1 at: 1 put: 'kiwi'.
array1 at: 2 put: 'kiwi'.
array1 at: 3 put: 'kiwi'.
array1 at: 4 put: 'kiwi'.

O incluso algo menos que un conteo:

1 to: array1 size do: [:index |
   array1 at: index put: 'kiwi']

Pero si buscas cuidadosamente en el protocolo Array, puedes hacer nada más que:

array1 atAllPut: 'kiwi'.

Ejercicio 4.14

En el protocolo OrderedCollection busca el método add:after:.

coll1 := {2 . 'Apple' . 2@1 . 1/3 } asOrderedCollection .		
coll1 add: 'Orange' after: 'Apple'; yourself.
⇒  an OrderedCollection(2 'Apple' 'Orange' 2@1 1/3) 

Ejercicio 4.15

Set  new
   addAll: 'buenos días';
   addAll: 'bonjour';
   yourself.
⇒  a Set($e $j $o $a $u $b $  $í $r $d $n $s) 

Ejercicio 4.16

colors keysDo: [:key |
   colors at: key put: key asString capitalized].
colors
⇒ a Dictionary(#blue->'Blue' #green->'Green' #red->'Red'
#yellow->'Yellow' ) 

Ejercicio 4.17

Cuando comienza el juego no hay torpedos disparados, por lo que torpedoes es una OrderedCollection vacía, instanciada con el mensaje de clase #new.

Por otro lado, ships es un Array que contiene solo dos elementos, las naves de jugador. Usamos el mensaje de clase #with:with para instanciar y poblar el array con dos naves creadas en el mensaje de argumento.

Por legibilidad, separamos el código en varias líneas con la indentación apropiada.

   torpedoes := OrderedCollection new.
   ships := Array 
      with: SpaceShip new
      with: SpaceShip new.

Ejercicio 4.18

SpaceWar>>stepAt: msSinceLast
  ships do: [:each | each update: msSinceLast / 1000 ].
  ships do: [:each | each unpush ].
  torpedoes do: [:each | each update: msSinceLast / 1000 ].

Notas al pie

(31)

https://en.wikipedia.org/wiki/ASCII

(32)

Se generaliza al campo matemático de la aritmética modular, https://www.wikiwand.com/en/Modular_arithmetic