Vì vậy, nói rằng mục tử


23

Tôi mệt, nhưng dường như tôi không thể ngủ được. Giúp tôi đếm cừu.

Cho N đầu vào (số nguyên dương), làm cho N cừu nhảy qua hàng rào ascii, giống như mẫu bên dưới. Chỉ một khung hình sẽ được hiển thị cùng một lúc:

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

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

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

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

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

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

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

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

Đếm nên được giữ ở phía dưới bên phải của 'mặt đất'. Trailing và khoảng trắng hàng đầu và dòng mới được cho phép. Nếu ngôn ngữ bạn chọn gặp khó khăn khi xóa màn hình cho từng khung hình, bạn có thể thêm đủ dòng mới để xóa màn hình - vui lòng cho biết có bao nhiêu dòng bạn thêm cho câu trả lời này trong câu trả lời của bạn. Chương trình sẽ chấm dứt khi con cừu thứ N đang ở trên phao thứ năm.

Tôi cần phải dậy sớm vào ngày mai, vì vậy mã ngắn nhất tính bằng byte sẽ thắng. Vui lòng gửi một chức năng hoặc chương trình hoàn chỉnh. Tiêu chuẩn áp dụng.


6
1. Xin vui lòng, điều đó làm tôi đau lòng khi mọi người sử dụng biện minh cho mã ngắn ("Tôi cần dậy sớm vào ngày mai") ​​2. Chúng ta đặt bao nhiêu khoảng trắng giữa các khung? Có vẻ như 1 dòng mới, nhưng bạn có thể muốn nói rõ điều đó.
Rɪᴋᴇʀ

12
1) uống aspirin 2) Có thể chỉ có 1 khung hình trên màn hình. Các khung này ở đây là để thể hiện từng trạng thái riêng lẻ và KHÔNG được hiển thị đồng thời trên 1 màn hình.
steenbergh

3
Nhiều ngôn ngữ không có tùy chọn để xóa hiển thị, trong những trường hợp như vậy họ nên cung cấp đầu ra nào?
Jonathan Allan

6
"Thêm dòng mới đủ để xóa màn hình". Điều đó có phụ thuộc vào kích thước của cửa sổ đầu ra cũng như độ phân giải màn hình không?
Emigna

3
Theo ví dụ của bạn, đối N=3với khung cuối cùng sẽ chứa một con cừu ở đầu bên phải và bộ đếm vẫn sẽ nói 2. Đúng không?
Luis Mendo

Câu trả lời:


15

MATL , 60 56 53 byte

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

Các hình ảnh động với mã trên chạy rất nhanh. Phiên bản sau bao gồm tạm dừng để làm cho hình ảnh động chậm hơn và do đó dễ nhìn hơn (không bị thách thức yêu cầu), với chi phí thêm 4 byte:

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

Hãy thử nó tại MATL Online! Trình thông dịch là bản beta; làm mới trang nếu nó không hoạt động.

Hoặc xem bản ghi từ trình biên dịch ngoại tuyến:

nhập mô tả hình ảnh ở đây

Giải trình

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

Khung cuối cùng được tính là hiển thị đầu tiên. Nhờ có số nhảy này là n-1
In alert, các charaters có chiều rộng khác nhau nên có vẻ như nó bị hỏng.


Câu trả lời trước:

120 byte, số nhảy là sai vì nó bắt đầu từ 1 thay vì 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 Tôi đã cập nhật bộ đếm để bắt đầu từ 0. Đối với các thanh đó là nhờ phông chữ được sử dụng alert. Tôi có kết quả tương tự chrome với cạnh, và nó tệ hơn với firefox.
Hedi

6

JavaScript (ES6), 144 142 byte

Xóa đầu ra và đợi 300ms giữa mỗi khung:

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)

Bạn có thể kiểm tra nó ở đây (đảm bảo mở giao diện điều khiển).


Đây dường như không tăng bộ đếm (từ 4đến 5) sau khi cừu cuối cùng đã nhảy hàng rào ...
ʰᵈˑ

