ดังนั้นคนเลี้ยงแกะพูดว่า


23

ฉันเหนื่อย แต่ฉันนอนไม่หลับ ช่วยฉันนับแกะ

รับอินพุต N (จำนวนเต็มบวก) ทำ N แกะข้ามรั้ว ascii เช่นตัวอย่างด้านล่าง ควรแสดงหนึ่งเฟรมในครั้งเดียว:

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

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

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

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

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

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

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

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

ควรเก็บจำนวนไว้ที่ด้านล่างขวาของ 'พื้นดิน' อนุญาตการเว้นวรรคและนำหน้าและขึ้นบรรทัดใหม่ หากภาษาที่คุณเลือกมีปัญหาในการล้างหน้าจอสำหรับแต่ละเฟรมคุณสามารถเพิ่มบรรทัดใหม่ที่เพียงพอเพื่อล้างหน้าจอ - โปรดระบุจำนวนบรรทัดที่คุณเพิ่มสำหรับคำตอบของคุณ โปรแกรมควรยุติเมื่อแกะ N'th อยู่ใน floortile ที่ห้า

ฉันต้องตื่น แต่เช้าตรู่เพื่อให้ได้รหัสที่สั้นที่สุดในหน่วยไบต์ กรุณาส่งฟังก์ชั่นหรือโปรแกรมที่สมบูรณ์ ช่องโหว่มาตรฐานใช้


6
1. ได้โปรดมันทำให้ฉันเจ็บปวดเมื่อมีคนใช้เหตุผลสำหรับรหัสสั้น ๆ ("ฉันต้องตื่นเช้า") 2. เราใส่ช่องว่างระหว่างเฟรมมากแค่ไหน? ดูเหมือนว่าจะมี 1 บรรทัดใหม่ แต่คุณอาจต้องการระบุอย่างชัดเจน
Rɪᴋᴇʀ

12
1) กินแอสไพริน 2) อาจมีเพียง 1 เฟรมบนหน้าจอ เฟรมเหล่านี้จะแสดงให้เห็นถึงแต่ละรัฐเป็นรายบุคคลและไม่ควรปรากฏบนหน้าจอ 1 พร้อมกัน
steenbergh

3
หลายภาษาไม่มีตัวเลือกในการลบการแสดงผลในกรณีเช่นนี้ควรมีการแสดงผลแบบใด
Jonathan Allan

6
"เพิ่มบรรทัดใหม่ที่เพียงพอเพื่อล้างหน้าจอ". นั่นไม่ได้ขึ้นอยู่กับขนาดของหน้าต่างผลลัพธ์เช่นเดียวกับความละเอียดของหน้าจอ?
Emigna

3
ตามตัวอย่างของคุณสำหรับเฟรมสุดท้ายจะมีแกะที่ปลายด้านขวาและเคาน์เตอร์จะยังคงบอกว่าN=3 2ถูกต้องหรือไม่
Luis Mendo

คำตอบ:


15

MATL , 60 56 53 ไบต์

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

แอนิเมชั่นที่มีโค้ดด้านบนทำงานเร็วมาก รุ่นต่อไปนี้มีการหยุดชั่วคราวเพื่อทำให้ภาพเคลื่อนไหวช้าลงและทำให้มองเห็นได้ง่ายขึ้น (ไม่ต้องใช้ความท้าทาย) โดยมีค่าใช้จ่ายเพิ่มขึ้น 4 ไบต์:

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

ลองที่MATL Online!ล่ามเป็นรุ่นเบต้า รีเฟรชหน้าหากไม่ได้ผล

หรือดูการบันทึกจากคอมไพเลอร์ออฟไลน์:

ป้อนคำอธิบายรูปภาพที่นี่

คำอธิบาย

:"              % 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 ไบต์

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

เฟรมสุดท้ายที่คำนวณถูกแสดงก่อน ขอบคุณที่กระโดดเป็นn-1
In alert, charaters มีความกว้างที่แตกต่างกันดังนั้นดูเหมือนว่ามันจะแตก


คำตอบก่อนหน้า:

120 ไบต์จำนวนการกระโดดนั้นผิดเนื่องจากเริ่มต้นที่ 1 แทนที่จะเป็น 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 ฉันปรับปรุงเคาน์เตอร์เพื่อเริ่มต้นที่ 0 alertสำหรับบาร์ก็ต้องขอบคุณตัวอักษรที่ใช้โดย ฉันมีผลลัพธ์เดียวกันกับโครเมี่ยมที่มีขอบและมันแย่กว่ากับ Firefox
Hedi

6

JavaScript (ES6), 144 142 ไบต์

เคลียร์เอาต์พุตและรอ 300ms ระหว่างแต่ละเฟรม:

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)

คุณสามารถทดสอบได้ที่นี่ (อย่าลืมเปิดคอนโซล)


