Seu objetivo é escrever um codificador de semáforo de bandeira , que converterá uma determinada frase nos caracteres correspondentes de semáforo de bandeira, de acordo com o sistema de semáforo descrito na Wikipedia .
Suponha que a entrada seja uma única frase fornecida por meio de stdin (ou equivalente). Sua saída deve ser uma série de caracteres de semáforo, com cada linha representando uma palavra da frase. Você só precisa lidar com o alfabeto (AZ) e deve ignorar todos os outros caracteres que não sejam espaços, mas deve poder manipular letras maiúsculas e minúsculas. Sua saída pode conter espaço em branco extra.
Os caracteres do semáforo devem ser exibidos como um quadrado 3x3, com um O
no meio e as posições de bandeira representadas pelos caracteres | - / \
. Cada caractere de semáforo deve ser separado dos caracteres adjacentes por um espaço e cada linha deve ser separada por uma linha em branco. Não se preocupe em agrupar palavras que podem ser muito longas para sua exibição - finja que suas linhas têm um comprimento infinito.
Entrada de amostra:
abcdefg hijklmn opqrstu vwxyz
Saída de amostra:
\ | /
O -O O O O O- O
/| | | | | | |\
\ | | /
-O O O- O O O- O
/ / / / / / \
\ | / \| \ /
-O -O -O -O- -O O O
\
| / / \
O O- O O- O-
\ \ \
Entrada de amostra:
This is Code Golf.
Saída de amostra:
\| \
O -O O -O
/ / \
\
O -O
/ \
\ \ | /
O -O O O
| | |
\ /
O -O O O-
|\ / |
Como se trata de código-golfe , a solução mais curta vence.
and each row must be separated by a blank line
=> cada palavra significa, não é?Respostas:
Perl,
282264251247245243241240236233229227220218216214 caracteresCom algumas quebras de linha pretextantes:
Demorei um pouco para que isso funcionasse (minha primeira tentativa de resposta em Perl). É baseado em uma idéia semelhante a muitas das outras respostas. Cada bandeira pode estar em uma das 8 posições, há duas bandeiras e as duas bandeiras nunca podem estar na mesma posição. Isso significa que posso codificar a posição de ambos os sinalizadores em um byte - o que também significa que posso traduzir diretamente de um caractere para sua codificação usando a
y///
função Perl (operador?). Então:-Portanto:
Eu escapei de alguns dos caracteres que estão fora do intervalo normal usado para facilitar a cópia e a colagem do programa - mas tenho quase certeza de que poderia escrever um programa para substituir os códigos de escape pelos próprios caracteres, me salvando aproximadamente 30 caracteres.
fonte
Python,
244238233232Isso usa um dos meus truques favoritos: codificação de faixa única. Eu rotulei os bits de semáforo (sbits)
para obter o seguinte gráfico de quais sbits ocorrem para qual letra:
cada letra ocorre exatamente duas vezes no gráfico, uma vez que o sinaleiro tem dois braços. Então, vejo isso como um gráfico nas letras az, com bordas entre letras que compartilham sbits, com as bordas rotuladas de acordo com o sbit compartilhado. Idealmente, eu encontraria um caminho Hamilton através deste gráfico, de modo que as arestas subsequentes não tenham o mesmo rótulo. Nenhum desses caminhos existe ... então você notará que a variável
e
contém a letrab
duas vezes.Com o meu caminho quase Hamilton
e
, construo uma matrizd
de rótulos de sbit usados na travessia dee
. Então, para descobrir onde colocar os braços, o sinaleiro só precisa encontrar a letra desejada na tabela a seguirde onde seus braços ficam na posição diretamente abaixo e abaixo e à direita da letra.
fonte
to_lower()
paralower()
. Além disso, ocorreu um erro ao tentar fornecer uma entrada não alfabética.Scala, 272 caracteres
Sem Golfe (bem, com menos golfe):
fonte
Ruby, 287 caracteres
A entrada deve ser fornecida no STDIN.
fonte
Scala
494 sem novas linhas520 com novas linhas:ungolfed:
Explicação:
Eu observei um padrão de relógio, mas não com 12 horas, mas 8. E Starttime é 0, onde são 6 horas e a, b, c são os primeiros códigos, com a primeira (uma) bandeira no sul.
Como os sinalizadores 1 e 2 são indistinguíveis, podemos classificar todas as combinações com o número mais baixo para o primeiro sinalizador primeiro. Infelizmente, a ordem correta desde o início é perturbada, quando j não segue i, mas k, l, m, e depois fica uma bagunça.
Portanto, reorganizo minhas chaves para o mapeamento:
Se subtrairmos 'a' de todos os caracteres, obteremos os números de (0 a 7 + 6 + 5 + ... + 1). Podemos mapear os números de uma grade de caracteres
Um par de dois números pode mapear dois sinalizadores, onde o primeiro número é o índice de 0 a 6 para o primeiro sinalizador e o segundo sinalizador não é um número de 1 a 7 para o segundo sinalizador, mas para a distância do primeiro para o segundo sinalizador. (2,2) significaria, a primeira bandeira é para OESTE, e a segunda é dois passos no sentido horário a partir daí, para o NORTE.
fonte
object Main extends Application
bloco, mas isso não parece suficiente.readLine
na última linha por"readLine"
ele deve funcionar (o código é compatível com 2.8).Haskell
331357339 caracteresGolfe:
Ungolfed:
Codificação é
[hour, minute]
onde os relógios têm 8 horas e 8 minutos. Os minutos se movem mais rápido que horas. Se um relógio marcar onde a hora e o minuto seriam iguais, adicione 1 à hora e 2 ao minuto também (veja o exemplo do segundo tick acima). Essa é a única maneira de aumentar as horas. As horas NÃO aumentam quando o minuto atinge um minuto arbitrário. Somente quando os minutos equivalem a horas. No código não destruído,clock
transforma letras em relógios que representam o semáforo. A maioria dos relógios é construída com base nos tiques dos anteriores. O restante é codificado. Não há realmente nada mais no código.fonte
Perl,
356, 275 caracteresUm grande número de caracteres foi salvo substituindo 'if else' para '? :' construção.
fonte
<>
vez de,$ARGV[0]
poderá usarlc
a entrada stdin e usar para converter todos os caracteres em minúsculas. Isso tem o benefício adicional de salvar 4 caracteres. Ele não lida com caracteres não-alfabeto também, mas sem dúvidaYou only need to deal with the alphabet (A-Z) and should ignore all other non-space characters
não é muito clara sobre o que fazer com eles ...PowerShell ,
198192191188 bytesExperimente online!
A saída contém uma linha vazia de cauda.
Menos golfe:
fonte
Carvão , 70 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Divida a entrada em minúsculas em espaços e faça um loop sobre cada palavra.
Faça um loop sobre cada caractere.
Divida a sequência compactada
fjmrwyz gnsvxz abcdefg ahiklmn bhopqrs ciotuy djkptv elquwx
em espaços e faça um loop sobre cada grupo de letras.Se o grupo contiver a letra atual, desenhe uma linha na direção atual.
Gire 45 ° no sentido horário.
Saída do centro
o
e vá para a posição da próxima letra.Vá para o início da próxima palavra.
fonte