Assim diz o pastor


23

Estou cansado, mas não consigo adormecer. Ajude-me a contar ovelhas.

Dada a entrada N (número inteiro positivo), faça N ovelhas saltarem sobre uma cerca ascii, como na amostra abaixo. Somente um quadro deve ser exibido por vez:

o |-|
──|-|──  0

 o|-|
──|-|──  0

   o
  |-|
──|-|──  0

  |-|o
──|-|──  0

  |-| o
──|-|──  0

o |-|
──|-|──  1

 o|-|
──|-|──  1

   o
  |-|
──|-|──  1

A contagem deve ser mantida no lado inferior direito do 'solo'. O espaço em branco à direita e as novas linhas são permitidos. Se o seu idioma de escolha tiver dificuldade em limpar a tela para cada quadro, você poderá adicionar novas linhas suficientes para limpar a tela - indique quantas linhas você adiciona para isso na sua resposta. O programa deve terminar quando a ovelha N'th estiver no quinto floortile.

Preciso acordar cedo amanhã, para ganhar o menor código em bytes. Envie uma função ou programa completo. Aplicam-se brechas padrão.


6
1. Por favor, me dói quando as pessoas usam justificativas para códigos curtos ("Preciso acordar cedo amanhã") 2. Quanto espaço em branco colocamos entre os quadros? Parece uma nova linha, mas você pode indicar isso claramente.
Rɪᴋᴇʀ

12
1) tome aspirina 2) Pode haver apenas 1 quadro na tela. Esses quadros aqui devem demonstrar cada estado individualmente e NÃO devem estar visíveis em uma tela simultaneamente.
steenbergh

3
Muitos idiomas não têm a opção de limpar a exibição; nesses casos, qual saída eles devem fornecer?
Jonathan Allan

6
"adicione novas linhas suficientes para limpar a tela". Isso não depende do tamanho da janela de saída nem da resolução da tela?
Emigna

3
De acordo com o seu exemplo, N=3o último quadro conterá uma ovelha na extremidade direita e o contador ainda dirá 2. Isso está correto?
Luis Mendo

Respostas:


15

MATL , 60 56 53 bytes

:"@qXJx[HKCbO]"7Z"'  |-|  'v'o'@('--|-|--  '  JVhXxXD

A animação com o código acima é executada muito rapidamente. A versão a seguir inclui uma pausa para tornar a animação mais lenta e, portanto, mais fácil de ver (não exigida pelo desafio), ao custo de mais 4 bytes:

:"@qXJx[HKCbO]"7Z"'  |-|  'v'o'@('--|-|--  '  JVhXxXD.2Y.

Experimente no MATL Online! O intérprete é uma versão beta; atualize a página se não funcionar.

Ou veja uma gravação do compilador offline:

insira a descrição da imagem aqui

Explicação

