Uma zelosa “raposa marrom rápida” “pulou” ao longo da espiral Groovy

12

Introdução

Escreva um programa para produzir a espiral de saída do famoso pangram seguindo as regras dadas.

Desafio

Um pangram é uma frase que usa todas as letras de um determinado alfabeto pelo menos uma vez. Um dos mais famosos pangramas é o amplamente utilizado no visualizador de fontes do Windows, a saber " A rápida raposa marrom pula sobre o cachorro preguiçoso ". O desafio é gerar uma espiral com base neste texto.

Sua tarefa gera este texto exato:

heeeeellllllllllllazzzzzzzzzzz
hummmmmmmmmmmmmppppppppppppppy
hubrrrrrrrrrrrrrrrrrrooooooosy
hukyddddoooooooooooooooggggwsy
hukyveeeeerrrrrrrrrrrrrrrrtwsy
hukyvxjjjjjjjjjjuuuuuuuuuttwsy
hukyvxkbbrrrrrrrrrrrrrrrmttwsy
hukyvxkogggggggttttttttomttwsy
tukyvokoellllllllllllahomttwsy
tukyvokoeovvvvvvvvvvvzhomttwsy
tukyvocoeoummmmmmmmmezhomttwsy
tukyvocoeoufooooooopezhomttwsy
tukyvocohoufroooooxpezhomttwsy
tukyvoiohoufrquuuwxpezhomttwsy
tucyvoiohoufbqttiwxpezhomttwsy
tucyvoiohoufbeehiwxprzhomttwsy
tucyvoiohoufkccciwxprzeomttwsy
tjiyvoidhounnnnnnwxprzeomttwsy
tjiyvoidhojjjjjjjjxprzeomttwsy
tjiyvoidhssssssssssprzeopttwsy
tjiyvoidttttttttttttrzeopttwsy
tjiyvoiyyyyyyyyyyyyyyzqopttwoy
tjiyvouuuuuuuuuuuuuuuuqwpttwoy
tjiyvffffnnnnnnnnnnnnnnwpttwoy
tjiyossssssssssssssssssspthwoy
tjizzzzalllllllllllleeeeehhwoy
tjuuqqqqqqqqqqqqqqqqqeeeeehnod
txxxxxoooooooooooooooffffffnod
reeeeevvvvvvvvvvvvvvvvvvvvvvod
       gggggggoooooooooooooood

Aqui está como é gerado,

  • Havia uma raposa zelosa que gostou do pangram "A raposa marrom rápida salta sobre o cachorro preguiçoso". Um dia ele estava no centro de uma espiral externa e decidiu pular nela e pintar.
  • Ele gostaria de examinar o pangram do começo ao fim e, se uma letra for a n-ésima letra do alfabeto, ele gostaria de pintá-lo várias vezes.
  • No entanto, a raposa não era muito boa em fazer curvas nas esquinas; portanto, ao chegar a cada esquina, ele também teve que parar e passar para a próxima letra.
  • Ele também decidiu repetir o pangram três vezes para enfatizar que ele é a raposa marrom rápida.
  • Seu trabalho é mostrar como seria a espiral depois que a raposa pintasse todas essas letras.

(Versão simples sem contar histórias)

  • O famoso pangram "A rápida raposa marrom pula sobre o cachorro preguiçoso" é repetido três vezes, com os espaços removidos e todas as letras em minúsculas, para gerar

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • A espiral começa no centro e começa com a letra "t", começa indo para a direita e vai para fora no sentido horário. Se o caractere atual for a n-ésima letra do alfabeto, ele passará para o próximo caractere sempre que

    • a espiral atinge um canto, ou
    • as letras atuais são impressas exatamente n vezes.

Para melhor ilustrá-lo, explicarei como é gerada a espiral relacionada às três primeiras palavras "thequickbrown".

 rooooo
 rquuuw
 bqttiw
 beehiw
 kccciw
nnnnnnw

A raposa parte de "t", vira à direita, alcança o 1º canto, pinta com o "t" e depois muda para "h" e desce, atinge o 2º canto, alterna para "e" e vai para a esquerda, atinge a A 3ª esquina muda para "q" e sobe, alcança a 4ª esquina, muda para "u" e vira para a direita, alcança uma esquina e muda para "i", desce, alcança uma esquina e muda para "c", continua esquerda, pinta com sucesso 3 "c" s antes de chegar à próxima esquina , muda para "k" e segue para a esquerda , alcança um canto imediatamente, muda para "b" e sobe, pinta 2 "b" s antes de chegar na próxima esquina, muda para "r"e continua para cima , chega a um canto e muda para "o", vai para a direita e depois para "w", para baixo, "n", para a esquerda.

