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'
(-80 to: 50) asArray
(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)
(-20 to: 45) select: [:z | z odd]
((101 to: 200) select: [:n | n isPrime]) size ⇒ 21
(1 to: 100) select:[:n | n isDivisibleBy: 7] ⇒ #(7 14 21 28 35 42 49 56 63 70 77 84 91 98)
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]]
'Zpv!bsf!b!cptt' collect: [:c | Character codePoint: c asciiValue - 1] ⇒ 'You are a boss'
($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.
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'
'DOHDMDFWDHVW' collect: [:c |
Character codePoint: c asciiValue - 65 - 3 \\ 26 + 65]
⇒ 'ALEAJACTAEST'
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')
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'.
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)
Set new addAll: 'buenos días'; addAll: 'bonjour'; yourself. ⇒ a Set($e $j $o $a $u $b $ $í $r $d $n $s)
colors keysDo: [:key | colors at: key put: key asString capitalized]. colors ⇒ a Dictionary(#blue->'Blue' #green->'Green' #red->'Red' #yellow->'Yellow' )
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.
SpaceWar>>stepAt: msSinceLast ships do: [:each | each update: msSinceLast / 1000 ]. ships do: [:each | each unpush ]. torpedoes do: [:each | each update: msSinceLast / 1000 ].
https://en.wikipedia.org/wiki/ASCII
Se generaliza al campo matemático de la aritmética modular, https://www.wikiwand.com/en/Modular_arithmetic