:"              % Input N implicitly. Repeat N times
  @q            %   Push iteration index minus 1, that is, from 0 to N-1. This
                %   are the numbers of sheep
  XJx           %   Copy into clipboard J and delete
  [HKCbO]       %   Push array [2 4 7 -2 0]
  "             %   For each value in that array. This loops generates the 5
                %   frames for each number of sheep
    7Z"         %     Push string of 7 spaces
    '  |-|  '   %     Push this string
    v           %     Concatenate vertically. This gives a 2x7 char array
                %     with the upper part of the frame, except the 'o',
                %     which will be now placed in a varying position 
    'o'         %     Push string 'o'
    @           %     Push loop variable, that is, 2, 4, 7, -2 or 0
    (           %     Write 'o' into that position of the 2x7 char array.
                %     The position is interpreated linearly, that is, a single
                %     number is used as index into the 2D array in column-major
                %     order (down, then across). So index 2 is lower-left corner,
                %     index 4 is to the right of that etc. Indexing is
                %     semi-modular (modular for non-positive values). So 0 is
                %     the lower-right corner, and -2 is to the left of that
    '--|-|--  ' %     Push this string
    JV          %     Push current number of sheep converted to string
    h           %     Concatenate horizontally
    Xx          %     Clear screen
    XD          %     Display all stack contents
    .2Y.        %     Pause for 0.2 seconds (optional)
                %   End implicitly
                % End implicitly

6

JavaScript (ES6), 120 124 bytes

f=(n,m=`   2
43|-|10
──|-|── `,s=0)=>n?alert(m.replace(s%5,'o').replace(/\d/g,' ')+' '+(n-1),(++s%5?f(n,m,s):f(n-1,m,0))):''

O último quadro calculado é exibido primeiro. Graças a isso, o número do salto é n-1
In alert, os caracteres têm largura diferente, então parece que ele está quebrado.


Resposta anterior:

120 bytes, o número do salto está errado porque inicia em 1 em vez de 0

f=(n,m=`   2
43|-|10
──|-|── `,s=0)=>n?alert(m.replace(s%5,'o').replace(/\d/g,' ')+' '+n,(++s%5?f(n,m,s):f(n-1,m,0))):''

@LuisMendo Atualizei o contador para começar em 0. Para os bares, é graças à fonte usada por alert. Eu tenho o mesmo resultado que o chrome com edge, e é pior com o firefox.
Hedi

6

JavaScript (ES6), 144 142 bytes

Limpa a saída e aguarda 300ms entre cada quadro:

n=>(F=j=>((c=console).clear(),c.log(`   2
01|-|34
──|-|── `.replace(/\d/g,i=>(j-i)%5?' ':'o')+(j/5|0)),++j<n*5&&setTimeout(`F(${j})`,300)))(0)

Você pode testá-lo aqui (certifique-se de abrir o console).


Este não parece incrementar o contador (a partir 4de 5) após a última ovelha saltou o muro ...
ʰᵈˑ

@ ʰᵈˑ - Eu acho que esse é o comportamento esperado. (Veja a pergunta de Luis Mendo nos comentários do desafio.)
Arnauld


4

Ruby, 83 bytes

->n{(n*5).times{|i|$><<"   c
  |-|  
ab|-|de  #{i/5}
".tr('abcde',' '*(i%5)+'o ')}}

Imprime em stdout. Saída separada por novas linhas. Reduzir a altura da tela para 3 torna visível apenas uma imagem por vez.


4

C #, 234 bytes

using C=System.Console;class P{static void Main(string[]a){for(int n=0;n-1+""!=a[0];++n){foreach(int p in new[]{5,6,3,10,11}){C.Clear();C.Write("    \n  |-|  \n──|-|── ".Remove(p,1).Insert(p,"o")+n);for(var w=3e7;w>0;--w);}}}}

À primeira vista, há alguns espaços em branco em torno de string[] argse para for (int. Int32.Parsepoderia ser int.Parse.
Yytsi

1
Você pode alterar o nome da classe de Programapenas Pou algo
Matias Cicero

1
stringpoderia ser var. O número inteiro no loop for pode ser inicializado ao mesmo tempo em que você analisa args[0]um número inteiro.
Yytsi 02/10/1916

Vejo você editar a contagem de bytes cada vez que ela é reduzida. No entanto, eu recomendo manter contagens de bytes em torno de idade (cruzado com uma linha), para acompanhar o progresso :)
Yytsi

Você só precisa ter uma função de modo de compilação para um Action<string[]>e você pode remover os suportes em torno do exterior para o laço então eu acredito que eu recebo 200 bytes:using C=System.Console;a=>{for(int n=0;n-1+""!=a[0];++n)foreach(int p in new[]{5,6,3,10,11}){C.Clear();C.Write(" \n |-| \n──|-|── ".Remove(p,1).Insert(p,"o")+n);for(var w=3e7;w>0;--w);}};
TheLethalCoder

3

PHP + JavaScript, 168 bytes

<?extract($_GET);$s="     ";$s[$f=++$f%5]=o;echo strtr("<pre>   C
AB|─|DE
──|─|── $c",EABCD,$s),($c+=!$f)<$n?"<script>location.href='s.php?n=$n&c=$c&f=$f'</script>":"";

Salve em arquivo s.php, ligue no navegador com s.php?n=<n>.

Chama a si próprio com novos parâmetros para cada quadro, sem demora.


Eu poderia economizar mais 5 com index.php; mas não quero ir tão longe.


Eu tentei executar isso no PHP 5 e 7, mas tudo que o Chrome me fornece é C AB|─|DE ──|─|── $c",EABCD,$s),($c+=!$f)<$n?".
214166Preço

@steenbergh Você short_open_tagdesativou. Habilite-o (padrão) ou adicione php+ espaço depois <?.
Titus

Sim, é isso. Entendi agora.
213166

3

Tcl, 168 bytes

Versão usando tela com 10 linhas de altura. (Substitua o 7abaixo pela altura da tela em colunas menos quatro.)

set s {0 1 2 3 4 }
for {set n 0} {$n<$argv} {incr n} {foreach x $s {
puts [string repe \n 6][string map [split $s {}] [string map "$x o" {   2
01|-|34
--|-|--  }]]$n}}

Isso é muito rápido, então você pode adicionar uma pausa na linha dois:

Tcl, 177 bytes

set s {0 1 2 3 4 }
for {set n 0} {$n<$argv} {incr n} {foreach x $s {after 250
puts [string repe \n 6][string map [split $s {}] [string map "$x o" {   2
01|-|34
--|-|--  }]]$n}}

Ele funciona reutilizando a string na parte superior para duas coisas diferentes:

  • como uma lista para o loop interno (para exibir cada versão da ovelha + cerca)
  • como um mapeamento de dígito → espaço para remover dígitos do modelo de imagem de ovelha + cerca

O modelo em si é a imagem da string a ser exibida. Primeiro, mapeamos (substitui a string) o dígito da posição atual da ovelha (loop interno) para um 'o'. Em seguida, mapeamos os dígitos restantes para os espaços. Em seguida, imprimimos a sequência resultante.

(A string em si inicia após o último {na terceira linha e termina com o mais à esquerda} na última linha.)


3

QBasic, 110 bytes

INPUT n
FOR i=0TO 5*n-1
CLS
?
?"  |-|"
?"--|-|-- ";i\5
x=i MOD 5
LOCATE(x=2)+2,1+x-(x>1)+x\3
?"o"
SLEEP 1
NEXT

Loops sobre 5*ncarrapatos. A cada marca, limpa a tela, imprime a contagem de estilos e ovelhas e, em seguida, usa-a LOCATEpara imprimir ono local apropriado. Com xsendo o código de posição entre 0 e 4:

  • Linha: (x=2)+2
    • Se x=2for verdade, -1+2=1
    • Se x=2for falso, 0+2=2
  • Coluna: 1+x-(x>1)+x\3
    • Se xé 0ou 1, x>1é falso e x\3é 0: 1+x-0+0= 1ou2
    • Se xfor 2, x>1é verdadeiro e x\3é 0: 1+x-(-1)+0=4
    • Se xé 3ou 4, x>1é verdadeiro e x\3é 1: 1+x-(-1)+1= 6ou7

Finalmente, SLEEPpor 1 segundo e loop. Se você não se importa em pressionar Enter em todos os quadros, posso raspar dois bytes removendo o argumento para SLEEP.


3

PHP, 132 131 bytes

Edita após os comentários (obrigado!):

<?php for(;$i<$argv[1]*5;sleep(1),system(clear),$c="    
  |-|  
──|-|──  ".floor($i/5),$c[[5,6,3,10,11][$i++%5]]=o)echo$c;

Que é não destruído:

<?php

ini_set('error_reporting', '0');        # golfing precondition

for(; $i<$argv[1]*5;                    # repeat N times
  sleep(1),                             # sleep after iteration
  system(clear),                        # clear screen (linux only)
  $c = "    
  |-|  
──|-|──  " . floor($i / 5),             # define template
  $c[[5, 6, 3, 10, 11][$i++ % 5]] = o)  # replace with sheep (and finish "for" statement)
  echo $c;                              # output result

Postagem original

<?php $i=0;for(;;){system("clear");$c="  \n  |-|  \n──|-|──  ";$c[[3,4,1,8,9][$i%5]]='o';echo"  $c".floor($i++/5);sleep(1);}

Testado no ubuntu (não sei, se system("clear")funciona no windows)

Ungolfed:

<?php
$i = 0;
for(;;) {
  system("clear");
  $content = "  \n  |-|  \n──|-|──  ";
  $content[[3,4,1,8,9][$i%5]] = 'o';
  echo "  $content " . floor($i++/5);
  sleep(1);
}

1
Idk sobre o Windows, mas tenho certeza que clearnão precisa de aspas.
Titus

1
Pensando no Windows ... estava clsno DOS.
Titus

1
Remova os $i=0;avisos, normalmente não são exibidos no código golf (-5 bytes). Pelo mesmo motivo, você não precisa de aspas ao redor cleare o(-4 bytes). Substitua os \ns por novas linhas reais (-2 bytes). Como você possui apenas expressões, e não nenhuma instrução, você pode colocar tudo, exceto a última no seu forloop, permitindo remover os colchetes ( for(;;system(clear),$c=…)sleep(1);) (-2 bytes). E, finalmente, você esquece de adicionar a condição $i<$argv[0](+ 11 bytes).
Blackhole 02/10

Obrigado! Não recebi eco no loop. Mas a solução lançada está fazendo isso.
user470370

3

node.js + suspensão , 169 bytes

c='   2\n01|-|34\n──|-|──  '
for(i=0;i<process.argv[2]*5;require('sleep').sleep(1))console.log('\033[2J'+c.replace(i%5,'o').replace(/\d/g,' ')+Math.floor(i++/5))

Solução original

node.js, 146 142 185 bytes

Testado apenas com o terminal ubuntu (e agora com n ovelhas):

i=0
c='   2\n01|-|34\n──|-|──  '
setInterval(function(){console.log('\033[2J'+c.replace(i%5,'o').replace(/\d/g,' ')+Math.floor(i++/5))
if(process.argv[2]*5==i)process.exit()},9)

Bem, isso é um quadro a cada 9 ms. Uma versão mais relaxante para o sono (quadro a cada 1s):

i=0;setInterval(function(){console.log('\033[2J'+'   2\n01|-|34\n──|-|──  '.replace(i%5,'o').replace(/\d/g,' ')+Math.floor(i++/5))},1000)

E não destruído:

var i = 0;
setInterval(function(){
  console.log('\033[2J' + '   2\n01|-|34\n──|-|──  '.replace(i%5, 'o').replace(/\d/g, ' ') + Math.floor(i++/5));
}, 1000)

Na minha primeira solução, eu esqueci o parâmetro para ovinos N
user470370

2

05AB1E , 66 60 59 bytes

FNU5Fð4×N<i¨'oJ},N<iðë'o}ðNÉis}"|-|  "JN1›iR},…──|Â'-sððXJ,

Usos a codificação CP-1252 .

Explicação

Iteração refere-se à iteração interna (0 -> 4) da jornada das ovelhas.

Loops principais

F      # For N in range [0 .. input)
 NU    # Save N in variable X
 5F    # For N in range [0 .. 5)

Gerar linha superior

ð4×         # push 4 spaces
N<i    }    # if we're on the 2nd iteration
   ¨'oJ     # replace the last space with an "o"
,           # print row

Gerar linha do meio

N<iðë'o}     # push a space if we're on the 2nd iteration, else push "o"
ð            # push a space
NÉis}        # if we're on an odd numbered iteration, swap the stacks top 2 chars
"|-|  "      # push this string
J            # join the stack to one string
N1›iR}       # if we're on the any of the last 3 iterations, reverse the string
,            # print row