Especificações

  • Você pode usar uma entrada opcional que contenha qualquer forma padrão da sequência

    thequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydogthequickbrownfoxjumpsoverthelazydog
    
  • Sua saída deve ser formatada como uma sequência e deve ir para STDOUT em vez de arquivos ou STDERR, com as novas linhas colocadas corretamente. Dirigir e seguir linhas vazias não importam. Os espaços de cabeçalho e final em cada linha são permitidos, mas precisam ser consistentes. Portanto, se você adicionar 5 espaços antes de uma linha do texto fornecido, precisará adicionar exatamente 5 espaços antes de cada linha para que a espiral pareça a mesma.

  • Isso é , o menor número de bytes vence.

  • Como de costume, as brechas padrão se aplicam aqui.


As explicações são bem-vindas, embora não sejam necessárias.

Título editado para torná-lo um pangram por comentário por caird coinheringaahing.

O cachorro preguiçoso é muito preguiçoso para aparecer na história.

Meu objetivo é criar um desafio de cadeia de caracteres em que a letra para saída não possa ser calculada por funções simples das coordenadas.

Weijun Zhou
fonte
2
É uma pena que o título não é um pangram
Caird coinheringaahing
@cairdcoinheringaahing Bom ponto, vou tentar criar um. Alguma sugestão?
Weijun Zhou 07/02
4
@cairdcoinheringaahing Atualizado
Weijun Zhou
Ponto menor: o 'h' no primeiro 'the' não deve ser repetido duas vezes, não o 't'?
usar o seguinte código
@ mudkip201 O canto é pintado com a letra original antes de passar para o próximo caractere. Talvez eu deva esclarecer.
Weijun Zhou 08/02

Respostas:

5

Stax , 35 34 33 32 bytes

é╛îá%ⁿ┌○iê}→Ug=╩◙╘Ç⌐)QX↑L╓₧╗▌╧▬q

Execute e depure on-line

Stax é um idioma em que trabalho há cerca de 6 meses. Este é o primeiro golfe público com ele. Vamos ao que interessa.

O Stax normalmente é gravado no conjunto de caracteres ASCII imprimíveis. Esse envio de 34 bytes é compactado em uma variante do conjunto de caracteres CP437. A representação ascii correspondente é

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr

O Stax é um idioma baseado em pilha, mas possui duas pilhas de dados, "principal" e "entrada". A maioria das operações usa a pilha principal, mas a entrada é iniciada na pilha de entrada. As instruções Stax são principalmente sequências ascii de um ou dois caracteres. A maioria deles está sobrecarregada, o que significa que seu comportamento é determinado pelos poucos valores mais altos na (s) pilha (s).

Em um nível alto, esse programa cria uma grade anexando repetidamente seqüências de caracteres à última linha. Quando a última linha é preenchida, ela gira a grade no sentido horário. No final, espelha a grade horizontalmente. Mais detalhadamente, o programa funciona assim.

