Demikianlah yang dikatakan Gembala

23

Aku lelah, tapi sepertinya aku tidak bisa tidur. Bantu saya menghitung domba.

Diberikan input N (bilangan bulat positif), buat N domba melompati pagar ascii, seperti contoh di bawah ini. Hanya satu bingkai yang harus ditampilkan sekaligus:

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

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

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

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

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

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

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

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

Hitungan harus disimpan di sisi kanan bawah 'tanah'. Trailing dan memimpin spasi putih dan baris baru diizinkan. Jika bahasa pilihan Anda mengalami kesulitan membersihkan layar untuk setiap bingkai, Anda dapat menambahkan baris baru yang cukup untuk menghapus layar - sebutkan berapa banyak baris yang Anda tambahkan untuk ini dalam jawaban Anda. Program ini harus berakhir ketika domba ke-N berada di lantai lima.

Saya harus bangun pagi-pagi besok, jadi kode terpendek dalam byte menang. Silakan kirimkan fungsi atau program lengkap. Celah standar berlaku.

steenbergh
sumber
6
1. Tolong, itu menyakitkan saya ketika orang-orang menggunakan pembenaran untuk kode pendek ("Saya harus bangun pagi-pagi besok") 2. Berapa banyak spasi putih yang kita tempatkan di antara frame? Sepertinya 1 baris baru, tetapi Anda mungkin ingin menyatakannya dengan jelas.
Rɪᴋᴇʀ
12
1) minum aspirin 2) Mungkin hanya ada 1 bingkai di layar. Frame ini di sini adalah untuk menunjukkan setiap negara secara individual dan TIDAK boleh terlihat pada 1 layar secara bersamaan.
steenbergh
3
Banyak bahasa tidak memiliki opsi untuk menghapus tampilan, dalam kasus seperti apa output yang harus mereka sediakan?
Jonathan Allan
6
"tambahkan baris baru yang cukup untuk menghapus layar". Bukankah itu tergantung pada ukuran jendela output serta resolusi layar?
Emigna
3
Menurut contoh Anda, untuk N=3frame terakhir akan berisi domba di ujung kanan dan counter akan tetap berkata 2. Apakah itu benar?
Luis Mendo

Jawaban:

15

MATL , 60 56 53 byte

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

Animasi dengan kode di atas berjalan sangat cepat. Versi berikut mencakup jeda untuk membuat animasi lebih lambat dan karenanya lebih mudah dilihat (tidak diharuskan oleh tantangan), dengan biaya 4 byte lebih:

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

Cobalah di MATL Online! Penerjemahnya adalah beta; segarkan halaman jika tidak berhasil.

Atau lihat rekaman dari kompiler offline:

masukkan deskripsi gambar di sini

Penjelasan

:"              % 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
Luis Mendo
sumber
6

JavaScript (ES6), 120 124 byte

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

Frame terakhir yang dihitung ditampilkan terlebih dahulu. Berkat ini nomor lompatannya adalah n-1
In alert, karakter memiliki lebar yang berbeda sehingga sepertinya rusak.


Jawaban sebelumnya:

120 byte, nomor lompatan salah karena dimulai pada 1 bukan 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))):''
Hedi
sumber
@LuisMendo Saya memperbarui penghitung mulai dari 0. Untuk bilah itu berkat font yang digunakan oleh alert. Saya memiliki hasil yang sama dari chrome dengan tepi, dan lebih buruk dengan firefox.
Hedi
6

JavaScript (ES6), 144 142 byte

Mengosongkan output dan menunggu 300ms antara setiap frame:

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)

Anda dapat mengujinya di sini (pastikan untuk membuka konsol).

Arnauld
sumber
Ini tampaknya tidak menambah penghitung (dari 4ke 5) setelah domba terakhir telah melompat pagar ...
ʰᵈˑ
@ ʰᵈˑ - Saya pikir ini adalah perilaku yang diharapkan. (Lihat pertanyaan Luis Mendo di komentar tantangan.)
Arnauld
Ah ya, saya tidak membaca itu - tautan ke komentar untuk orang lain
ʰᵈˑ
4

Ruby, 83 byte

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

Mencetak ke stdout. Output dipisahkan oleh baris baru. Mengurangi ketinggian layar menjadi 3 hanya membuat satu gambar terlihat pada satu waktu.

Level River St
sumber
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);}}}}
Jörg Hülsermann
sumber
Pada pandangan pertama, ada beberapa ruang putih berbaring di string[] argsdan di for (int. Int32.Parsebisa jadi int.Parse.
Yytsi
1
Anda dapat mengubah nama kelas dari Programmenjadi hanya Patau sesuatu
Matias Cicero
1
stringbisa jadi var. Integer di dalam for loop dapat diinisialisasi pada saat yang sama saat Anda menguraikan args[0]integer.
Yytsi
Saya melihat Anda mengedit jumlah byte setiap kali diturunkan. Namun, saya sarankan untuk tetap menggunakan hitungan byte lama (disilangkan dengan sebuah garis), untuk melacak kemajuannya :)
Yytsi
Anda hanya perlu memiliki fungsi jadi kompilasi ke Action<string[]>dan Anda dapat menghapus tanda kurung di luar untuk loop jadi saya percaya saya mendapatkan 200 byte: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 byte

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

Simpan ke file s.php, panggil di browser dengan s.php?n=<n>.

Panggilan sendiri dengan parameter baru untuk setiap frame, tanpa penundaan.


Saya bisa menghemat 5 lebih banyak dengan index.php; tapi saya tidak ingin sejauh itu.

