Imagine que uma grade retangular de |
caracteres represente as cordas esticadas de um tear ( a urdidura ) em que outros fios ( a trama ), que iremos representar como -
, podem ser tecidos.
Aqui está a urdidura não tecida de um tear 7 × 4:
|||||||
|||||||
|||||||
|||||||
Existem várias maneiras pelas quais a trama pode ser tecida na urdidura, sendo a mais simples a trama simples .
Na primeira linha de uma trama simples, a trama começa acima da primeira corda de urdidura, fica abaixo da segunda corda, depois acima da terceira corda, depois abaixo da quarta e assim por diante.
A segunda linha de trama é idêntica à primeira, mas deslocada para a direita por uma corda de distorção;
Em nosso tear 7 × 4, a trama simples é assim:
-|-|-|-
|-|-|-|
-|-|-|-
|-|-|-|
Podemos descrever a trama simples dizendo que a trama ultrapassa a dobra 1 vez e depois menos de 1 vez, e cada linha subseqüente é deslocada 1 corda para a direita.
Uma trama generalizada pode ser descrita fazendo a trama ultrapassar os tempos de urdidura v , depois os tempos u , com cada linha subsequente deslocada por s strings para a direita. (Todos os valores são inteiros, s pode ser 0 ou negativo, u e v devem não ser negativos.)
Um tear 7 × 4 com v = 1 , u = 2 , s = 2 , um tipo de tecido de sarja :
-||-||-
||-||-|
|-||-||
-||-||-
Desafio
Sua tarefa é escrever o programa mais curto (em bytes) que produz um padrão entrelaçado de barras e traços, dados v , u , s , a largura e altura do tear e o deslocamento inicial .
O deslocamento inicial é o número de strings que a primeira linha da trama é deslocada para a direita (0 nos exemplos acima). Cada linha subseqüente é deslocada por mais s strings.
Seu programa deve receber esses 6 números em um formato fácil de usar (stdin, uma chamada de função etc.) e gerar a grade de barras e retângulos entrelaçados para stdout. Você pode assumir que todas as entradas são válidas. (Todos os valores são números inteiros, a largura e a altura devem ser positivas, o deslocamento inicial pode ser qualquer coisa.)
Exemplos
largura = 5, altura = 4, deslocamento inicial = 0, v = 1, u = 3, s = -2:
-|||-
||-||
-|||-
||-||
largura = 5, altura = 4, deslocamento inicial = 3, v = 1, u = 3, s = -2:
|||-|
|-|||
|||-|
|-|||
largura = 5, altura = 4, deslocamento inicial = 1, v = 1, u = 1, s = 0:
|-|-|
|-|-|
|-|-|
|-|-|
largura = 5, altura = 4, deslocamento inicial = 0, v = 1, u = 0, s = 0:
-----
-----
-----
-----
Notas
- O padrão sempre começa com a trama sobre a urdidura no canto superior esquerdo da grade (a menos que seja inicialmente alterado).
- Todas as linhas da trama vêm da esquerda. Eles não espiral como este .
- u + v não é necessariamente um múltiplo da largura da grade.
- u e v podem não ser ambos 0
%(u+v)
. Nesse caso, estou apenas começando no índice0
, então tenhow
caracteres restantes na string.JavaScript (ES 6) 128
Teste
fonte
Python, 92 bytes
Hmm ... Tão tentado a aprender rubi agora.
Entrada atribuindo uma variável de cadeia de caracteres neste formato: "largura, altura, deslocamento inicial, v, u, s".
Cole antes do programa:
fonte
while h
. Estou tendo uma briga extra.JavaScript (ES6), 111 bytes
Uma abordagem ES6 ligeiramente diferente, usando o Array.from funcional.
f
recebe argumentos(w,h,i,v,u,s)
e retorna uma string. Novas linhas adicionadas ao código e literal nova linha na string substituídas por\n
para maior clareza; nem refletido na contagem de bytes.Uso
Versão ungolfed com explicação
Eu salvei alguns bytes criando um alias para Array, que não é refletido na versão não destruída.
fonte
C, 357 bytes
"É mais confortável do que parece." "Teria que ser." - Gia e Eidon (ninguém vai conseguir essa referência. Dica: "Tapete de tecer")
Então, eu estou trabalhando nisso há cerca de cinco horas e desisto. Não tenho ideia de como fazer esse código funcionar. Ele continua voltando para trás após a primeira linha e depois fica totalmente errado (7 4 0 2 2 1).
Aqui está a versão mais simples que você pode ler com mais facilidade. Tudo o que faço é recuperar a entrada, criar a matriz de modelos e imprimir nos loops.
Você pode testá-lo facilmente aqui: http://www.compileonline.com/compile_c_online.php usando "7 4 0 1 1 1" na caixa de entrada STDIN na parte inferior. Comece a editar os números e você verá os problemas.
Desculpe, não consegui encontrar uma solução funcional; Eu estou me odiando por isso. Gastei muito tempo para não enviá-lo para que alguém conserte.
Eu uso este printf há algum tempo para separar ainda mais a linha superior (fácil) do restante deles (as linhas com problema):
printf("%c",g[i?abs(t+f+j)%l:abs(t+j)%l]);
fonte
for(i=0;i++<h;)
? Mesmo truque para o segundo loop for? Ele salva apenas um caractere por loop.++i
? Isso é apenas um tiro no escuro.Haskell, 126 bytes
fonte
f w h i v u s
para(w?h)i v u s
. Uma função infix