't],{]_96-*~cHT,+nh%^(XUs&xH{rM}MF|<mr
't]                                         ["t"]
   ,                                        Pop from input, push to main ("thequick...")
    {                            F          For each character in input, execute block...
     ]_96-*                                 Produce string using character appropriate
                                                number of times (a=1, b=2, etc)
           ~                                Pop from main, push to input for use later
            cH                              Copy last row from grid.
              T                             Right-trim whitespace
               ,+                           Pop from input stack and append
                 nh%                        Get the width of the first row of the grid
                    ^                       Add 1
                     (                      Right-pad/truncate string to this length
                      X                     Store in the x register
                       Us&                  Overwrite last row of the grid with new value.
                          xH                Get the last element from x.
                                                Basically, the lower right corner.
                             {  }M         Conditionally execute block.  This will happen 
                                                when the bottom right corner isn't a space.
                              rM            Reverse and transpose (aka rotate clockwise)
                                  |<        Left-justify grid; give all rows equal size.
                                     m      For each row, execute the rest of the program
                                               and then print the result to output
                                      r     Reverse the row
recursivo
fonte
Uau, estou realmente surpreso que o desafio tenha sido a primeira aparição pública no golfe para um idioma de golfe. Muito obrigado pelo seu apoio! Interessado em idioma do mês? Espero ver mais usuários usá-lo e que ele apareça na lista de candidatos em breve!
Weijun Zhou
@WeijunZhou: Você quer dizer isso ? Eu não sabia que era uma coisa até agora. Eu não me importaria de uma indicação. Parece que pode ser mais adequado para idiomas mais estabelecidos, mas não me oponho.
recursivo
Sim. Posso indicá-lo quando estiver melhor estabelecido, como você diz. Espero que não demore.
Weijun Zhou 08/02
Como "o espaço de cabeçalho em cada linha não importa, desde que sejam consistentes", você pode salvar outro byte, se desejar.
Weijun Zhou 08/02
1
Acabei de fazer uma submissão usando o Stax. Você pode dar conselhos sobre isso, se desejar. Edit: Que coincidência. Vou tentar aprender com a sua submissão.
Weijun Zhou
11

Carvão , 66 40 36 bytes

≔²ηFS«F¬η«¶↷⊞υη≔⊕÷Lυ²η¶»F⊕⌕βι¿η«≦⊖ηι

Experimente online! Link é a versão detalhada do código. Editar: salvou 16 bytes usando o texto como entrada. Explicação:

≔²η

Comece com 2 ts por algum motivo.

FS«

Faça um loop sobre todas as letras no pangram.

F¬η«

Já chegamos a um canto?

Mova para baixo (ou qualquer que seja a próxima direção) uma linha.

Gire a direção da impressão 90 ° no sentido horário.

⊞υη≔⊕÷Lυ²η

Calcule o comprimento do próximo lado.

¶»

Termine de fixar a posição do cursor. (O carvão teria preferido que o lado terminasse logo antes da esquina, para que você girasse na esquina.)

F⊕⌕βι

Faça um loop tantas vezes quanto a posição da letra atual no alfabeto.

¿η«

Se não chegamos à esquina,

≦⊖ηι

Reduza a contagem e imprima a letra atual.

Neil
fonte
Obrigado. Ótimo trabalho e bem explicado. Um pequeno erro de digitação: há vezes -> três vezes.
Weijun Zhou 08/02
Esta versão de 43 bytes também é aceitável de acordo com as especificações. tio.run/##rY7NTsMwEITPzlNYPW2kcumVExJCikRRhLgBh9Rx4oV4nfon/…
Weijun Zhou
1
@ WeijunZhou Obrigado, eu não percebi essa cláusula na pergunta anterior.
Neil
2

Rubi , 217 212 209 208 bytes

->s{s+=' '*8
x=0
a=[""]*30
i=14
a[i]=?t
l=->{a[i]=s[x]+a[i]}
r=->{a[i]+=s[x]}
(0..58).map{|g|c=0
(0..g/2).map{c>s[x].ord-97&&(x+=1;c=0)
c+=1
eval %w{r i+=1;r l i-=1;l}[g%4]+"[]"}
x+=1}
a[-1].slice!0
$><<a*$/}

Experimente online!

Gasta um bom tempo gerenciando indicadores, para que haja espaço para mais golfe.

-5 bytes: triplique o pangram antes de inserir. Obrigado a Weijun Zhou .

-3 bytes: preencha a sequência de entrada e apare a última perna, em vez de gerar a última perna do zero.

-1 bytes: use em &&vez de um operador ternário com um valor descartável.

Explicação:

->s{
  s += " " * 8                             # These spaces will show on the bottom row
  x = 0                                    # x is a pointer into s
  a = [""] * 30                            # a is an array of row strings
  i = 14                                   # i is a pointer into a
  a[i] = ?t                                # "Starts with two t's for some reason"
  l = ->{ a[i] = s[x]+a[i] }               # lambda to prepend char x to row i
  r = ->{ a[i] += s[x] }                   # lambda to append char x to row i
  (0..57).map{|g|                          # There are 58 "legs" to the spiral
    c = 0                                  # c is the print count of s[x]
    (0..g/2).map{                          # Leg g has g/2+1 characters
      c > s[x].ord-97 && (x+=1;c=0)        # Possibly switch to next letter
      c += 1
      eval %w{r i+=1;r l i-=1;l}[g%4]+"[]" # Call the appropriate lambda
    }
    x += 1                                 # Definitely switch to next letter
  }
  a[-1].slice!0                            # Remove the first char from the bottom row
  $> << a*$/                               # Join with newlines and print
}
benj2240
fonte
1
Bom envio e claramente explicado. Eu aprecio o uso de re llambdas. Com base nas respostas atuais a última etapa parece ser um criador de problemas, embora não era quando eu escrevi o meu C trecho para gerar a saída de amostra ...
Weijun Zhou
1
Parece que você pode salvar o s*=3total e também omitir o 0no ?:operador. tio.run/…
Weijun Zhou
1
@ WeijunZhou Ahh, obrigado pela dica. Eu preciso disso 0, porém, ou o Ruby puxa c+=1a linha a partir da próxima linha e a executa apenas na maioria das vezes. E bom desafio!
benj2240
Você está certo. Eu não parecia cuidadoso o suficiente. Obrigado pelo seu apreço. Fico feliz que você tenha gostado.
Weijun Zhou 08/02