Titus
sumber
Saya sudah mencoba menjalankan ini di PHP 5 dan 7, tetapi semua Chrome memberi saya adalah C AB|─|DE ──|─|── $c",EABCD,$s),($c+=!$f)<$n?".
steenbergh
@steenbergh Anda telah short_open_tagmenonaktifkan. Aktifkan (default) atau tambahkan php+ spasi setelah <?.
Titus
Yup, itu dia. Menjalankannya sekarang.
steenbergh
3

Tcl, 168 byte

Versi menggunakan layar 10-baris-tinggi. (Ganti di 7bawah ini dengan tinggi layar Anda dalam kolom minus empat.)

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

Itu berjalan sangat cepat, sehingga Anda dapat menambahkan jeda pada baris dua:

Tcl, 177 byte

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

Ini berfungsi dengan menggunakan kembali string di atas untuk dua hal berbeda:

  • sebagai daftar untuk loop dalam (untuk menampilkan setiap versi domba + pagar)
  • sebagai pemetaan digit → ruang untuk menghapus angka dari templat gambar domba + pagar

Template itu sendiri adalah gambar string untuk ditampilkan. Pertama-tama kita memetakan (ganti string) digit posisi domba saat ini (loop dalam) ke 'o'. Lalu kami memetakan digit yang tersisa ke spasi. Kemudian kami mencetak string yang dihasilkan.

(String itu sendiri dimulai setelah {terakhir di baris ketiga dan berakhir dengan paling kiri} di baris terakhir.)

Dúthomhas
sumber
3

QBasic, 110 byte

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 over 5*nticks. Pada setiap centang, bersihkan layar, cetak hitungan stile dan domba, dan kemudian gunakan LOCATEuntuk mencetak odi tempat yang sesuai. Dengan xmenjadi kode posisi antara 0 dan 4:

  • Baris: (x=2)+2
    • Jika x=2benar, -1+2=1
    • Jika x=2salah, 0+2=2
  • Kolom: 1+x-(x>1)+x\3
    • Jika xadalah 0atau 1, x>1salah dan x\3adalah 0: 1+x-0+0= 1atau2
    • If xis 2, x>1true dan x\3is 0: 1+x-(-1)+0=4
    • Jika xbenar 3atau 4, x>1benar dan x\3adalah 1: 1+x-(-1)+1= 6atau7

Akhirnya, SLEEPselama 1 detik dan loop. Jika Anda tidak keberatan menekan enter di setiap frame, saya dapat mencukur dua byte dengan menghapus argumen SLEEP.

DLosc
sumber
3

PHP, 132 131 byte

Suntingan setelah komentar (terima kasih!):

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

Yang 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

Pos asli

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

Diuji di ubuntu (tidak tahu, apakah system("clear")berfungsi di windows)

Tidak Disatukan:

<?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);
}
pengguna470370
sumber
1
Idk baik tentang Windows, tapi saya yakin itu cleartidak perlu kutipan.
Titus
1
Berpikir tentang Windows ... itu clsdi DOS.
Titus
1
Hapus $i=0;, peringatan biasanya tidak ditampilkan dalam kode golf (-5 byte). Untuk alasan yang sama, Anda tidak perlu tanda kutip sekitar cleardan o(-4 byte). Ganti \ns dengan baris baru nyata (-2 byte). Karena Anda hanya memiliki ekspresi, bukan pernyataan apa pun, Anda bisa meletakkan semuanya kecuali yang terakhir di forloop Anda , memungkinkan Anda untuk menghapus tanda kurung ( for(;;system(clear),$c=…)sleep(1);) (-2 byte). Dan akhirnya, Anda lupa menambahkan kondisinya $i<$argv[0](+ 11 byte).
Blackhole
Terima kasih! Saya tidak mendapatkan gema ke dalam loop. Tetapi solusi yang diposkan ulang melakukannya.
user470370
3

node.js + sleep , 169 byte

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

Solusi asli

node.js, 146 142 185 byte

Diuji hanya dengan terminal ubuntu (dan sekarang dengan n domba):

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)

Ya, itu frame setiap 9 ms. Versi yang lebih menenangkan tidur (bingkai setiap 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)

Dan ungolfed:

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)
pengguna470370
sumber
Dalam solusi pertama saya, saya lupa parameter untuk N sheeps
user470370
2

05AB1E , 66 60 59 byte

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

Menggunakan pengodean CP-1252 .

Penjelasan

Iterasi mengacu pada iterasi dalam (0 -> 4) dari perjalanan domba.

Loop utama

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

Hasilkan baris atas

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

Hasilkan baris tengah

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

Hasilkan baris bawah

…──|  # 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
Emigna
sumber
1

Jelly , 55 54 53 byte

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

TryItOnline

Mencetak bingkai yang dipisahkan oleh umpan garis.

Bagaimana?

ị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)
Jonathan Allan
sumber
1

Python 2, 171 159 144 byte, 163 151 136 karakter

Solusi menggunakan fungsi rekursif. Sebut sebagai f (int)

EDIT

-12 setelah membaca ulang komentar dan melihat bahwa jumlah tidak harus bertambah ketika domba mencapai ujung ladang

-15 dengan mengulangi daftar indeks secara langsung dan kehilangan variabel

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)

Catatan

Asumsikan pengkodean UTF-8

Menggunakan - alih-alih ─ (seperti pada @Luis MATL jawaban) akan menurunkan jumlah byte hingga 8 agar sesuai dengan jumlah karakter dan akan kehilangan ketergantungan UTF-8

50 baris baru ditambahkan - output berada di bagian bawah pada konsol (lebih murah daripada mengimpor dan menggunakan sistem os.s ("jelas") dan bekerja pada Windows dan Linux)

Versi dengan jeda waktu 1 detik antara keluaran (170 byte, 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)
ElPedro
sumber
1

Bash + utilitas Linux standar (339 byte)

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
pengguna2064000
sumber