@ ʰᵈˑ - Tôi nghĩ đây là hành vi dự kiến. (Xem câu hỏi của Luis Mendo trong phần bình luận thách thức.)
Arnauld

Ah vâng, tôi đã không đọc đó - liên kết để bình luận cho bất cứ ai khác
ʰᵈˑ

4

Ruby, 83 byte

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

In ra thiết bị xuất chuẩn. Đầu ra được phân tách bằng dòng mới. Giảm chiều cao màn hình xuống 3 khiến mỗi lần chỉ có một hình ảnh hiển thị.


4

C #, 234 byte

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

Thoạt nhìn, có một số khoảng trắng nằm xung quanh string[] argsvà tại for (int. Int32.Parsecó thể int.Parse.
Yytsi

1
Bạn có thể thay đổi tên của lớp từ Programchỉ Phoặc một cái gì đó
Matias Cicero

1
stringcó thể var. Số nguyên trong vòng lặp for có thể được khởi tạo cùng lúc bạn phân tích args[0]thành một số nguyên.
Yytsi

Tôi thấy bạn chỉnh sửa số byte mỗi lần nó được hạ xuống. Tuy nhiên, tôi khuyên bạn nên giữ xung quanh số byte cũ (được gạch chéo bằng một dòng), để theo dõi tiến trình :)
Yytsi

Bạn chỉ cần có một hàm để biên dịch thành một Action<string[]>và bạn có thể loại bỏ các dấu ngoặc quanh vòng lặp bên ngoài để tôi tin rằng tôi nhận được 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>":"";

Lưu vào tập tin s.php, gọi trong trình duyệt với s.php?n=<n>.

Gọi chính nó với các tham số mới cho mọi khung hình, không có độ trễ.


Tôi có thể tiết kiệm thêm 5 với index.php; nhưng tôi không muốn đi xa đến thế.


Tôi đã thử chạy nó trên PHP 5 và 7, nhưng tất cả Chrome mang lại cho tôi C AB|─|DE ──|─|── $c",EABCD,$s),($c+=!$f)<$n?".
steenbergh

@steenbergh Bạn đã short_open_tagbị vô hiệu hóa. Kích hoạt nó (mặc định) hoặc thêm php+ dấu cách sau<? .
Tít

Đúng rồi, thế đó. Có nó chạy ngay bây giờ.
steenbergh

3

Tcl, 168 byte

Phiên bản sử dụng màn hình cao 10 hàng. (Thay thế 7bên dưới bằng chiều cao màn hình của bạn trong các cột trừ bốn.)

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

Điều đó chạy rất nhanh, vì vậy bạn có thể thêm tạm dừng trên dòng hai:

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

Nó hoạt động bằng cách sử dụng lại chuỗi ở đầu cho hai thứ khác nhau:

  • như một danh sách cho vòng lặp bên trong (để hiển thị từng phiên bản của cừu + hàng rào)
  • dưới dạng ánh xạ chữ số → dấu cách để xóa các chữ số khỏi mẫu hình ảnh cừu + hàng rào

Bản thân mẫu là hình ảnh chuỗi để hiển thị. Đầu tiên chúng ta ánh xạ (thay thế chuỗi) chữ số vị trí hiện tại của cừu (vòng lặp bên trong) thành 'o'. Sau đó, chúng tôi ánh xạ các chữ số còn lại vào không gian. Sau đó, chúng tôi in chuỗi kết quả.

(Chuỗi chính nó bắt đầu sau {cuối cùng trên dòng thứ ba và kết thúc bằng ngoài cùng} trên dòng cuối cùng.)


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

Vòng lặp trên 5*nve. Tại mỗi tích tắc, xóa màn hình, in số lượng phân và cừu, sau đó sử dụngLOCATE để in otại vị trí thích hợp. Với xmã vị trí trong khoảng từ 0 đến 4:

  • Hàng: (x=2)+2
    • Nếu x=2 là đúng, -1+2=1
    • Nếu x=2là sai, 0+2=2
  • Cột: 1+x-(x>1)+x\3
    • Nếu x0hoặc 1, x>1là sai và x\30:1+x-0+0 = 1hoặc2
    • Nếu x2, x>1là đúng và x\30 : 1+x-(-1)+0=4
    • Nếu x3hoặc 4, x>1là đúng và x\31: 1+x-(-1)+1= 6hoặc7