นี่ดูเหมือนจะไม่เพิ่มเคาน์เตอร์ (จาก4ถึง5) หลังจากแกะตัวสุดท้ายกระโดดข้ามรั้ว ...
ʰᵈˑ

@ ʰᵈˑ - ฉันคิดว่านี่เป็นพฤติกรรมที่คาดหวัง (ดูคำถามของ Luis Mendo ในความคิดเห็นที่ท้าทาย)
Arnauld


4

Ruby, 83 ไบต์

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

พิมพ์ไปยัง stdout เอาต์พุตคั่นด้วยบรรทัดใหม่ การลดความสูงของหน้าจอเป็น 3 ทำให้สามารถมองเห็นได้ทีละภาพ


4

C #, 234 ไบต์

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

ได้อย่างรวดเร็วก่อนมีช่องว่างบางวางรอบที่และstring[] args อาจจะเป็น for (intInt32.Parseint.Parse
Yytsi

1
คุณสามารถเปลี่ยนชื่อของคลาสจากProgramเป็นเพียงPหรืออะไรก็ได้
Matias Cicero

1
stringvarอาจจะเป็น จำนวนเต็มในการวนรอบสามารถเริ่มต้นได้ในเวลาเดียวกันคุณแยกargs[0]เป็นจำนวนเต็ม
Yytsi

ฉันเห็นคุณแก้ไขจำนวนไบต์ทุกครั้งที่มันลดลง อย่างไรก็ตามฉันขอแนะนำให้คุณนับจำนวนไบต์เก่า (ตัดกับเส้น) เพื่อติดตามความคืบหน้า :)
Yytsi

คุณเพียงแค่ต้องมีฟังก์ชั่นเพื่อคอมไพล์Action<string[]>แล้วและคุณสามารถลบวงเล็บรอบนอกสำหรับลูปดังนั้นฉันเชื่อว่าฉันได้ 200 ไบต์: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 ไบต์

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

บันทึกไปยังแฟ้มโทรในเบราว์เซอร์s.phps.php?n=<n>

เรียกตัวเองพร้อมพารามิเตอร์ใหม่สำหรับทุกเฟรมไม่ล่าช้า


ฉันสามารถประหยัดได้มากกว่า 5 ด้วยindex.php; แต่ฉันไม่ต้องการไปไกลขนาดนั้น


ฉันได้พยายามทำงานนี้ใน PHP 5 และ 7 แต่ทั้งหมด Chrome C AB|─|DE ──|─|── $c",EABCD,$s),($c+=!$f)<$n?"ให้ฉันเป็น
steenbergh

@steenbergh คุณได้short_open_tagปิดการใช้งาน เปิดใช้งาน (เริ่มต้น) หรือเพิ่มphpพื้นที่ + <?หลัง
ติตัส

ใช่นั่นแหล่ะ ให้มันทำงานตอนนี้
steenbergh

3

Tcl, 168 ไบต์

เวอร์ชันที่ใช้หน้าจอสูง 10 แถว (แทนที่7ด้านล่างด้วยความสูงของหน้าจอของคุณในคอลัมน์ลบสี่)

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

มันทำงานเร็วมากดังนั้นคุณสามารถเพิ่มการหยุดชั่วคราวในบรรทัดที่สอง:

Tcl, 177 ไบต์

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

มันทำงานได้โดยการนำสตริงที่ด้านบนมาใช้กับสองสิ่งที่แตกต่างกัน:

  • เป็นรายการสำหรับวงใน (เพื่อแสดงแกะ + รั้วแต่ละรุ่น)
  • เป็นการแมปช่องว่างของ→หลักเพื่อลบตัวเลขออกจากเทมเพลตรูปภาพแกะ + รั้ว

เทมเพลตนั้นคือภาพสตริงที่จะแสดง ก่อนอื่นเราทำการแมป (แทนที่สตริง) ตัวเลขตำแหน่งปัจจุบันของแกะ (วงใน) ไปยัง 'o' จากนั้นเราแมปตัวเลขที่เหลือกับช่องว่าง จากนั้นเราพิมพ์สตริงผลลัพธ์

(สตริงจะเริ่มหลังจาก {สุดท้ายในบรรทัดที่สามและลงท้ายด้วย leftmost} ในบรรทัดสุดท้าย)


3

QBasic, 110 ไบต์

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*nเห็บ ที่แต่ละเห็บให้ล้างหน้าจอพิมพ์จำนวนเสาและแกะแล้วใช้LOCATEในการพิมพ์oที่จุดที่เหมาะสม ด้วยxการเป็นรหัสตำแหน่งระหว่าง 0 และ 4:

  • แถว: (x=2)+2
    • ถ้าx=2เป็นจริง-1+2 =1
    • ถ้าx=2เป็นเท็จ0+2=2
  • คอลัมน์: 1+x-(x>1)+x\3
    • หากxเป็น0หรือ1, x>1เป็นเท็จและx\3เป็น0: 1+x-0+0=1หรือ2
    • ถ้าxเป็น2, x>1เป็นความจริงและx\3เป็น0:1+x-(-1)+0 =4
    • หากxเป็น3หรือ4, x>1เป็นความจริงและx\3เป็น1: 1+x-(-1)+1= 6หรือ7

