Isso é o que chamaremos de tigela de sopa de letrinhas - uma forma aproximada de arte ascii-circular com as 26 letras maiúsculas em inglês (AZ) dispostas no sentido horário para formar o perímetro:
XYZABC
VW DE
U F
T G
S H
RQ JI
PONMLK
Escreva um programa que use um único caractere de letra, AZ, e produza a mesma tigela de sopa de letrinhas "girada", por assim dizer, para que a letra de entrada apareça onde A
ocorre no exemplo acima e o resto do alfabeto circule completamente ao redor sentido horário.
Portanto, a saída para entrada A
seria a mesma tigela original de sopa de letrinhas.
E a saída para entrada B
seria esta:
YZABCD
WX EF
V G
U H
T I
SR KJ
QPONML
Da mesma forma, a saída H
seria:
EFGHIJ
CD KL
B M
A N
Z O
YX QP
WVUTSR
Ou para Z
:
WXYZAB
UV CD
T E
S F
R G
QP IH
ONMLKJ
Isso precisa funcionar para todas as 26 letras, de A a Z.
Detalhes:
- Você pode assumir que a única entrada será uma única letra, de A a Z.
- Se for conveniente, você pode usar az minúsculo para entrada e / ou saída, você pode até misturar e combinar minúsculas e maiúsculas.
- A ordem do alfabeto deve circular no sentido horário, não no sentido anti-horário.
- Você deve usar espaços, e não outra coisa, para recuar e encher a tigela de sopa.
- Pode haver novas linhas ou espaços iniciais ou finais na saída, desde que a tigela de sopa esteja organizada corretamente.
- Observe que a forma da tigela tem 12 caracteres de largura por 7 de altura para fazer com que pareça mais ou menos circular como texto. Suas tigelas precisam ter a mesma forma.
Este é o código de golfe, então o código mais curto vence!
Respostas:
05AB1E , 21 bytes
Define um programaf: AlphabeticChar → String
Código:
Experimente online!
Demolir:
Explicação:
A tela (
Λ
) neste contexto específico funciona como uma função com a seguinte assinatura:O parâmetropadronizar é nessa situação um número que define as direções. No código, esse número é representado como 2232344565666667670012122 . As instruções são indicadas da seguinte maneira:
•1못*Ć,ãiDΣ•
, que é uma versão compactada do grande númeroIsso significa que o grande número representa o seguinte padrão de instruções:
Com esse contexto de assinatura, a tela percorre a lista depadronizar e grava caracteres de comprimento do enchimento na direção atual.
Ocomprimento é especificado no código como 2 (no início do código). Para o enchimento , precisamos de uma versão rotacionada do alfabeto para que comece com a entrada especificada. Isso é feito com o seguinte código ( tente aqui ):
No pseudocódigo, isso seria executado pela função canvas:
Por último, você pode ver que o argumento de enchimento é 'girado'comprimento -1 vezes para a direita, o que significa que a tela iria percorrer a seguinte (ciclo e, portanto, infinita) lista:
O que resulta na forma ascii-art da sopa do alfabeto desejada.
fonte
AA¹k._
Como alternativaA¹¡RJ«
, pode ser , mas é a mesma contagem de bytes.•1못*Ć,ãiDΣ•
Como alternativa•õÕ₆qηµñ–†f•·
, pode ser , mas é a mesma contagem de bytes. Ah bem. Boa resposta!Perl 6 , 100 bytes
Experimente online!
Substitui todas as letras da cadeia de caracteres por suas contrapartes deslocadas, enquanto substitui os dígitos pelo número de espaços que representam mais um.
Explicação
fonte
Ruby , 107 bytes
Experimente online!
Sintaxe aprimorada
"i".to_c
->1i
(Sugerido por Jordan)Sistema de coordenadas alterado para que 0 graus fique à direita em vez de em cima. Isso permite
0.5
->6
Multiplicadores ajustados de
j
ek
para encurtamentoEm vez de imprimir a saída
puts a
, concatene os elementos da matriz e retorne uma sequênciaa*$/
Ruby , 119 bytes
Usa um número complexo elevado a uma potência para mapear para uma elipse. Uma volta completa é 26, então cada quadrante é 6,5.
Essa abordagem baseia-se na saída necessária, semelhante a uma elipse, o suficiente para que um mapeamento válido possa ser alcançado.
Experimente online!
fonte
Carvão , 33 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Traçar um caminho.
Contorne a tigela. Cada um se
7
expande para↙←
.Mova um caractere de cada vez (essa API se sobrepõe às extremidades de cada linha pela seguinte).
Desenhe usando o alfabeto dobrado, mas começando na posição do caractere de entrada.
fonte
MATL , 49 bytes
Que bagunça. Mas foi divertido escrever. Existe até um arco tangente envolvido.
Experimente online!
Explicação
O código
cria uma matriz de números e os converte em binário. Isso fornece a matriz zero-um
que é o quadrante superior esquerdo de uma matriz que especifica as posições das letras.
reflete esse quadrante verticalmente sem repetir a última linha e horizontalmente a última coluna para produzir a matriz completa:
Agora temos uma máscara com as posições. O código
converte isso em char, porque o resultado final será uma matriz de char. O caractere 0 é exibido como espaço e as entradas diferentes de zero serão gravadas com as letras apropriadas.
empurra a string
'abc···xyz'
, que contém as 26 letras. Essa sequência precisa ser deslocada circularmente conforme a entrada. Fazer isso,lê a letra de entrada, adiciona 7 ao seu código ASCII e nega o resultado. Para entrada,
'a'
isso dá −104, que é um múltiplo de 26, portanto, o deslocamento circular dessa quantidade não fará nada. Se a entrada éb
isso, obtém -105, que desloca a corda 1 passo para a esquerda para produzir'bcd···yza'
; etc.O próximo passo é definir a ordem em que a sequência deslocada será gravada nas entradas diferentes de zero da matriz. Para este fim,
cria uma cópia da matriz e envia dois vetores contendo as posições de linha e coluna com base em 1 dos nonzeros. Então
subtrai 7 do último, coloca o primeiro no topo, subtrai 4 dele e o nega. Os 7 e 4 especificam uma origem de coordenadas, de modo que os ângulos dos vetores de posição das entradas diferentes de zero em relação a essa origem definam a ordem desejada.
calcula o módulo arctangente de dois argumentos 2 * pi para produzir esses ângulos. Agora, o menor ângulo, que é 0, corresponde à entrada para onde a primeira letra deve ir e o restante avança no sentido anti-horário.
reorganiza as letras na string de acordo com esses ângulos, para que, quando as letras forem escritas nas entradas diferentes de zero da matriz, na ordem das colunas principais (para baixo e depois para o outro lado), o resultado esteja correto. Isso é feito por
Por exemplo, se a entrada for
'a'
a sequência não foi deslocada circularmente:A reorganização de acordo com os ângulos transforma isso em
de modo que
'u'
irá corretamente para a primeira entrada (em ordem de coluna maior) diferente de zero, que é (3,1) na notação de matriz;'t'
irá para (4,1),'s'
para (5,1);'v'
para (2,2) etc:fonte
Python 2 , 129 bytes
Experimente online!
fonte
R ,
139122 bytes-17 bytes graças a Giuseppe
Explicação:
Constrói uma caixa vazia de espaços
é um conjunto de índices para as posições das letras correspondentes a:
TIO
fonte
intToUtf8
esses bytes estranhos, mas se usar*
no lugar derep
, poderá salvar 2 bytes e 125 bytes-32
, por 122 bytes . Você pode gerá-los você mesmo usandocat(intToUtf8(bytes))
.intToUtf8
muitas versões da função abertas de uma só vez, eu acho. Nice salva todos roundthough, obrigadoJavaScript (Node.js) ,
121119 bytesGuardado 2 bytes graças a @tsh
Experimente online!
Quão?
Buffer
"H"
"B"
fonte
APL + WIN, 72 bytes
Solicita caracteres
Experimente online Coutesy of Dyalog Classic
fonte
R ,
218197 bytes-21 bytes graças a Giuseppe
Experimente online!
Ungolfed:
Criou o vetor de letra girada e usa-o
cat
para preencher a borda da tigela com esse vetor.fonte
which
e usarl>=t
diretamente o índice, que valia 12 bytes.[
com~
. Esta é uma ótima resposta; Eu estava gastando cerca de 250 bytes nas minhas primeiras tentativas com uma abordagem muito mais complexa.Java 11, 134 bytes
Experimente online.
Versão de 136 bytes com potencial para jogar golfe?
Experimente online.
Explicação (da primeira resposta)
fonte
i-47
\n
). Então, se eu uso não imprimíveis e 3x\n
comi
ou dígitos-1 comi-47
, ambos são os mesmos 134 bytes de contagem. E, infelizmente, não posso ter um imprimível0
, caso contrário, poderia ter usado 2,0,5,9 em vez disso ei+1
economizado 1 byte no total.Wolfram Language (Mathematica) , 258 bytes
Experimente online!
fonte
Haskell, 127 bytes
Experimente online!
Cada caractere na cadeia codificada é decodificado por função
?
em uma cadeia:fonte
Kotlin ,
148146145 bytesParênteses extras removidos para -2
Sequência bruta substituída por -1
Experimente online!
fonte
C # (compilador interativo do Visual C #) ,
126118 bytesEconomizou 8 bytes graças a @someone. Sim, esse é realmente o nome de usuário dele.
Experimente online!
fonte
Consulta TSQL, 238 bytes
O link de teste para esta resposta quebrou as quebras de linha e excluiu os espaços. Substituí os espaços por ponto e substitui char (13) por char (13) + char (10) para mostrar um resultado legível.
Experimente online
Ungolfed:
fonte
PHP ,
236229226 bytesExperimente online!
Pré-golfe:
Explicação:
Usando
ord
convertemos para um número inteiro entre 0 e 255. A é 65 e Z é 90.Usando esse conhecimento, pegamos a entrada e a reduzimos em 65 para termos um valor de ajuste.
Nós iteramos sobre todos os caracteres, os chamamos
ord
, reduzimos em 65, aumentamos em nosso valor de ajuste. Usando o módulo, retornamos a 0 se excederem 26.Em seguida, aumentamos em 65 novamente e os convertemos novamente em letras com
chr
.Infelizmente, php: // stdin só pode ser interogitado uma vez, portanto, precisamos passar a entrada para a função em nosso loop, impedindo-nos de salvar bytes
use($a)
e ter que declarar uma variável fora da função para impedir o uso correto do<?=
método echo - temos que embrulhar tudo em um ternário gigante.fonte
C (GCC) 286 bytes
Não é exatamente o menor golfe, mas funciona
Experimente online
fonte
Vermelho , 139 bytes
Experimente online!
Uma solução realmente ingênua.
fonte
Perl 5
-p
, 110 bytesExperimente online!
fonte
Javascript (V8), 316 bytes
Experimente online
Primeira vez tentando código de golfe. Aprecie todas as dicas / feedback.
Código original antes da minificação:
fonte
APL (Dyalog Classic) , 50 bytes
Experimente online!
fonte
C (gcc) ,
200198197 bytes-3 bytes graças ao ceilingcat.
Experimente online!
fonte
PHP , 131 bytes
Experimente online!
fonte