ヤギを数えて眠る


36

一部の人々は眠りにつくために羊を数えます。その他はヤギを数えます。

正の整数Nを取り込んで、N-1個の目覚めたヤギに続いて1個の眠っているヤギを出力するプログラムまたは関数を作成します。まるで誰かがN個のヤギを数え、最後に眠ったのです。

覚醒したヤギは次のようになります。

      \
  ___/o>
-(___)"
 '' ''

眠っているヤギは次のようになります。

      \
  ___/->
,(___)"
 `` ``

それらは、隣接するヤギのあごひげと尾の間に1つのスペースで連結されています。

      \       \       \
  ___/o>  ___/o>  ___/->
-(___)" -(___)" ,(___)"
 '' ''   '' ''   `` ``

出力には、末尾のスペースと単一の末尾の改行を含めることができます。

バイト単位の最短コードが優先されます。

N = 1:

      \
  ___/->
,(___)"
 `` ``

N = 2:

      \       \
  ___/o>  ___/->
-(___)" ,(___)"
 '' ''   `` ``

N = 3:

      \       \       \
  ___/o>  ___/o>  ___/->
-(___)" -(___)" ,(___)"
 '' ''   '' ''   `` ``

N = 4:

      \       \       \       \
  ___/o>  ___/o>  ___/o>  ___/->
-(___)" -(___)" -(___)" ,(___)"
 '' ''   '' ''   '' ''   `` ``

より大きなNも同様に機能するはずです。


9
あなたの「ヤギ」は4足の怒っている鳥のように見えると思います;-)
デジタル外傷

4
Aww私はいくつかのヤギを数えることを望んでいましたが、逆ではありません
ベータ崩壊

1
ヤギを眠らせるかを知っていると思う
ルイスメンドー

7
私は「bleeeeeeetは」あなたは眠くなりますしない限り、あなたがスリープ状態にヤギを数えることができるとは思わない:P +1偉大な挑戦
Downgoat

1
サイコパスは、叫ぶヤギを数えることで眠りに落ちます。
mbomb007

回答:


30

MATL56 53バイト

:"'!!((!((!!#*```).?p0```!!!]'8eP!P]'p(.' '.a-'XE&hqc

オンラインでお試しください!

説明

目がさめているヤギ

覚醒したヤギはひもに詰めることができます

  '' ''  ")___(->o/___   \

すぐに説明するように解凍します。ただし、シングルクォート記号はエスケープするために複製する必要があるため、文字列リテラルを次のように定義する必要があります(囲むシングルクォート記号と元の記号の複製に注意してください)。

'  '''' ''''  ")___(->o/___   \'

バイトを節約するために、コードポイントの1つ上の文字を使用して文字列を定義し、重複を避けます。文字列リテラルは

'!!((!((!!#*```).?p0```!!!]'

コードの最後で、1を減算してcharに変換します。(文字列リテラルの直後にできますが、最後に残しておくと、後で説明するように、単一引用符の重複が保存されます)。

文字列がどのように展開されるかを説明するために、元の文字(1を差し引くことでコードの最後に生成される)を使用するため、説明を読みやすくします。最初に文字列を変形します

  '' ''  ")___(->o/___   \

列優先(下、次に横)の8行の2D char配列に変換ます。これにより、最後の列に自動的にchar 0が埋め込まれます(コードの最後で、1を引くと-1に変換され、charに変換されて再びchar 0になります)。Char 0はスペースとして表示されます。事実上、スペースでパディングしています。再形成の結果は

  > 
 "o\
')/ 
'__ 
 __ 
'__ 
'(  
 -  

垂直に反転します:

 -  
'(  
'__ 
 __ 
'__ 
')/ 
 "o\
  > 

そして、再び転置して垂直に反転し、覚醒したヤギを生成します。

      \ 
  ___/o>
-(___)" 
 '' ''  

元のパックされた文字列は「逆順」であるため、2つのフリップ操作が必要です。これは、ヤギを表す実際の2D char配列の最初の行に6つの初期スペースがあり、文字列が8行の2D配列に再形成されると、パディングによって自動的に埋められるという事実を利用するためです。ただし、パディングは最後の列(行ではなく)の最後(行ではなく)で行われるため、フリップと転置が行われます。