Cuối cùng, SLEEPtrong 1 giây và vòng lặp. Nếu bạn không nhớ nhấn enter ở mọi khung hình, tôi có thể cạo hai byte bằng cách xóa đối số thành SLEEP.


3

PHP, 132 131 byte

Chỉnh sửa sau khi nhận xét (cảm ơn!):

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

Đó là vô đạo đức:

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

Bài gốc

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

Đã thử nghiệm trên Ubuntu (không biết, nếu system("clear")hoạt động trên windows)

Ung dung:

<?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 về Windows, nhưng tôi chắc chắn rằng clearkhông cần báo giá.
Tít

1
Suy nghĩ về Windows ... đó là clstrong DOS.
Tít

1
Xóa $i=0;, các cảnh báo thường không được hiển thị trong mã golf (-5 byte). Vì lý do tương tự, bạn không cần trích dẫn xung quanh clearo(-4 byte). Thay thế \ns bằng dòng mới thực (-2 byte). Vì bạn chỉ có các biểu thức, không phải bất kỳ câu lệnh nào, bạn có thể đặt mọi thứ trừ câu lệnh cuối cùng trong forvòng lặp của mình , cho phép bạn loại bỏ dấu ngoặc ( for(;;system(clear),$c=…)sleep(1);) (-2 byte). Và cuối cùng, bạn quên thêm điều kiện $i<$argv[0](+ 11 byte).
Hố đen

Cảm ơn bạn! Tôi đã không nhận được một tiếng vang vào vòng lặp. Nhưng giải pháp đăng lại đang làm điều đó.
dùng470370

3

node.js + ngủ , 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))

Giải pháp ban đầu

node.js, 146 142 185 byte

Chỉ được thử nghiệm với thiết bị đầu cuối Ubuntu (và bây giờ với n cừu):

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)

Vâng, đó là một khung hình cứ sau 9 ms. Một phiên bản êm dịu hơn cho giấc ngủ (khung hình cứ sau 1 giây):

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

Và vô lương tâm:

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)

Trong giải pháp đầu tiên của tôi, tôi đã quên tham số cho N cừu
user470370

2

05AB1E , 66 60 59 byte

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

Công dụng CP-1252 mã hóa .

Giải thích

Lặp lại đề cập đến lần lặp bên trong (0 -> 4) của hành trình cừu.

Vòng lặp chính

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

Tạo hàng trên cùng

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

Tạo hàng giữa

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

Tạo hàng dưới cùng

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

Thạch , 55 54 53 byte

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

Dùng thử

In các khung được phân tách bằng nguồn cấp dữ liệu.

Làm sao?

ị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 byte, 163 151 136 ký tự

Giải pháp sử dụng hàm đệ quy. Gọi là f (int)

CHỈNH SỬA

-12 sau khi đọc lại các bình luận và thấy rằng số lượng không phải tăng lên khi cừu đến cuối cánh đồng

-15 bằng cách lặp qua danh sách chỉ mục trực tiếp và mất một biến

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)

Ghi chú

Giả sử mã hóa UTF-8

Sử dụng - thay vì ─ (như trong câu trả lời MATL @Luis) sẽ làm giảm số đếm byte xuống 8 để khớp với số lượng ký tự và sẽ mất phụ thuộc UTF-8

50 dòng mới được thêm vào - đầu ra nằm ở cuối bảng điều khiển (rẻ hơn so với nhập và sử dụng os.system ("xóa") và hoạt động trên Windows và Linux)

Phiên bản có độ trễ thời gian 1 giây giữa các đầu ra (170 byte, 162 ký tự)

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 + tiện ích Linux tiêu chuẩn (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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.