Veja a seguinte string. Observe um padrão?
ABEFNOPEFGH DC GQI MHRJ LKJI SK DTL PORRA BAZYXWV N EO DP CQ BAZYXWVUTSR
Como alguns devem ter notado, é basicamente uma espiral do alfabeto, onde as distâncias entre linhas / colunas aumentam gradualmente em 1 espaço / nova linha.
Definição rigorosa
- Vamos ter um contador c , que é inicialmente 0.
- Nós escrevemos a primeira c + 1 letras do alfabeto da esquerda para a direita:
A
. Em seguida, de cima para baixo a próxima (c + 1) (c + 2) / 2 letras (ADD
B
):AB
.Da esquerda para a direita, o próximo (c + 1) (c + 2) / 2 (adicionar
C
):AB C
E de baixo para cima, as próximas c + 1 letras (adicionar
D
):AB DC
Atingiu o final do ciclo. Portanto, vamos incrementar c (que se torna 1). Em seguida, ele começa a partir do primeiro passo, a única diferença é que, em vez de usar as primeiras letras c + 1 do alfabeto, usamos as próximas letras c + 1 , começando no último elemento desse ciclo (
D
neste caso, então continuamos comEFG...
). QuandoZ
é atingido, volta a partir deA
.
Tarefa
Dado um número inteiro N (que é positivo para indexação 1 ou não negativo para indexação 0), produz os primeiros N ciclos da espiral.
Regras
Você pode usar o alfabeto minúsculo ou maiúsculo, mas sua escolha deve ser consistente (use apenas um deles, a mistura não é permitida).
Você pode obter entrada e fornecer saída através de qualquer um dos métodos padrão , em qualquer linguagem de programação , observando que essas brechas são proibidas por padrão.
Formatos de saída aceitáveis: sequência multilinha, uma lista de sequências representando linhas, uma lista contendo várias listas de caracteres, cada uma representando uma linha ou qualquer outra coisa que você achar adequado. Caso você não escolha o primeiro formato, seria bom incluir uma versão bonita do seu código.
Isso é código-golfe , portanto o código mais curto em bytes (em cada idioma) que atende aos requisitos vence!
Casos de teste
O número inteiro de entrada será separado por sua saída correspondente por meio de uma nova linha e os testes serão separados usando traços. Observe que estes são indexados em 1.
1 AB DC -------- 2 ABEF DC G MH LKJI -------- 3 ABEFNOP DC GQ MHR LKJI S DT CU BAZYXWV ------- 4 ABEFNOPEFGH DC GQI MHRJ LKJI SK DTL PORRA BAZYXWV N EO DP CQ BAZYXWVUTSR ------- 5 ABEFNOPEFGHFGHIJ DC GQIK MHRJL LKJI SKM DTLN CUMO BAZYXWV NP EOQ DPR CQS BAZYXWVUTSR T RU QV PW BOI NMLKJIHGFEDCBAZY ------ 6 ABEFNOPEFGHFGHIJSTUVWX DC GQIKY MHRJLZ LKJI SKMA DTLNB CUMOC BAZYXWV NPD EOQE DPRF CQSG BAZYXWVUTSR TH RUI QVJ PWK OXL NMLKJIHGFEDCBAZY M SN RO QP PQ OU NMLKJIHGFEDCBAZYXWVUTS
Respostas:
Carvão , 31 bytes
Experimente online! Link é a versão detalhada do código. Nota: O deverbosifier gera um separador à direita por algum motivo. Explicação:
Desenhe caixas na ordem inversa de tamanho (maior para o menor).
Calcule o tamanho da caixa.
Desenhe a borda da caixa usando um alfabeto girado.
Calcule a letra que apareceria no canto superior esquerdo da caixa (indexado 0).
fonte
Python 2 , 176 bytes
Experimente online!
Explicação
Construímos uma matriz vazia de espaços do tamanho certo, depois movemos sobre ela assim, começando no canto superior esquerdo:
1 passo →, 1 passo ↓, 1 passo ←, 1 passo ↑
3 passos →, 3 passos ↓, 3 passos ←, 3 passos ↑
6 passos →, 6 passos ↓, 6 passos ←, 6 passos ↑
10 passos →, 10 passos ↓, 10 passos ←, 10 passos ↑
...
Sempre que encontramos uma célula em branco, colocamos uma letra lá e alternamos para a próxima letra do alfabeto.
No código,
s%4
é a direção (→ ↓ ← ↑), e pisamos isso várias vezes:Oportunidades de golfe
Existe um caminho mais curto para mapear
s%4
a1,0,-1,0
queabs(2-s%4)-1
?Existe um caminho mais curto para mapear
s%4
a0,1,0,-1
ques%2-s%4/3*2
?Créditos
fonte
21/(s%4+3)%3-1
:s%2-2*(s%4>2)
( 179 bytes ). Ainda pode ser jogávelC,
305281 bytesGraças a @Mr. Xcoder para salvar quatro bytes!
Experimente online!
fonte
#define
forfor(
(que realmente salva bytes). +1 de mim. :)Python 2 ,
262260254245 bytesExperimente online!
Novo método com mais matemática!
Retorna uma lista de listas de caracteres.
Versão antiga:
Python 2 ,
322321308298 bytesExperimente online!
fonte
.49
suficiente o suficiente nesse caso, ou falha em entradas muito grandes?i<j
, já que você a usa quatro vezes?+1==1+
do meu método anteriorPerl 5, 177 +2 (-nl) = 179 bytes
2 bytes salvos graças ao Xcali
Experimente online
fonte
-1
vez de$#O
. Também usando$,
em vez de$n
vai deixar você remover o espaço antesfor
em$_.=$"x$n for@O
s/ (?=\S)/n/e
as/.*\K /n/e
APL (Dyalog Classic) , 47 bytes
Experimente online!
fonte