Gerar linha inferior

…──|  # push the string "──|"
     # push a reversed copy
'-s   # push "-" between the 2 strings on the stack
ðð    # push 2 spaces
X     # push the N we saved in the main loop (current sheep number)
J,    # join and print row

1

Geléia , 55 54 53 bytes

ị30214D¤“o    ”ṙ“   “
““|-|““
__|-|__  ”ż
×5Ḷµ:5ż@Ç€Y

TryItOnline

Imprime quadros separados por alimentações de linha.

Quão?

ị30214D¤“o    ”ṙ“   “
““|-|““
__|-|__  ”ż           - Link 1, build a frame without counts: frameNumber
       ¤              - nilad and link(s) as a nilad:
 30214                -     literal 30214 (a nilad)
      D               -     to decimal: [3,0,2,1,4]
ị                     - index into (1-based and modular, so frames go 4,3,0,2,1,4,...)
        “o    ”       - string "o    "
               ṙ      - rotated to the left by that number
                “   “ - the rest, except the last character, is:
““|-|““               -     an array of strings ["   ","\n","","|-|","","\n__|-|__  "]
__|-|__  ”            -     i.e. split where a sheep might go

          ż           - zip the sheep (the rotated "o    ") into that

×5Ḷµ:5ż@Ç€Y - Main link: nSheep
×5          - multiply by 5 -> nFrames
  Ḷ         - lowered range: [0,1,2,...nFrames-1]
   µ        - monadic chain separation
    :5      - integer division by 5 (vectorises): [5 zeros, 5 ones, ..., 5 (nSheep-1)s]
      ż@    - zip with reversed arguments
        ǀ  - call last link (1) as a monad for each (zip sheep numbers with frames)
          Y - join with line feeds (TODO: replace with future animate frames atom :p)

