ピッチでのサッカーチームの編成を示す


13

サッカーは、プレーヤーがボールを蹴るのではなく、蹴るスポーツです。一部の混乱した個人は、このサッカーを呼ぶかもしれません。


サッカーチームには、ゴールキーパーが1人、ピッチに10人の選手がいます。サッカーでは多くのフォーメーションが使用されており、各プレーヤーの位置が決まります(もちろんプレーヤーは動き回りますが、それは基本位置です)。

最も一般的なフォーメーションは4-4-2です。つまり、4人のディフェンダー、4人のミッドフィールダー、2人の攻撃者がいます。その他のフォーメーション(「ディフェンダー、ミッドフィールダー、攻撃者」または「ディフェンダー、ミッドフィールダー、ミッドフィールダー、攻撃者」):

  • 4-4-2
  • 4-3-3
  • 5-3-2
  • 3-4-3
  • 3-5-2
  • 4-5-1
  • 5-4-1
  • 4-4-1-1
  • 4-3-1-2
  • 4-1-2-3
  • 4-1-3-2
  • 4-3-2-1
  • 3-4-1-2
  • 3-3-3-1

課題は、2つのチームのそれぞれに1つずつ、2つの入力を取得し、フィールド上の選手の概要を出力することです。

一般的に、ASCIIアートのレイアウトに関するほとんどの情報は図にあります(図は1000語以上を示しています)。10人のプレーヤーをフィールドに配置する方法のみを詳細に説明します。

  • キーパーとペナルティエリアは、ASCII文字の3行を占有します
    • 下の図にレイアウトとスペースの数を示します
  • ペナルティエリアとディフェンダーの間に空の行はありません
  • フォーメーションに3つの数字がある場合(4-4-2、4-3-3など。4-3-2-1ではありません):
    • ディフェンダーとミッドフィールダーの間に空の列はありません
    • ミッドフィールダーと攻撃者の間に1つの空の行があります
  • フォーメーションに4つの数字がある場合(例4-4-2-1、3-3-3-1など。4-4-2ではない):
    • ディフェンダーとミッドフィルダーの最初の列の間に空の列はありません
    • ミッドフィルダーの最初の行と2番目の行の間に空の行はありません
    • ミッドフィールダーの2列目と攻撃者の間に空の列はありません
  • 攻撃者と中心線の間に空の行はありません
  • 上半分のチームはとしてマークされx、後半のチームはとしてマークされoます。
  • プレーヤーの各列は、下の図に示すようにピッチ上に配置されます。スペースの数は図で見ることができます。

次の図は有効なフォーメーションを表すものではありませんが、各プレーヤー間のレイアウトと必要なスペースの数を示すために使用されます。これに対する入力は2 3 4 5andになり5 4 2ます。

+-----------------+
|     |  x  |     |
|     +-----+     |
|     x     x     |
|    x   x   x    |
|  x   x   x   x  |
|  x  x  x  x  x  |
+-----------------+
|     o     o     |
|                 |
|  o   o   o   o  |
|  o  o  o  o  o  |
|     +-----+     |
|     |  o  |     |
+-----------------+ 

有効な例:

Input:
4 4 2, 5 3 1 1


+-----------------+
|     |  x  |     |
|     +-----+     |
|  x   x   x   x  |
|  x   x   x   x  |
|                 |
|     x     x     |
+-----------------+
|        o        |
|        o        |
|    o   o   o    |
|  o  o  o  o  o  |
|     +-----+     |
|     |  o  |     |
+-----------------+

Input:
3 5 2, 4 4 1 1


+-----------------+
|     |  x  |     |
|     +-----+     |
|    x   x   x    |
|  x  x  x  x  x  |
|                 |
|     x     x     |
+-----------------+
|        o        |
|        o        |
|  o   o   o   o  |
|  o   o   o   o  |
|     +-----+     |
|     |  o  |     |
+-----------------+

ルール:

  • 入力は任意の便利な形式で、必要に応じて区切ることができます。形式は、単一の文字列(5311)、コンマ区切りの数字(5,3,1,1)などです。
    • 入力には、2つのフォーメーション以外の情報を含めないでください
  • 出力はサンプルの図とまったく同じように見えるはずですが、末尾のスペースと改行は問題ありません。
  • 有効な入力のみが与えられていると想定できます(リスト内のフォーメーションのみが使用されます)。
  • 完全なプログラムまたは機能

これはコードゴルフなので、バイト単位の最短コードが勝ちます。


1
サッカーは棒を持っているものですよね?
メゴ

いいえ、それはシャッフルボードです。あなたはポニーを持つものが欲しいです。
ジオビット

1
いいえ、それは馬場馬術です。目標のあるものが必要です。
モーガンスラップ

4
何!ミドルフィールドサークルはありませんか?
ルイスメンドー