眠っているヤギ

睡眠ヤギ翻字文字によって覚醒したヤギから生成されるo'--`,それぞれ。実際には、理由は1コード・ポイント・上記の変換を、私たちは文字を翻字p('.a-、再び単一引用符記号を複製することから私たちを保存します。これが、プログラムの終わりまで減算1操作が残された理由です。

コード構造

  1. 目覚めたヤギのN時間を生成し、コードポイントを1増やします。
  2. 最後のヤギを眠っているヤギに変えます。
  3. すべてのヤギを水平に連結します。コードポイントに1を減算し、charにキャストします。

コメント付きコード

:                              % (Step 1) Implicitly input N. Push range [1 2 ... N]
"                              % For each (i.e. repeat N times)
  '!!((!((!!#*```).?p0```!!!]' %   Push this string. Quotes are escaped by duplicating
  8e                           %   Reshape into an 8-row 2D array of char, in
                               %   column-major order, padding last column with
                               %   char 0
  P                            %   Flip vertically
  !P                           %   Transpose and flip vertically
]                              % End
'p(.'                          % (Step 2) Push this string: source for transliteration
'.a-'                          % Push this string: target for transliteration
XE                             % Transliterate. Transforms last goat into sleeping
&h                             % (Step 3) Horizontally concat all 2D char arrays
qc                             % Subtract 1 and convert to char. 0 becomes −1, which
                               % is converted to char 0, which is displayed as a space
                               % Implicitly display 

8
これはいくつかの深刻なヤギ理論です;)
コナーオブライエン

17

Python 3.6、102バイト

lambda n:f'''{'      \ '*n}
{'  ___/o>'*~-n}  ___/->
{'-(___)" '*~-n},(___)"
{" '' ''  "*~-n} `` ``'''

やあ、f-strings

            __________________________
           / \
          | この答えはbaaaaaaadです。|
      \ / ___________________________ /
  ___ / o> '  
-(___) " 
 '' ''  

13

Javascript、122バイト

回答

f=(n,r='repeat')=>'      \\ '[r](n--)+`
${'  ___/o>'[r](n)}  ___/->
${'-(___)" '[r](n)},(___)"
`+` '' ''  `[r](n)+' `` ``'

サイドノート
次のコード(91バイト)では、ヤギは垂直に配置されています。出力形式に準拠していませんが、出力形式で必要な水平方向の配置にはより多くのバイトが必要であることに注意してください。

f=n=>`
      \\
  ___/${--n?'o':'-'}>
${n?'-':','}(___)"
 ${n?'`` ``':`'' ''`}`+(n?f(n):'')

3
垂直提出を含める理由 課題は水平方向の整列を要求します。
メゴ

5
@Megoどれだけゴルフが可能かを示すことの何が問題になっていますか?
ニール

2
@Neilチャレンジに完全に接しているからです。
メゴ

9
@Mego注意するのは面白いと思います。
コナーオブライエン

3
@Mego面白いかもしれないと思った。投稿を編集して、垂直方向の配置が有効な答えではないことをより明確にしました。
エディ

4

バッチ、234バイト

@echo off
set/pn=
call:l "      \ " "      \"
call:l "  ___/o]" "  ___/-]"
call:l "-(___)@ " ",(___)@"
call:l " '' ''  " " `` ``"
exit/b
:l
set s=%~2
for /l %%i in (2,1,%n%)do call set s=%~1%%s%%
set s=%s:@="%
echo %s:]=^>%

stdinから入力を受け取ります。バッチに問題がある">私はプレースホルダを使用して、最後にそれらを切り替える必要がありますので、様々な理由のために。


set/pnうまくいきませんでした。
コナーオブライエン

^文字をエスケープします。
クリイ

@Kriiは、必要なときに機能しません。
ニール


3

JavaScript(ES6)、110 109バイト

f=
n=>`      \\       \\
  ___/o>  ___/->
-(___)" ,(___)"
 '' ''   `.replace(/^.{8}/gm,"$&".repeat(n-1))+"`` ``"
;
<input type=number min=1 oninput=o.textContent=f(this.value)><pre id=o>

