だから羊飼いは言う


23

私は疲れていますが、眠りに落ちることはできません。羊を数えるのを手伝ってください。

入力N(正の整数)が与えられると、以下のサンプルのように、N羊がアスキーフェンスを飛び越えるようにします。一度に表示されるフレームは1つだけです。

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

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

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

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

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

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

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

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

カウントは「地面」の右下に保持する必要があります。末尾と先頭の空白と改行が許可されます。選択した言語で各フレームの画面をクリアするのが難しい場合、画面をクリアするのに十分な改行を追加できます。これに追加する行数を回答に明記してください。N番目の羊が5番目のフロアタイルにいるとき、プログラムは終了するはずです。

明日早く起きなければならないので、バイト単位の最短コードが勝ちます。機能または完全なプログラムを提出してください。標準の抜け穴が適用されます。


6
1.どうか、人々が短いコードの正当化を使用するとき、それは私を苦しめます(「明日早く起きなければなりません」)2.フレーム間にどのくらいの空白を入れますか?改行が1つあるように見えますが、それを明確に述べたい場合があります。
Rɪᴋᴇʀ

12
1)アスピリンを服用します2)画面に表示されるフレームは1つだけです。ここでのこれらのフレームは、各状態を個別に示すためのものであり、1つの画面に同時に表示されるべきではありません。
-steenbergh

3
多くの言語には表示をクリアするオプションがありません。そのような場合、どの出力を提供する必要がありますか?
ジョナサンアラン

6
「画面をクリアするのに十分な改行を追加します」。これは、出力ウィンドウのサイズと画面解像度に依存していませんか?
エミグナ

3
あなたの例によるとN=3、最後のフレームには右端に羊が含まれており、カウンターにはまだと表示され2ます。あれは正しいですか?
ルイスメンドー

回答:


15

MATL60 56 53バイト

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

上記のコードを使用したアニメーションは非常に高速に実行されます。次のバージョンには、アニメーションを遅くして見やすくするための一時停止が含まれています(チャレンジでは必要ありません)。ただし、さらに4バイト必要です。

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

MATL Online試しくださいインタープリターはベータ版です。動作しない場合はページを更新します。

または、オフラインコンパイラからの記録を参照してください。

enter image description here

説明

:"              % 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、キャラクターの幅が異なるため、壊れているように見えます。


前の答え:

120バイト、ジャンプ番号は0ではなく1から始まるため間違っています

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ではさらに悪い結果になります。
エディ

6

JavaScript(ES6)、144 142バイト

出力をクリアし、各フレーム間で300ミリ秒待機します。

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)増加させないようです
...-

@ʰᵈˑ-これは予想される動作だと思います。(チャレンジコメントのルイスメンドーの質問を参照してください。)
アーナルド

ああ、私はそれを読んでいませんでした- 他の人のコメントへのリンク
ʰᵈˑ

4

Ruby、83バイト

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

標準出力に出力します。改行で区切られた出力。画面の高さを3に減らすと、一度に1つの画像のみが表示されます。


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.Parse可能性がありますint.Parse
-Yytsi

1
クラスの名前をProgramからちょうどPまたは何かに変更できます
マティアスキケロ

1
string可能性がありますvar。forループの整数は、整数に解析args[0]すると同時に初期化できます。
-Yytsi

バイトカウントを下げるたびに編集しているようです。ただし、進行状況を追跡するために、古いバイトカウント(行と交差)を維持することをお勧めします
。– Yytsi

関数を持っているだけでコンパイルするAction<string[]>ことができ、外側のforループの括弧を削除できるので、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.phpに保存し、ブラウザでを呼び出しますs.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下の列の画面の高さから4を引いたものに置き換えます。)

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

これは非常に高速に実行されるため、2行目に一時停止を追加できます。

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

上部の文字列を2つの異なる目的で再利用することで機能します。

  • 内側のループのリストとして(羊+フェンスの各バージョンを表示するため)
  • 羊→フェンスの画像テンプレートから数字を削除する数字→スペースのマッピングとして

テンプレート自体は、表示する文字列画像です。まず、羊の現在位置の数字(内部ループ)を「o」にマッピング(文字列置換)します。次に、残りの数字をスペースにマッピングします。次に、結果の文字列を出力します。

(文字列自体は、3行目の最後の{の後に始まり、最後の行の左端の}で終わります。)


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から、適切な場所での印刷に使用します。x0と4の間に位置コードです。

  • 行: (x=2)+2
    • 場合はx=2trueで、-1+2=1
    • x=2がfalseの場合、0+2=2
  • カラム: 1+x-(x>1)+x\3
    • 場合xである01x>1falseで、x\3ある01+x-0+0= 1または2
    • 場合x2x>1真実であるとx\3されます01+x-(-1)+0=4
    • 場合xである34x>1真実であるとx\3される11+x-(-1)+1= 6または7

最後にSLEEP、1秒間ループします。すべてのフレームでEnterキーを押すことを気にしないのであれば、の引数を削除することで2バイトを削ることができます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で動作するかどうかはわかりません)

ゴルフをしていない:

<?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について考えると、それはclsDOSにありました。
タイタス

1
を削除すると$i=0;、通常、警告はコードゴルフでは表示されません(-5バイト)。同じ理由で、clearおよびo(-4バイト)を引用符で囲む必要はありません。\nsを実際の改行(-2バイト)に置き換えます。式のみがあり、文はないため、forループの最後の式以外のすべてを配置でき、角括弧(for(;;system(clear),$c=…)sleep(1);)(-2バイト)を削除できます。そして最後に、条件$i<$argv[0](+ 11バイト)の追加を忘れます。
ブラックホール

ありがとうございました!ループにエコーが入りませんでした。しかし、再投稿されたソリューションはそれを行っています。
-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バイト

ubuntuターミナルのみでテスト済み(および現在、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ミリ秒ごとのフレームです。より睡眠をスムーズにするバージョン(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個の羊のパラメーターを忘れました
-user470370

2

05AB1E66 60 59バイト

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

用途 CP-1252エンコードをます。

解説

反復とは、羊の旅の内部反復(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.