Çobanı söyle


23

Yorgunum, ama uyuya kalmış görünemiyorum. Koyunları saymama yardım et.

Bir N girişi (pozitif tamsayı) verildiğinde, N koyunlarının aşağıdaki örnek gibi bir ascii çitin üzerinden atlamasını sağlayın. Aynı anda sadece bir kare gösterilmelidir:

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

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

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

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

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

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

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

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

Sayım, 'yerin' sağ alt tarafında tutulmalıdır. İzleyen ve önde gelen boşluk ve satırsonlarına izin verilir. Tercih ettiğiniz dil her bir çerçeve için ekranı temizlemekte zorlanıyorsa, ekranı temizlemek için yeterli sayıda yeni satır ekleyebilirsiniz - lütfen cevabınıza bunun için kaç satır eklediğinizi belirtin. Program, N'inci koyun beşinci katı üzerinde olduğunda sona ermelidir.

Yarın erken kalkmam gerekiyor, bayt cinsinden en kısa kod kazanıyor. Lütfen bir işlev gönderin veya programı tamamlayın. Standart boşluklar uygulanır.


6
1. Lütfen insanlar kısa kod için gerekçeleri kullandıklarında beni üzüyor (“yarın erken kalkmam gerekiyor”) 2. Çerçeveler arasına ne kadar boşluk koyarız? 1 newline gibi görünüyor, ancak açıkça belirtmek isteyebilirsiniz.
Rɪᴋᴇʀ

12
1) aspirin al 2) Ekranda sadece 1 kare olabilir. Buradaki kareler, her bir durumu ayrı ayrı göstermek içindir ve aynı anda 1 ekranda görünmemelidir.
steenbergh

3
Birçok dilde ekranı temizleme seçeneği yoktur, bu gibi durumlarda hangi çıktıyı sağlamalıdır?
Jonathan Allan,

6
msgstr "ekranı temizlemek için yeterli sayıda yeni satır ekle". Bu, çıktı penceresinin boyutuna ve ekran çözünürlüğüne bağlı değil mi?
Emigna

3
Örneğinize göre N=3, son kare sağ tarafta bir koyun içerecek ve sayaç yine de söyleyecektir 2. Bu doğru mu?
Luis Mendo

Yanıtlar:


15

MATL , 60 56 53 bayt

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

Yukarıdaki kod ile animasyon çok hızlı çalışır. Aşağıdaki sürüm, animasyonun yavaşlatılması ve böylece daha fazla 4 bayt karşılığında görmesi daha kolay (meydan okuma için zorunlu değildir) için bir duraklama içerir:

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

MATL Online'da deneyin ! Tercüman bir beta; işe yaramazsa sayfayı yenileyin.

Veya çevrimdışı derleyiciden bir kayıt görmek için:

görüntü tanımını buraya girin

açıklama

:"              % 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 bayt

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))):''

Hesaplanan son kare ilk önce gösteriliyor. Bu sayede atlama numarasın-1
yılında alerto kırık gibi görünüyor bu yüzden charaters farklı genişliğe sahip.


Önceki cevap:

120 bayt, atlama numarası yanlış çünkü 0 yerine 1 ile başlar

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 Sayacı 0'dan başlayacak şekilde güncelledim. Çubuklar için kullanılan font sayesinde alert. Kenarlı krom ile aynı sonuç var ve firefox ile daha kötü.
Hedi

6

JavaScript (ES6), 144 142 bayt

Çıktıyı temizler ve her kare arasında 300ms bekler:

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)

Burada test edebilirsiniz (konsolu açtığınızdan emin olun).


Bu (gelen sayacını artırmak için görünmüyor 4için 5son koyun çit ... atlamış sonra)
ʰᵈˑ

@ ʰᵈˑ - Bunun beklenen davranış olduğunu düşünüyorum. (Luis Mendo'nun sorusu üzerine yapılan yorumlara bakınız.)
Arnauld

Ah evet, bunu okumamıştım - başkası için yorum yapma bağlantısı
28

4

Ruby, 83 bayt

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

Stdout'a yazdırır. Çıktı yeni satırlarla ayrılmış. Ekran yüksekliğini 3'e düşürmek, bir seferde yalnızca bir görüntüyü görünür yapar.


4

C #, 234 Bayt

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);}}}}

İlk bakışta, etrafında döşeme bazı boşlukları var string[] argsve en for (int. Int32.Parseolabilir int.Parse.
Yytsi

1
Sen den sınıfının adını değiştirebilir Programlazım Pfalan
Matias Cicero

1
stringolabilir var. For döngüsündeki args[0]tamsayı, bir tamsayıya ayrıştırdığınız sırada başlatılabilir .
Yytsi

Bayt sayısını her düşürüldüğünde düzenlediğinizi görüyorum. Ancak, ilerlemeyi takip etmek için eski bayt sayımlarını (bir çizgiyle çarpı
işareti) korumayı öneririm

Sadece bir derleme işlevine sahip olmanız gerekir Action<string[]>ve döngü için dıştaki köşeli ayraçları çıkarabilirsiniz, böylece 200 bayt alacağımı düşünüyorum: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 bayt

<?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>":"";

Dosyaya kaydet s.php , tarayıcı ile ara s.php?n=<n>.

Gecikme olmadan her kare için yeni parametrelerle kendini çağırır.


İle 5 tane daha kazanabilirim index.php; ama o kadar ileri gitmek istemiyorum.


Bunu PHP 5 ve 7'de çalıştırmayı denedim, ancak tüm Chrome bana veriyor C AB|─|DE ──|─|── $c",EABCD,$s),($c+=!$f)<$n?".
steenbergh

@steenbergh Sen short_open_tagdevre dışı bıraktın . Etkinleştir (varsayılan) veya phpsonra + boşluk ekle <?.
Titus

Evet, işte bu. Şimdi çalışıyor.
steenbergh

3

Tcl, 168 bayt

10 satır yüksek ekran kullanan sürüm. ( 7Aşağıdakini eksi dördüncü sütunlarda ekran yüksekliğinizle değiştirin .)

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}}