3種類の引用文字すべてをサポートしなければならないのは面倒ですが、幸いなことに@ pinkfloydx33のコメントは、最後にバッククォートを追加して1バイト節約できるというインスピレーションを与えてくれました。


あなたは、途中で引用符の種類を切り替えて、2つの文字列を連結してバイトを保存することができます'+"'' ''"(単一引用符が戻っていると仮定し、私はコメントでコードブロックにバッククォートを取得する方法は考えてきていないためティック)
pinkfloydx33

@ pinkfloydx33私はすでにそれを試したと思っていましたが、その後、最後にバックティックを追加してバイトを節約できることに気付きました。また、コメントコードブロックでバックティックを取得するには、その前にバックスラッシュを付加します。
ニール

セミコロンを削除できます
-howderek

1
@howderek私はそれを含めなかったf=し、バイトカウントにも含めなかった。完全を期すためにある。
ニール

3

GolfScript、91バイト

~:a 1-:b;"      \\ "a*n"  ___/o>"b*"  ___/->"n"-(___)\" "b*",(___)\""n" '' ''  "b*" `` ``"n

入力: 3

出力:

      \       \       \ 
  ___/o>  ___/o>  ___/->
-(___)" -(___)" ,(___)"
 '' ''   '' ''   `` ``

説明

~:a 1-:b;      # Parse and save the input
"      \\ "a*n # Repeat the first line 'a' times
"  ___/o>"b*   # Repeat the head 'b' times
"  ___/->"n    # Then add the sleeping goat's head
"-(___)\" "b*  # Idem
",(___)\""n    #
" '' ''  "b*   # Idem
" `` ``"n      #

オンラインでお試しください!


5
GoatScriptとほぼ誤解
カルビンの趣味

3

ゼリー62 56 バイト

⁶ẋ6;“\   ___/o>-(___)"  '' ''  ”s8
¢“-,o-'`”yЀ
’1£ẋ€ż¢Y

TryItOnlineでテストする

どうやって?

⁶ẋ6;“\   ___/o>-(___)"  '' ''  ”s8 - Link 1: make a goat, niladic
⁶ẋ6                                - space character, ⁶, repeated 6 times
    “\   ___/o>-(___)"  '' ''  ”   - rest of the awake goat text
   ;                               - concatenate
                                s8 - split into length 8 parts

¢“-,o-'`”yЀ - Link 2: put a goat to sleep, niladic
¢            - last link (make a goat)
 “-,o-'`”    - characters to remap
         yЀ - map for each (change "-" into ",", "o" into "-", and "-" into "`"

’1£ẋ€ż¢Y - Main link: n
’        - decrement (nAwakeGoats)
 1£      - call link 1 as a nilad (make an awake goat)
   ẋ€    - repeat nAwakeGoats times
      ¢  - last link (make a sleeping goat)
     ż   - zip
       Y - join with line feeds
         - implicit print

1

PHP、200バイト

$a=["      \ ","  ___/o>",'-(___)" '," '' ''  "," `` ``  "];$z=8*$n=$argv[1];for($i=0;$i<4;)$o.=str_repeat($a[$i],$i++==3?$n-1:$n);$o[$z*2-2]="-";$o[$z*3-8]=",";$o.=$a[4];echo chunk_split($o,$z,"\n");

1
あなたはコーディング方法がきれいすぎます、Jörg。それから32バイトを11ステップでゴルフできました。ヒントが必要ですか?
タイタス

どうにかしてこの課題を解決したいだけです。時々、間違った解決策よりもきれいなほうがよい場合があります。あなたの方法を貼り付けることができます。
ヨルクヒュルサーマン16

私は別のアプローチを取りました。しかし、あなたのためのヒントが必要な場合は、質問してください。最初の5ステップで24バイト。
タイタス

@JörgHülsermann他の人の答えを修正することは、このサイトで非常に嫌われているようです。
発がん性物質

@Carcigenicate他の人からの回答を変更する必要がありますか、またはその逆ですか?この場合のように興味があるだけなら、私は問題をきれいに解決する傾向があります。アスキーアートは通常私の優先事項ではありません
ヨルクヒュルサーマン

1

C ++、180バイト

auto f(int n)
{
string a,b,c,d;
while(n--)
{
a+="      \\ ";
b+="  ___/";b+=n?"o>":"->\n";
c+=n?"-(___)\" ":",(___)\" \n";
d+=n?R"( '' ''  )":" `` ``  \n";
}
return a+'\n'+b+c+d;
}

2
PPCGへようこそ!実際にカウントできるように、1行バージョンを含めてください。いつでも読みやすいバージョンを含めることができるため、人々はワンライナーを読む必要がありません。:)
マーティンエンダー