ในที่สุดเป็นSLEEPเวลา 1 วินาทีและวนรอบ หากคุณไม่รังเกียจการกดปุ่ม Enter ที่ทุก ๆ เฟรมฉันสามารถโกนสองไบต์ด้วยการเอาอาร์กิวเมนต์SLEEPออก


3

PHP, 132 131 ไบต์

แก้ไขหลังจากความคิดเห็น (ขอบคุณ!):

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

สิ่งที่ไม่ดี

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

โพสต์ต้นฉบับ

<?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 แล้ว (ไม่รู้ว่าsystem("clear")ทำงานบน 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 เกี่ยวกับ Windows แต่ฉันแน่ใจว่าclearไม่จำเป็นต้องมีเครื่องหมายคำพูด
ติตัส

1
กำลังคิดเกี่ยวกับ Windows ... มันเป็นclsใน DOS
ติตัส

1
ลบ$i=0;คำเตือนที่มักจะไม่แสดงในรหัสกอล์ฟ (-5 ไบต์) ด้วยเหตุผลเดียวกันคุณไม่จำเป็นต้องมีเครื่องหมายคำพูดประมาณclearและo(-4 ไบต์) แทนที่\ns ด้วยบรรทัดใหม่จริง (-2 ไบต์) เนื่องจากคุณมีเพียงนิพจน์ไม่ใช่ข้อความใด ๆ คุณสามารถใส่ทุกอย่าง แต่เป็นประโยคสุดท้ายในforลูปทำให้คุณสามารถลบวงเล็บ ( for(;;system(clear),$c=…)sleep(1);) (-2 ไบต์) และในที่สุดคุณลืมที่จะเพิ่มเงื่อนไข$i<$argv[0](+ 11 ไบต์)
Blackhole

ขอขอบคุณ! ฉันไม่ได้เสียงสะท้อนในลูป แต่โซลูชันที่โพสต์ใหม่กำลังทำอยู่
user470370

3

node.js + sleep , 169 ไบต์

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

โซลูชันดั้งเดิม

node.js, 146 142 185 ไบต์

ทดสอบกับเทอร์มินัลอูบุนตูเท่านั้น (และตอนนี้มีแกะ n):

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)

นั่นคือเฟรมทุก ๆ 9 มิลลิวินาที เวอร์ชัน sleep-soothing เพิ่มเติม (ใส่เฟรมทุก 1 วินาที):

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

และไม่ดี

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)

ในโซลูชันแรกของฉันฉันลืมพารามิเตอร์สำหรับ N sheeps
user470370

2

05AB1E , 66 60 59 ไบต์

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

ใช้การเข้ารหัสCP-1252

Explanantion

การทำซ้ำหมายถึงการวนซ้ำภายใน (0 -> 4) ของการเดินทางด้วยการแกะ

ลูปหลัก

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

สร้างแถวบนสุด

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

สร้างแถวกลาง

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

สร้างแถวล่าง

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

เยลลี่ , 55 54 53 ไบต์

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

TryItOnline

พิมพ์เฟรมที่คั่นด้วยการป้อนบรรทัด

อย่างไร?

ị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 ไบต์, 163 151 136 ตัวอักษร

โซลูชันที่ใช้ฟังก์ชั่นวนซ้ำ โทรเป็น f (int)

แก้ไข

-12 หลังจากอ่านความคิดเห็นใหม่และเห็นว่าการนับไม่จำเป็นต้องเพิ่มขึ้นเมื่อแกะมาถึงจุดสิ้นสุดของสนาม

-15 โดยทำซ้ำผ่านรายการดัชนีโดยตรงและสูญเสียตัวแปร

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)

หมายเหตุ

ใช้การเข้ารหัส UTF-8

การใช้ - แทนที่จะเป็น─ (ดังใน @Luis MATL answer) จะทำให้จำนวนไบต์ลดลง 8 เพื่อให้ตรงกับจำนวนตัวอักษรและจะสูญเสียการพึ่งพา UTF-8

เพิ่มขึ้นบรรทัดใหม่ 50 บรรทัด - เอาต์พุตอยู่ที่ด้านล่างของคอนโซล (ราคาถูกกว่าการนำเข้าและการใช้ os.system ("clear") และทำงานบน Windows และ Linux)

เวอร์ชันที่มีการหน่วงเวลา 1 วินาทีระหว่างเอาต์พุต (170 ไบต์, 162 อักขระ)

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 + มาตรฐาน Linux (339 ไบต์)

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.