Bu gerçekten hızlı çalışır, böylece ikinci satıra bir duraklama ekleyebilirsiniz:

Tcl, 177 bayt

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}}

Üstteki dizeyi iki farklı şey için yeniden kullanarak çalışır:

  • iç döngü için bir liste olarak (koyun + çitin her bir versiyonunu görüntülemek için)
  • Koyun + çit görüntü şablonundan basamakları kaldırmak için basamak → boşluk eşlemesi olarak

Şablonun kendisi gösterilecek dizge görüntüsüdür. İlk önce, koyunların mevcut konum hanelerini (iç döngü) bir 'o' ile eşler (dizge değiştirir). Sonra kalan haneleri boşluklarla eşleştiririz. Sonra sonuç dizesini basarız.

(Dizenin kendisi sondan sonra başlar (üçüncü satırda ve son satırda en solda olanla biter).)


3

QBasic, 110 bayt

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

5*nKeneler üzerinde döngüler . Her kene, ekranı temizler, stile ve koyun sayısını yazdırır ve ardından uygun noktada LOCATEyazdırmak için kullanır o. İle x, 0 ile 4 arasında pozisyon kodu söz konusu olur:

  • Kürek çekmek: (x=2)+2
    • Eğer x=2doğruysa, -1+2=1
    • Eğer x=2yanlışsa, 0+2=2
  • Kolon: 1+x-(x>1)+x\3
    • Eğer xbir 0ya da 1, x>1sahte ve x\3olduğu 0: 1+x-0+0= 1veya2
    • Eğer xöyleyse 2, x>1doğru ve x\3is 0: 1+x-(-1)+0=4
    • Eğer xbir 3ya da 4, x>1doğru ve x\3olduğu 1: 1+x-(-1)+1= 6veya7

Sonunda, SLEEP1 saniye ve döngü. Her kareye girip vurma sakıncası yoksa, argümanı kaldırarak iki baytı tıraş edebilirim SLEEP.


3

PHP, 132 131 bayt

Yorumlardan sonra yapılan düzenlemeler (teşekkürler!):

<?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;

Hangisi ungolfed:

<?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

Orijinal yayın

<?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);}

Ubuntu üzerinde test edildi (bilmiyorum, eğer system("clear") Windows'da çalışıyorsa )

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
Ya Windows ile ilgili bir şeyler söyleyelim, ama clearfiyat teklifi gerektirdiğinden eminim .
Titus

1
Windows hakkında düşünmek ... clsDOS içinde idi.
Titus,

1
Kaldır $i=0;, uyarılar genellikle kod golf (-5 bayt) görüntülenmez. Aynı sebepten dolayı, clearve o(-4 bayt) civarında tırnaklara ihtiyacınız yok . Yerine \ngerçek yeni satır (-2 bayt) ile s. Herhangi bir ifadeye değil, yalnızca ifadelere sahip olduğunuzdan, her şeyi döngüünüze koyabilir for, köşeli ayraçları ( for(;;system(clear),$c=…)sleep(1);) (-2 bayt) kaldırabilirsiniz . Sonunda koşulu eklemeyi unutmuşsun $i<$argv[0](+ 11 byte).
Karadelik

Teşekkür ederim! Döngü içine bir yankı alamadım. Ancak, bildirilen çözüm bunu yapıyor.
user470370

3

node.js + uyku , 169 bayt

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))

Orijinal çözüm

node.js, 146 142 185 bayt

Sadece ubuntu terminali ile test edilmiştir (ve şimdi n koyunları ile):

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)

Bu her 9 ms'de bir kare. Daha yatıştırıcı bir versiyon (her 1 saniyede bir kare):

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

Ve asılsız:

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)


2

05AB1E , 66 60 59 bayt

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

CP-1252 kullanır kodlamasını .

bir açıklamasını

Yineleme, koyun yolculuklarının iç yinelemesini (0 -> 4) belirtir.

Ana döngüler

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

Üst satır oluştur

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

Orta sıra oluştur

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

Alt satır oluştur

…──|  # 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

Jöle , 55 54 53 bayt

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

TryItOnline

Satır besleme ile ayrılmış kareleri yazdırır.

Nasıl?

ị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 bayt, 163 151 136 karakter

Özyinelemeli bir işlev kullanarak çözüm. F (int) olarak çağır

DÜZENLE

-12 yorumları yeniden okuduktan ve koyun alanın sonuna geldiğinde sayının artması gerekmediğini gördükten sonra

-15 doğrudan dizin listesini tekrar ederek ve bir değişkeni kaybederek

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)

notlar

UTF-8 kodlamasını varsayar

- yerine (@Luis MATL cevabında olduğu gibi) kullanılması, bayt sayımını karakter sayımına uyacak şekilde 8'e düşürür ve UTF-8 bağımlılığını kaybeder

50 yeni satır eklendi - çıktı konsolun en altında (os.system ("clear") alma ve kullanmadan daha ucuz ve Windows ve Linux'ta çalışıyor)

Çıkışlar arasında 1 saniye gecikmeli sürüm (170 bayt, 162 karakter)

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 + standart Linux yardımcı programları (339 bayt)

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.