マーティン、リンクをありがとう。元々はファイルサイズでサイズを測定していましたが、今では修正しています。
ユリイブロック

回答は、実際にファイルサイズで測定する必要があります。私のポイントは、コードが改行なしで機能するため、答えにはそのバージョンを含める必要があるということでした。
マーティンエンダー

さて、ファイルサイズごとにサイズを書きました。このコードの仕組みについて-読み取り可能なバージョンと1行のバージョンに違いはありません。
ユリイブロック

関数をコンパイルせずにコンパイルできない場合、バイトカウント#include <string>とのいずれかusing namespace std;またはusing std::string;バイトカウントを含めないことは有効ではないと思います。
hvd

1

ピップ、60 + 1 = 61バイト

nフラグ用に1バイトが追加されました。

YsX6.\"\   ___/o>-(___)"  '' ''  \"<>8yXa-1.YyR^"-o'"Y^",-`"

目覚めたヤギを行のリストとして作成し、それをにヤンクしyます。a-1目覚めたヤギを取得するために文字列を乗算します。inに置き換え-o'て、最後まで連結します。印刷、改行区切り。,-`y

オンラインでお試しください!

(文字列内\"...\"でリテラルの二重引用符を使用できるPipのエスケープ文字列構文を使用するのはこれが初めてだと思います。)


1

CJam、58バイト

ri{S6*"\   ___/o>,(___)\"  '' ''  "+\{'o`"`-"er}|8/}%W%zN*

オンラインでお試しください!

説明

ri                               e# Read an integer from input
{                                e# Map the following block to the range 0..input-1
 S6*                             e#  Push 6 space characters
 "\   ___/o>,(___)\"  '' ''  "+  e#  Push this string and concatenate with the spaces
 \                               e#  Bring the number being mapped to the top
 {                               e#  If it's 0, execute this block:
  'o`                            e#   Push the string "'o"
  "`-"                           e#   Push the string "`-"
  er                             e#   Transliterate the large string by replacing characters
                                 e#    from "'o" with respective characters from "`-"; this
                                 e#    makes the sleeping goat.
 }|                              e#  (end if)
 8/                              e#  Split the string into chunks of length 8
}%                               e# (end map)
W%                               e# Reverse the array, since the sleeping goat was made at 
                                 e#  the beginning
z                                e# Transpose
N*                               e# Join with newlines

1

Pythonの2.7、101の、113バイト

編集:関数定義を追加しました

def f(n):
 m=n-1
 print "      \ "*n+"\n"+"  ___/o>"*m+"  ___/->\n"+'-(___)" '*n+"\n"+" '' ''  "*m+" ``"*2

脱ゴルフ:

m=n-1              # Replacement variable. Saves 6 bytes
"      \ "*n+"\n"+ # Print ears, same for all goats!
"  ___/o>"*m+      # Print eyes of n-1 awake goat
"  ___/->\n"+      # Print eye of sleeping goat
'-(___)" '*m+      # Print body of n-1 awake goat
',(___)"\n'+       # Print body of sleeping goat
+" '' ''  "*m+     # Print the legs of n-1 awake goat
" ``"*2            # Print legs of sleeping goat using *2 operator to save 1 byte

注Python2.7は、印刷時に括弧を必要としないため、Python3より1バイト短くなっています。


入力を受け取る必要がありn、眠っているヤギの尾の変化を見逃しています(Py 3.6の答えも見ましたか?)。
ジョナサンアラン

こんにちは!テールの変更があり、入力を処理する必要があるかどうかはわかりませんでした。自分で書いた後、Python3.6の答えを見てください。しかし、それは入力を受け取りますか?
tigr

ああ、わかった。プログラムまたは関数のいずれかである必要があります。悪い解決策で更新します、今のところ:(
tigr

うん、機能またはプログラム、あなたはそれを手に入れました!のスペースを削除し、print "...1 ;を使用して2つのステートメントを区切って、すべてを1行に配置できます。示されているゴルフコードにはまだ尾がありませんが、数えたように見えますそのすべてで112バイトになります
ジョナサンアラン

1

05AB1E、66バイト

’      \ 0  ___/1>02(___)" 0 33 33  ’0¡v123SDys…o-'S:I<×?ys…-,`S:,

オンラインでお試しください!

説明

’      \ 0  ___/1>02(___)" 0 33 33  ’0¡v123SDys…o-'S:I<×?ys…-,`S:,   Argument n
’      \ 0  ___/1>02(___)" 0 33 33  ’   The goat, newline replaced by 0 and the eye replaced by 1
0¡                              Split on 0
  v                             For each y in array, do:
   123SD                          Push the array [1,2,3] twice
        ys…o-'S:                  Replace [1,2,3] with ['o','-','\'']
                I<×?              Print that n-1 times without newline
                    ys…-,`S:,     Replace [1,2,3] with ['-',',','`'] and print

0

Bash + GNU Coreutils、165 155バイト

a=" \      
>o/___  
 \")___(-
  '' '' "
eval paste -d \'\' $(seq $1|while read;do
printf '<(echo "$a") '
done) | sed "s/-/,/;s/o/-/;s/'' ''/"'`` ``/'|rev

で実行:

bash my_pgm.bash N

基本的に、プログラムは、同じヤギ(反転)のN回を印刷し、そして最初に置換-するために、,最初oのための-最初'' ''バッククォートのために。次に、行を逆にします。


0

PHP、133 131バイト

for(;$y<32;$y+=8)for($x=$argv[1];$x--;)echo substr("      \   ___/".($x?"o>-(___)\"  '' ''  ":"->,(___)\"  `` ``  "),$y,8),"
"[$x];

カーリーのないバージョンの1つから2バイトのゴルフを見つけました。


0

PowerShell v2 +、96バイト

param($n)'      \ '*$n--
'  ___/o>'*$n+'  ___/->'
'-(___)" '*$n+',(___)"'
" '' ''  "*$n+' `` ``'

(ab)デフォルトのWrite-Output書式設定を使用して、要素間に改行を含めます。文字列の連結と乗算を利用して、ヤギを1行ずつ作成します。唯一の本当のトリックは、最初の行で$n--正しい数の耳を出力し、ポストデクリメント$nして残りの行が正しいようにすることです。

PS C:\Tools\Scripts\golfing>  1..4|%{.\counting-goats-to-sleep.ps1 $_}
      \ 
  ___/->
,(___)"
 `` ``
      \       \ 
  ___/o>  ___/->
-(___)" ,(___)"
 '' ''   `` ``
      \       \       \ 
  ___/o>  ___/o>  ___/->
-(___)" -(___)" ,(___)"
 '' ''   '' ''   `` ``
      \       \       \       \ 
  ___/o>  ___/o>  ___/o>  ___/->
-(___)" -(___)" -(___)" ,(___)"
 '' ''   '' ''   '' ''   `` ``

0

ルビー、102バイト

m=-1+n=gets.to_i
puts'      \ '*n,'  ___/o>'*m+'  ___/->',(?-+a='(___)" ')*m+?,+a," '' ''  "*m+" ``"*2

0

Python 3. 170バイト

lambda n:'\n'.join(map(lambda*l:''.join(l),*map(lambda w:(' '*6+'\ ','  ___/'+(w and'o'or'-')+'>',(w and'-'or',')+'(___)" ',w and" '' ''  "or' `` ``  '),range(n)[::-1])))

うーん、どうやらリスト操作をせずに文字列を構築すると、コードが短くなります


0

IBM / Lotus Notesの式、187 174 188バイト(競合しない)

編集そこにあるべきではないスペースを見つけ、不要な@Implodeを削除しました

188私は眠っているヤギの尾が異なるという事実を見逃していたように:-(

B:=@Repeat("      \\  ";a);C:=@Repeat("     /o> ";a-1)+"     /->";D:=@Repeat("  ---    ";a);E:=@Repeat(",(___)\"  ";a);F:=@Repeat(" `` ``   ";a);@Implode(B:C:D:E:F;@NewLine)

ゴルフをしていない:

B:=@Repeat("      \\  ";a);
C:=@Repeat("     /o> ";a-1)+"     /->";
D:=@Repeat("  ---    ";a);
E:=@Repeat("`(___)\"  ";a-1)+",(___)\"  ";
F:=@Repeat(" `` ``   ";a);
@Implode(B:C:D:E:F;@NewLine)

使用法:

aおよびgという名前の2つのフィールドを持つNotesフォームを作成します。

a =編集可能、数値、g =計算済み、テキスト。

上記の式をgに貼り付け、デフォルト値0を指定します。

フォームフォントをターミナルに設定します。

フォームを使用して新しいドキュメントを作成し、aに数値を入力してF9を押し、ヤギを更新します。

サンプル:

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ヤギの数がページの幅に達すると、形式が乱れるため、競合しません。

無限に広い画面を考えると、それはすべきである山羊の任意の数のために働くだろうけれども。これは、ページの幅が十分でない場合の外観です。

ここに画像の説明を入力してください


なぜ競合しないのですか?すべての答えはそのようなものです。それはラッピングと呼ばれます。
mbomb007

@ mbomb007の説明をありがとう。正直になり、私よりも良いゴルファーを軽視しないようにしました。私はこれが初めてです。了解しました。勝つことはできませんが、フォーミュラ言語で私を打ち負かすほどロータスノーツのゴルファーが多すぎることはないと
思います☺– ElPedro

正直に言うと、ロータスノーツのゴルファーはそれほど多くはないと思います。
エルペドロ

0

Emacs Lisp、241バイト

(defvar s'("     \\""  ___/->"",(___)\""" `` ``"))(defun a()(dotimes(n 4 g)(setf(nth n g)(format"%s%s"(nth n'("     \\  ""  ___/o>""-(___)\" "" '' ''  "))(nth n g)))))(defun g(n)(let((g(copy-seq s)))(mapcar'message(dotimes(i(- n 1)g)(a)))))

「わずかに食べられない」

(defvar s'("     \\""  ___/->"",(___)\""" `` ``"))
(defun a()(dotimes(n 4 g)(setf(nth n g)(format"%s%s"(nth n'("     \\  ""  ___/o>""-(___)\" "" '' ''  "))(nth n g)))))
(defun g(n)(let((g(copy-seq s)))(mapcar'message(dotimes(i(- n 1)g)(a)))))

どこにs眠っているヤギがいるのかa、覚醒しているヤギを追加しg(n)、カウント機能です。


0

ジャワ8、236の 222 218 173バイト

n->{String x="\n",a="",b=a,c=a,d=a;for(;n-->0;a+="      \\ ",b+="  ___/"+(n<1?"-":"o")+">",c+=(n<1?",":"-")+"(   )\" ")d+=(n<1?" `` ``":" '' ''")+"  ";return a+x+b+x+c+x+d;}

説明:

オンラインでお試しください。

n->{                                // Method with integer parameter and String return-type
  String x="\n",                    //  New-line String to reduce bytes
         a="",                      //  Row 1 String, starting empty
         b=a,                       //  Row 2 String, starting empty
         c=a,                       //  Row 3 String, starting empty
         d=a;                       //  Row 4 String, starting empty
  for(;n-->0;                       //  Loop `n` times:
    a+="      \\ ",                 //   Append the horns to row 1
    b+="  ___/"+(n<1?"-":"o")+">",  //   Append the back and head to row 2
    c+=(n<1?",":"-")+"(   )\" ")    //   Append the tail, body, and beard to row 3
    d+=(n<1?" `` ``":" '' ''")+"  ";//   Append the legs to row 4
  return a+x+b+x+c+x+d;}            //  Return the four rows, separated by new-lines

0

Canvas、58 バイト

>o/___¶ ")___(-∙ \;∔± ''2×∔╶╷×>-/___¶ ")___(,∙ \;∔± ``2×∔+

オンラインでお試しください!

かなり退屈な答え、本当に...目を覚ましヤギを構築し、水平方向にそれを繰り返しn-1、寝ているヤギを構築して追加し、結果を印刷します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.