Percursos
/
Crystal
Crystal
/
Exercícios
/
Robô de Festa
Robô de Festa

Robô de Festa

Exercício de aprendizagem

Introdução

Crystal tem um tipo chamado String, que serve para representar texto. As strings de Crystal são sequências de carateres Unicode. As strings são imutáveis, ou seja, não podem ser alteradas depois de criadas. Isto significa que é criada uma nova string sempre que modificas uma string; por isso, a string original não é alterada.

Para definir uma string, usas aspas duplas ".

"Hello World"

Concatenação

Para concatenar duas strings, usa o operador +. O operador + devolve uma nova string que combina as duas strings.

hello = "Hello"
hello + " World"
# => "Hello World"

Conversão entre strings e números

O método to_i converte uma string num número inteiro. Em alternativa, o método to_f pode ser usado para devolver um número de vírgula flutuante. Se a string não puder ser convertida num número, é lançado um ArgumentError.

"1".to_i
# => 1

"1.0".to_f
# => 1.0

"Hello".to_i
# => ArgumentError: Invalid integer: Hello

Um número inteiro ou de vírgula flutuante pode ser convertido numa string com o método to_s.

1.to_s
# => "1"

1.0.to_s
# => "1.0"

Interpolação

A interpolação é uma forma prática de combinar strings e de incorporar expressões em strings. Para interpolar uma string, podes usar o caráter # seguido de chavetas {}, com a expressão dentro das chavetas.

name = "World"
"Hello #{name}!"
# => "Hello World!"

Crystal converte automaticamente o resultado da expressão numa string.

"Hello #{1 + 1}!"
# => "Hello 2!"

Tamanho

Quando precisas de saber o número de carateres de uma string, podes usar o método size, que devolve o comprimento da string como número inteiro. O tamanho de uma string é uma propriedade armazenada da string, por isso não é preciso calculá-lo sempre que chamas o método, o que torna o método muito rápido.

"Hello World".size
# => 11

Indexação

A indexação permite-te obter um caráter específico de uma string. Para obteres um caráter de uma String, podes usar a conhecida notação de parênteses retos.

Note

[] está implementado como um método de instância de String, em que o índice é o argumento do método.

Em Crystal, o primeiro caráter de uma string está no índice 0.

"Hello World"[0]
# => 'H'

"Hello World"[6]
# => 'W'

Para obteres um caráter do fim de uma string, podes usar o comprimento da string menos um para chegares ao índice do último caráter; para o penúltimo caráter, usas o comprimento da string menos dois, e assim sucessivamente. Há um atalho para isto: basta usares um índice negativo, em que o último caráter está no índice -1, o penúltimo está no índice -2, e assim sucessivamente.

name = "Hello World"
name[name.size - 1]
# => 'd'

name[-1]
# => 'd'

Sequências de escape

Alguns carateres não podem ser escritos diretamente numa string; para isso, tens de usar uma sequência de escape. Por exemplo, se quiseres usar aspas duplas numa string, tens de as escapar. Podes usar o caráter \ para escrever uma sequência de escape seguida do caráter que queres escapar.

Estes são os carateres especiais em Crystal:

Value Description
\a Alerta
\b Retrocesso
\e Escape
\f Avanço de página
\n Avanço de linha ou nova linha
\r Retorno de carro
\t Tabulação horizontal
\v Tabulação vertical
\\ Barra invertida
\' Aspas simples
\" Aspas duplas
\377 Caráter ASCII octal
\xFF Caráter ASCII hexadecimal
\uFFFF Caráter Unicode hexadecimal
puts "Hello \"World\""
# => Hello "World"

puts "Hello \nWorld"
# => Hello
# => World

Strings com várias linhas

Para escreveres uma string com várias linhas, usas a mesma sintaxe de uma string de uma só linha, mas mudas de linha a cada linha que queres incluir na string.

"Hello
World"
# => "Hello\nWorld"

Instruções

Era uma vez um programador excêntrico que vivia numa casa estranha com janelas com grades. Um dia, aceitou um trabalho numa plataforma de ofertas de emprego online para construir um robô de festas. O robô devia cumprimentar as pessoas e ajudá-las a chegar aos seus lugares. A primeira edição era muito técnica e mostrava a falta de interação humana do programador. Parte disso também passou para a edição seguinte.

1. Dá as boas-vindas a um novo convidado na festa

Implementa o método welcome para devolver uma mensagem de boas-vindas com o nome indicado:

PartyRobot.welcome("Christiane")
# => Welcome to my party, Christiane!

2. Dá as boas-vindas a um convidado cujo aniversário é hoje

Implementa o método happy_birthday para devolver uma mensagem de aniversário com o nome e a idade indicados da pessoa. Infelizmente, o programador é um pouco exibicionista, por isso o robô tem de demonstrar que sabe o aniversário de todos os convidados.

PartyRobot.happy_birthday("Frank", 58)
# => Happy birthday Frank! You are now 58 years old!

3. Dá indicações

Implementa a função assign_table para dar indicações. Deve aceitar 5 parâmetros.

  • O nome do novo convidado a cumprimentar (String)
  • O número da mesa (Int)
  • O nome do vizinho de mesa (String)
  • A direção onde se encontra a mesa (String)
  • A distância até à mesa (Float64)

O formato exato do resultado pode ver-se no exemplo abaixo.

O nome do vizinho de mesa deve ser encurtado para a primeira e a última letra do nome. Frank passa a Fk, Christian passa a Cn, e assim por diante.

O robô indica o número da mesa. O robô também menciona a distância da mesa. Felizmente, apenas com uma precisão limitada a 1 algarismo.

PartyRobot.assign_table("Christiane", "on the left", 27, 23.7834298, "Frank")
# =>
# Welcome to my party, Christiane!
# You have been assigned to table 27. Your table is on the left, exactly 23.8 meters from here.
# You will be sitting next to Fk.
Editar via GitHub A ligação abre numa nova janela ou separador
Crystal Exercism

Estás pronto para começar Robô de Festa?

Inscreve-te no Exercism para aprenderes e dominares Crystal com 26 conceitos142 exercícios, e mentoria humana real, tudo grátis.