1

Python 2, 171 159 144 bytes, 163 151 136 caracteres

Solução usando uma função recursiva. Ligar como f (int)

EDITAR

-12 depois de reler os comentários e ver que a contagem não precisa aumentar quando a ovelha chegar ao fim do campo

-15 iterando diretamente a lista de índices e perdendo uma variável

def f(a,x=0):
 if a>0:
  for c in 5,6,3,10,11:
   b=list('    \n  |-|  \n──|-|──  ');b[c]='o';print"\n"*50+"".join(b)+(`x`)
  f(a-1,x+1)

Notas

Assume a codificação UTF-8

Usar - em vez de ─ (como na resposta @Luis MATL) reduziria a contagem de bytes em 8 para corresponder à contagem de caracteres e perderia a dependência UTF-8

50 novas linhas adicionadas - a saída fica na parte inferior do console (mais barata que importar e usar os.system ("clear") e funciona no Windows e Linux)

Versão com atraso de 1 segundo entre as saídas (170 bytes, 162 caracteres)

import time
def f(a,x=0):
 if a>0:
  for c in 5,6,3,10,11:
   b=list('    \n  |-|  \n──|-|──  ');b[c]='o';print"\n"*50+"".join(b)+(`x`);time.sleep(1)
  f(a-1,x+1)

1

Bash + utilitários padrão do Linux (339 bytes)

e(){ echo "$@";}
n(){ e -n "$@";}
r(){ [ $? -eq 0 ]&&s=o||s=" ";[ $1 ]&&n " $s "||n "$s";}
f(){ k=$(($1%5));n "  ";[ $k -eq 2 ];r .;e "  ";for i in 0 1;do [ $k -eq $i ];r;done;n "|-|";for i in 3 4;do [ $k -eq $i ];r;done;e;n "──|-|──";}
for l in `seq 1 $1`;do for z in `seq 0 4`;do clear;f $z;e "  $((l-1))";sleep 1;done;done
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.