2
@LuisMendo、ちょうどストークの雨の日だと仮定してください!中央フィールドの円を見つけるのが難しい場合が多い= P
Stewie Griffin

回答:


1

JavaScript(ES6)、258 262

2つのパラメーターを数値配列としてとる無名関数

(a,b,H=f=>(f[3]||f.push(0,f.pop()),[z='+-----------------+',...[6,7,...f].map(x=>`|${'98,8o8,5o5o5,4o3o3o4,2o3o3o3o2,2o2o2o2o2o2,5|2o2|5,5+-----+5'.replace(/\d/g,x=>' '.repeat(x)).split`,`[x]}|`),'']))=>H(a).join`
`.replace(/o/g,'x')+z+H(b).reverse().join`
`

テスト

F=(a,b,
   H=f=>(
    f[3]||f.push(0,f.pop()),
    [z='+-----------------+',...[6,7,...f].map(x=>`|${'98,8o8,5o5o5,4o3o3o4,2o3o3o3o2,2o2o2o2o2o2,5|2o2|5,5+-----+5'.replace(/\d/g,x=>' '.repeat(x)).split`,`[x]}|`),'']
   )
)=>
  H(a).join`\n`.replace(/o/g,'x')+z+H(b).reverse().join`\n`

  
function test() {
  var f1=F1.value.match(/\d+/g),f2=F2.value.match(/\d+/g)
  O.textContent=F(f1,f2)
}

test()
x <input id=F1 value='4,4,2' oninput='test()'><br>
o <input id=F2 value='4,3,1,2' oninput='test()'><br>
<pre id=O>


2

Python 2、401 377バイト

def g(x,o):
 r=lambda r:["|"+"  x"*5+"  |","|        x        |","|     x     x     |","|    x   x   x    |","|  x   x   x   x  |"][r%5];d="+"+"-"*17+"+";h=[d,"|     |  x  |     |","|     +-----+     |"]+map(r,x);b=map(lambda r:r.replace("x","o"),[s for s in h[:3]]+map(r,o))[::-1];e="|"+" "*17+"|"
 if len(x)-4:h.insert(5,e)
 if len(o)-4:b.insert(1,e)
 print"\n".join(h+[d]+b)

テスト環境のあるゴルフバージョンはこちら

1つのミッドフィールダー番号はオプションですが、[ディフェンダー、ミッドフィールダー、ミッドフィールダー、アタッカー]という形式の2つのリストを取る関数。チームX(上)が最初に、チームO(下)が2番目になります。


ラムダの1つに無駄なスペースがありますlambda a:r(a), x)^^
Erwan

@Erwanありがとう、良いキャッチ!
デンカー

t=lambda a:r(a) 2回使用すると定義するのは最悪だと思います
-Erwan

より良い解決策はlambda a:r(a)、それによって置き換えられるすべての発生を削除しますr
Erwan

@Erwanありがとう、それも逃した!
デンカー

1

Perl、360 332 324バイト

sub f{$q="";($_,$p)=@_;@x=/\S+/g;splice@x,2,0,0if@x<4;for(@x) {$s=(17-$_)/($_+1);$s=$=+1if($s!=($==$s));$x=$"x$=;@a=();push@a,$p for 1..$_;$q.=$_==0?"|$u$u$u  |\n":"|$x".join($"x$s,@a)."$x|\n"}$q}($k,$j)=<>;$u=$"x5;$^="-"x17;$i="|$u+-----+$u|";say"x$^x\n|$u|  x  |$u|\n$i\n".f($k,x)."+$^+".(reverse f$j,o)."\n$i\n|$u|  o  |$u|\nx$^x"

が必要-E| -M5.010

$ echo $'4 4 2\n4 4 1 1' | perl -M5.010 football.pl
x-----------------x
|     |  x  |     |
|     +-----+     |
|  x   x   x   x  |
|  x   x   x   x  |
|                 |
|     x     x     |
+-----------------+
|        o        |
|        o        |
|  o   o   o   o  |
|  o   o   o   o  |
|     +-----+     |
|     |  o  |     |
x-----------------x

やや自由:

sub f{
    $q="";
    ($_,$p)=@_;
    @x=/\S+/g;
    splice@x,2,0,0if@x<4;
    for(@x) {
        $s=(17-$_)/($_+1);
        $s=$=+1if($s!=($==$s));
        $x=" "x$=;
        @a=();
        push@a,$p for 1..$_;
        $q.=$_==0?"|$u$u$u  |\n":"|$x".join(" "x$s,@a)."$x|\n"
    }
    $q
}

($k,$j)=<>;
$u=" "x5;
$^="-"x17;
$i="|$u+-----+$u|";
say"x$^x\n|$u|  x  |$u|\n$i\n".f($k,x)."+$^+".(reverse f$j,o)."\n$i\n|$u|  o  |$u|\nx$^x"

@ edc65それは間違っている私の出力例だけです:S
andlrc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.