ボウリング隊形を描く


44

あなたの目標は、一部のピンだけが残っている10ピンボウリングでフォーメーションのASCIIアートを表示することです。最少バイトが勝ちます。

10個のピンは三角形の形をしています。

O O O O         
 O O O   
  O O       
   O

ピンには1〜10のラベルが付いています。

7 8 9 10    
 4 5 6            
  2 3    
   1

ピンをとして描画し、ピンをとして描画Oしない.場合、フォーメーション1 3 5 6 9 10は次のとおりです。

. . O O         
 . O O    
  . O       
   O

入力:

1から10までの数字の空でないサブセットを順番にリストするスペース区切りの文字列。

出力:

対応するフォーメーションを印刷するか、改行付きの文字列として出力します。

フォーメーションは画面の左側と同じ高さになるはずです。可視画像が正しい限り、空白は問題ありません。前後の空の行も問題ありません。

テストケース:

>> 1 2 3 4 5 6 7 8 9 10

O O O O    
 O O O    
  O O    
   O

>> 7 10

O . . O    
 . . .   
  . .   
   .

>> 3 5 7 9 10

O . O O    
 . O .    
  . O    
   .

>> 1

. . . .    
 . . .    
  . .    
   O       

少なくとも1つのピンがあることを保証できますか?空の入力でチョークができれば、文字が保存されます。
地下

1
@undergroundmonorailすでに保証されています:「空でないサブセット」
-xnor

私はそれを見逃しました、ありがとう:)
地下

[コードボウリング]?:P
mbomb007

回答:


17

brainfuck- 617 616 604バイト

+>>>>,[>++++[<-------->-]<[>>>>],]<<<<[>+<<+<+>>-]<[>+<-]+<+<<[>+>-<<-]>[<+>-]>[,+++++[>+++++<-]>>[<->-]<[>>>>>[>>>>]+[<<<<]<-]>>[<+>-]<<<]>[>>[,<]<<+++++++++<]<<<[-[+>>-<]>[>>[<+<+>>-]<<<<[>+>-<<-]>[<+>-]>[<<[<<<<]>>>>[[<<<<+>>>>-]>>>>]<<<<+>>-]>[>+<-]]<<<[-[+>]+<<<<]>>>>-<<<<<]>>>>>+++++[>----<-]>->[<+>>+<-]<[<<<[<<<<]+[>>>>]<-]>>[<+>-]<[<<<<]>>>++++[<-------->-]>[-[,+++>]+>>>[<<<->>]>]<<<<<[>-]>[>>]>>+[<++++[<++++++++>-]<]>>[+++++++++++++>>>>]<<<<----<+++[<<+<<[<<+<<]+[>>>>]<<<<-]<<<<[-<<<<]>[.,>>]<<<<<[<<<<]<++++++++++<<.<+<<+<<+<<+<<+<[.,>>]<<<<<[<<]>++++++++++<+<<+<<+<..<+<[.,>>]<[<<]<...<<.

これは私に2日間の大半を費やした。価値があったと思う。おそらく、どのセルに何を格納するかなどを変更することで、もっとゴルフをすることができる部分がありますが、今のところ、私はそれを機能させて満足しています。

質問で入力がソートされることを指定していない場合、このプログラムは完全に異なっている必要があります。これが機能する方法は、入力されるピンの周りに10個のピンのリストを作成することです。それはちょっと紛らわしいですが、おそらくこれはそれをより良く説明するでしょう:

If you input these pins:           [2, 3, 6, 8, 9]
First, the program does this:      [2, 3, 6, 8, 9] + [10]
Then this:                         [2, 3, 6] + [7] + [8, 9, 10]
Then this:                         [2, 3] + [4, 5] + [6, 7, 8, 9, 10]
Finally, this:                     [1] + [2, 3, 4, 5, 6, 7, 8, 9, 10]
To build this:                     [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

それを行っている間、ユーザーがそこに置いたピンとそこに置いたピンを覚えています。入力がソートされていない場合、この戦略を使用するのは非常に困難です。

ソートが簡単になるもう1つのことは、数値10の検出です。brainfuckは「数値」そのものではなく、個々のバイトを処理するため、お尻が痛いかもしれませんが、ソートされた入力により処理がはるかに容易になりましたと。その理由は、プログラムにデータを保存する方法に関係しています。入力を一度に1文字ずつ取り、結果から32を引きます。その後、セルがゼロ以外であれば、4セル進みます。繰り返す前に。これは、4セルごとに非スペースバイトの入力を取得し、ピンを事実上その数+ 16として格納することを意味します。ただし、10は入力に2バイトかかるため、特別な場合がありました。入力がソートされていない場合、ピンを調べる必要がありますが、ソートされているため、表示される場合は常に最後のピンになります。(入力の最後のバイト+ 1)==(入力の最後から2番目のバイト)であるかどうかをチェックし、そうであれば、10でなければなりません。最後のバイトを取り除き、最後から2番目のバイトをシステムが理解するものに設定します「10」。キャラクター'1'そして'0'、1バイトに収まらないが、26番は確かに収まります!

何かをうまく機能させるためだけにトリックを考え出すことは、この言語を使用する私のお気に入りの部分です。:)

このプログラムがどのように機能するかについて詳しく知りたい場合は、作成中に使用したコメントとともにプログラムを確認し、すべてが何をしたかを確認してください。コメント構文はないので、brainfuckでコメントを書くことさえ困難です。代わりに、以外のすべての文字<[+.,-]>はノーオペレーションです。誤ってコメントを追加したり、コメントに追加し.たり,すると、バグを簡単に導入できます。それが文法がとても不安定で、セミコロンが至る所にある理由です。

編集:これがいかに簡単かを示す例として、コメントの1つで「スペースなし」を使用しました。ソースからすべての非bf文字を削除したとき、それを行うために使用したプログラムはに保持されました-。幸いなことに、何も壊れませんでしたが、バイトを節約するために削除しました。:)

編集II:これに触れてからしばらく経ちました(笑)。このサイトの別のブレインファックの回答で、コメント版で誤ってコンマを使用したことに気付きました。入力はすでに使い果たされているため、現在のセルを0に設定します(これは実装に依存しますが、私の経験では最も一般的な動作です)。バグを修正しましたが、考えさせられました。セルを0に設定する慣用的な方法は[-](大まかにwhile (*p) { *p--; })2バイト長いです。すべての入力が読み取られるたびに、,代わりに使用できます。これにより、その回答で2バイト、この回答で12バイト節約できました。

one flag at the very left; will be important later
+>>>>

all nonspace bytes of input separated by 3 empty cells; pin number `n` stored with value `n` plus 16
,[>++++[<-------->-]<[>>>>],]<<<<

test if last pin is 10
[>+<<+<+>>-]<[>+<-]+<+<<[>+>-<<-]>[<+>-]>

[
    if not: find 10 minus the number it is; put that many placeholder pins (cells with value 1) at the end
    ,+++++[>+++++<-]>>[<->-]<[>>>>>[>>>>]+[<<<<]<-]>>[<+>-]<<<
]>


[
    if so: get rid of '0' byte; convert '1' byte to 26 (10 plus 16)
    >>[,<]<<+++++++++<
]<<<

pointer now sitting on the cell with the second greatest pin that was inputted (ie not a placeholder)

;;;;;;;

[
    check for flag placed at the very beginning of the program; if present: break
    -[+>>-<]>
    [
        find ((pin to our right) minus 1) minus pin to our left
        move all pins left of us 4*(that value) cells and insert placeholder pins
        >>[<+<+>>-]<<<<[>+>-<<-]>[<+>-]>[<<[<<<<]>>>>[[<<<<+>>>>-]>>>>]<<<<+>>-]>[>+<-]
    ]

    find first non placeholder pin to our left
    there has to be one because we haven't hit the flag yet
    <<<[-[+>]+<<<<]>>>>-<<<<<
]>>>>>+

we have now added placeholder pins at the end and in the middle; all that's left is the beginning

subtract 17 from lowest pin and put that many placeholders to the left
++++[>----<-]>->[<+>>+<-]<[<<<[<<<<]+[>>>>]<-]>>[<+>-]

subtract 32 from an empty cell 2 to the left of the lowest pin; will be useful later
<[<<<<]>>>++++[<-------->-]>

placeholder pins have the value 1; real pins have a value somewhere between 17 and 26
normalize it by stepping through and setting every pin with value != 1 to 3 (0's ascii code is 2 higher than period so this will make it easier to print later)
[-[,+++>]+>>>[<<<->>]>]<<<<<[>-]>[>>]>>

start writing 32s across the board; hitting every second cell
that's every pin and the cell 2 to the right of each pin
this is done in such a way that it will only halt if adding 32 to a cell sets it to 0; which is why we subtracted 0 from an empty cell earlier
it will catch us and prevent an infinite loop
+[<++++[<++++++++>-]<]

now write 13 to each pin; this adds up to 46 or 48; which are exactly the ascii values we want
>>[+++++++++++++>>>>]

we happen to have made a 14; turn it into a 10 for a newline
<<<<----

we're so close now; i can taste it
we have a list of 10 pins; each one with the ascii value that needs to be written
we have 32 everywhere because we'll need spaces
we even have a newline

the only problem now is that our list looks like this:
;;;;;;;;;;;;;;;;;;;;;;;;
;;1 2 3 4 5 6 7 8 9 10;;
;;;;;;;;;;;;;;;;;;;;;;;;

and we need to print in this order:
;;;;;;;;;;;;;;;;;;;;;;;;
;;7 8 9 10 4 5 6 2 3 1;;
;;;;;;;;;;;;;;;;;;;;;;;;

it's a pretty simple fix
once we print a pin we obviously don't need to remember it any more
so we simply print the last 4 pins on the list; destroying them on the way
then we print the last 3; which have become the ones we want
then two; then one
<+++[<<+<<[<<+<<]+[>>>>]<<<<-]<<<<[-<<<<]

print pins 7 8 9 10
>[.,>>]

print pins 4 5 6
<<<<<[<<<<]<++++++++++<<.<+<<+<<+<<+<<+<[.,>>]

print pins 3 2
<<<<<[<<]>++++++++++<+<<+<<+<..<+<[.,>>]

print the final pin!! :)
<[<<]<...<<.

14

Python 2、108バイト

def f(x):
 for i in 4,3,2,1:print" "*(4-i)+" ".join(".O"[i*~-i/2-~z in map(int,x.split())]for z in range(i))

で呼び出しf("3 5 7 9 10")ます。

iは行番号です。4が最初の行で、1が最後の行です。zはその行のn番目のピンです。0は行の最初のピンであり、行i-1の最後のピンであることを意味します。

主なハックはi*~-i/2-~z、変換し(i, z) -> pin numberます。たとえば、(4, 0) -> 7ピン7は行4(最初の行)の最初のピンです。派生は次のようになります。

  • 私たちは、関数が取るしたいi行の最初のピンにi、すなわち4 -> 7, 3 -> 4, 2 -> 2, 1 -> 1。これはによって満たされ(i**2-i)/2 + 1(i**2-i)/2 + 1 + z入力用の正しいピン番号を提供します(i, z)

  • 次に、単純化します。

(i**2-i)/2 + 1 + z
  = (i*(i-1))/2 + 1 + z
  = i*~-i/2 + 1 + z
  = i*~-i/2-~z

Pyth、33バイト

V4~Z-4N+*dNjdm@".O"}+d-11Zrz7U-4N

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

プログラムは大まかに次のように変換されます。

z = input()
Z = 0

for N in range(4):
  Z += 4-N
  print(" "*N + " ".join(".O"[d+11-Z in map(int, z.split())] for d in range(4-N)))

(ヒントについてはisaacgに感謝します)


Pythコードは、次の2つの方法でゴルフすることができます。V4FNU4、とrz7同等mvkcz\ です。
isaacg 14

あははありがとう。私はまだドキュメントに慣れているわけではないので、ドキュメントを常に確認することなくPythにはいません。
Sp3000 14

完全なプログラムとして107バイト
FlipTack

9

ピス、31

V4+*dNjdm?\O}+7+dZrz7\.rN4~Z-N4

ここで試してみてください

V4 Nが[0,1,2,3]の変数としてforループを設定します。

*dNはスペースであるため、初期スペースを提供しますd

ピンの位置を見つけるには、+7+dZ-7 + d + Zを使用します。

d は:

0 1 2 3
 1 2 3
  2 3
   3

一方Z、1行目は0、2行目は-4、3行目は-7、4行目は-9です。これはZ、0から始まり、4、次に3、次に2 ずつ~Z-N4減少Zするためです。

次に、を使用して、ピンの位置が入力内にあるかどうかを確認し}+7+dZrz7ます。rz7list-of-int形式の目的のピンです。

次に、O存在する場合は作成し、存在し.ない場合は作成します。これは、スペースで区切られ、でjd暗黙的に印刷されます。


5

Perl 5:51(50 + 1の場合-p

最近のperl 5の追加の1つであるrフラグの使用s///

#!perl -p
$_="7890
 456
  23
   1
"=~s!\d!'. '^a
x/$&\b/!egr

5

CJam、48 41バイト

うわー、これは恐ろしく長くなった

"6789345 12  0"S*7/N*[l~]:(s"O"erA,s"."er

ここでテストしてください。

説明

まず、レイアウトを生成します。

"6789345 12  0"       "Push this string.";
               S*     "Riffle with spaces.";
                 7/   "Split into substrings of length 7.";
                   N* "Join with newlines.";

これにより

6 7 8 9
 3 4 5 
  1 2  
   0

そして、入力に従って数字を置き換えます:

[l~]                 "Read the input and turn it into an array of integers.";
    :(s              "Decrement each number and turn the array into a string of digits.";
       "O"           "Push this string.";
          er         "Character transliteration, replaces the input digits with O.";
            A,s      "Create the string '0123456789'.";
               "."   "Push this string.";
                  er "Character transliteration, replaces all remaining digits with periods.";

"789A456S23SS1":~S*7/N*[l~]'OerB,'.er少し短いです。
デニス

@デニスありがとう。er当時、アレイにオートキャスティングしていたかどうかは完全にはわかりません。
マーティンエンダー

ああ、そう。これは0.6.4で実装され、この質問よりも若いです。"789A456S23SS1":~S*7/N*[l~]"O"erB,"."er0.6.2で正常に動作します。
デニス

5

Python 2、97 94

これは変換関数を使用します。これにより、文字列で文字ごとの置換を行うことができます。perlのtrと似ていますが、入力するのがはるかに長くなります。9から99乗の文字列を作成して、10進数のリストを取得します。

lambda a:u"7890\n 456\n  23\n   1".translate({ord(n):u'.O'[n+' 'in a+' ']+' 'for n in`9**99`})

5

Javascript、155

最初のゴルフは、おそらく短くすることができます。

function f(i){q='replace',s='7 8 9 0\n 4 5 6\n  2 3\n   1';alert(s[q](RegExp(i[q]('10','0')[q](/ /g,'|'),'g'),function(a){return a?'O':a})[q](/\d+/g,'.'))}

で呼び出す

f('1 2 3 4 5 6 7 8 9 10')
f('1 5 10')
f('')

編集

ES6バージョン、130

f=i=>{q='replace',s='7 8 9 0\n 4 5 6\n  2 3\n   1';alert(s[q](RegExp(i[q]('10','0')[q](/ /g,'|'),'g'),a=>a?'O':a)[q](/\d+/g,'.'))}

編集

ES6バージョン、79が失敗する

f=i=>alert('7890\n 456\n  23\n   1'.replace(/\d/g,a=>i.indexOf(a)<0?'. ':'O '))

ES6バージョン、72 77、アラートなし、戻ります

f=i=>'7890\n 456\n  23\n   1'.replace(/\d/g,a=>i.search(a+'\\b')<0?'. ':'O ')

1
79と72は壊れており、両方とも入力10
edc65で

@ edc65おっと、ありがとう、修正。
赤X

ああ、単語境界文字の巧妙な使用法で、まったく同じものを思いつきました(使用法を除く.match)。これはそれらの中で最もエレガントです。
ninjagecko

4

ルビー、91

x=(1..10).map{|i|i.to_s==$*[0]?($*.shift;?0):?.}
4.times{|i|puts (x.pop(4-i)*' ').center 8}

コマンドライン引数を単に.sと0sに置き換え、4サイクルのループを使用して印刷します。

読みやすいバージョン

x = (1..10).map do |i|
  if i.to_s == ARGV[0]
    ARGV.shift
    "0"
  else
    "."
  end
end

4.times do |i|
  row = x.pop(4 - i)
  puts row.join(' ').center 8
end

4

GNU sed、75

  • @Jordanのおかげで6バイト節約されました。

スコアには-rオプションの追加が1つ含まれています:

s/^/7 8 9 10\
 4 5 6\
  2 3\
   1 /
:
s/([0-9]+)(.*)\1/O\2/
t
s/[0-9]+/./g

STDINを介した入力:

$ echo 3 5 7 9 10 | sed -rf ./bowling.sed
O . O O
 . O .
  . O
   .    
$ 

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


GNU sedでは空のラベルが許可されるためlsをドロップすることで2バイトを節約できます。
ヨルダン

また、あなたが変更した場合010、ライン2上1/1 /ライン5に、そして[0-9][0-9]+ライン7,9上の最初の行ドロップすることができ、4バイトのために。
ヨルダン

@Jordan Cool- 誰かがすでにヒントを出しました。ああ待って... ;
デジタル外傷

3

CJam、40 39バイト

4,Sf*'-A*[q~]{('ot}/3,{)/(\s}%Sf*W%]zN*

短い方法があることは知っていますが、今のところそれを理解する時間はありません。

使い方:

4,Sf*'-A*[q~]{('ot}/3,{)/(\s}%Sf*W%]zN*
4,                                          "Get the array [0,1,2,3]";
  Sf*                                       "Covert each number to that many spaces to";
                                            "get ["", " ", "  ", "   "] array";
     '-A*                                   "String '----------'";
         [q~]                               "Input numbers in an array";
             {    }/                        "For each input number";
              ('ot                          "Put 'o' at the corresponding index";
                    3,                      "Array [0,1,2]";
                      {     }%              "For each of the above number";
                       )                    "Increment the number";
                        /                   "Split the string into pieces of that length";
                         (\s                "Take the first string and join the rest back";
                              Sf*           "Riffle each string in array with space";
                                 W%         "Reverse the array of strings";
                                   ]z       "Zip together the space array and this one";
                                     N*     "Join by new line";

こちらからオンラインでお試しください


3

APL(35)

⊖4 7⍴'.O'[1+⎕∊⍨⍳10]\⍨17110357⊤⍨28/2

テスト:

      ⊖4 7⍴'.O'[1+⎕∊⍨⍳10]\⍨17110357⊤⍨28/2
⎕:
      1 3 5 6 9 10
. . O O
 . O O 
  . O  
   O   

説明:

  • 17110357⊤⍨28/2:の28ビット表現17110357

          4 7⍴17110357⊤⍨28/2
    0 0 0 1 0 0 0
    0 0 1 0 1 0 0
    0 1 0 1 0 1 0
    1 0 1 0 1 0 1
    
  • \⍨:ごと0に、スペースを入れ、毎1に、左側の文字列からアイテムを取得します。

  • ⎕∊⍨⍳10:キーボードから行を読み取って評価し()、1から10までのすべての数字(⍳10)が入力に含まれているかどうかをチェックします(∊⍨)。
  • '.O'[1+... ]:すべての値に1を追加し(0と1ではなく1と2を指定)、すべての1を.2ごとに置き換えOます。
  • 4 7⍴:生成された文字列を4行7列の行列に変換します
  • :水平に反転

3

Powershell:109

入力は$ iにあります

(7..10),(4..6),(2,3),1|%{$c=0}{$_|%{$o=(" "*$c++)}{$o="$o $(if($i.split() -contains $_){'O'}else{'.'})"};$o}

それは楽しかった。パイプラインの仕組みについても多くのことを学びました。


3

Haskell:163160バイト

これは、からスペースで区切られた数字の行を受け入れますstdin

m=map
y?x|x`elem`y="O "|0<1=". "
f y=putStr.unlines.zipWith(++)(m(`replicate`' ')[0..])$m(concat.m(y?))[[7..10],[4..6],[2,3],[1]]
main=getLine>>=f.m read.words

ゴルフをしていない:

layout :: [[Int]]
layout = [[7,8,9,10]
         ,[ 4,5,6  ]
         ,[  2,3   ]
         ,[   1    ]
         ]

indentBy :: Int -> String
indentBy n = replicate n ' '

indentLines :: [String] -> [String]
indentLines
  = zipWith (++)
            (map indentBy [0..])

bowling :: [Int] -> String
bowling pins
  = unlines
  . indentLines
  $ map (concatMap showPlace)
        layout
  where
    showPlace :: Int -> String
    showPlace index
      | index `elem` pins = "O "
      | otherwise         = ". "

parseInput :: String -> [Int]
parseInput = map read . words

main :: IO ()
main = do
  pins <- fmap parseInput getLine
  putStr (bowling pins)

そしてボーナス:

C:250バイト

このバージョンでは、コマンドライン引数が数字のリストであると想定しています。

#define w int
main(w
z,char**a){w
b[10]={1,3,2,6,5,4,10,9,8,7};w
q=9;for(w
k=4;k>0;--k){w
i;for(i=0;i<4-k;++i)printf(" ");for(i=0;i<k;++i,--q){w
g=0;w
c;for(w
p=1;p<z;++p){sscanf(a[p],"%d",&c);g|=b[q]==c;}c=g?'O':'.';printf("%c ",c);}printf("\n");}}

2

Perl、73

$_="7 8 9 10\n 4 5 6\n  2 3\n   1";for$v(<>=~/\d+/g){s/$v/O/g};s/\d+/./g;print

そして、うまくいかなかった間抜けなボーナスアプローチ、90文字:

srand(1488068);$i=<>;print+(($i=~/$_\b/?O:".")." "x rand 5)=~s/  /\n /r for 7..10,4..6,2,3,1

2

Mathematica、109バイト

関数:

f=(i=0;Reverse@Table[Row@Table[If[MemberQ[ToExpression/@StringSplit@#,++i],O,"."],{n}],{n,4}]~Column~Center&)

呼び出し元:

f@"3 5 7 9 10"

匿名関数が許可されている場合、これは105バイトに短縮できます

i=0;Reverse@Table[Row@Table[If[MemberQ[ToExpression/@StringSplit@#,++i],O,"."],{n}],{n,4}]~Column~Center&

入力がスペースで区切られた文字列である必要はないが、形式の数値の配列である可能性がある場合{3,5,7,9,10}、これはさらに79バイトに短縮できます

i=0;Reverse@Table[Row@Table[If[MemberQ[#,++i],O,"."],{n}],{n,4}]~Column~Center&

2

純粋なbash(coreutilsなし)、85

単純なパターン置換:

f="7 8 9 0
 4 5 6
  2 3
   1"
a=${@/10/0}
f="${f//[${a// /}]/O}"
echo "${f//[0-9]/.}"

リストはコマンドライン引数を介して入力されます。


2

レボル-117

s: array/initial 10"."b:""foreach n to-block input[s/:n:"0"]for n 4 1 -1[prin b print take/last/part s n append b" "]

ゴルフをしていない:

s: array/initial 10 "."
b: ""
foreach n to-block input [s/:n: "0"]
for n 4 1 -1 [prin b print take/last/part s n append b " "]

2

Brainfuck、179バイト

++++++++++[-[<<+>>-]+<<]>,[<[-]-[>-<-----]>++[-[>>+<<-]>>]>+++[<<],>,]<[,>>---[>
>]<<+++[<<]]>->>->>>>->>>>>>->[[>>]>,<<+[++[>+++++++++++<-]<+]>>[++.>-.>]>++++++
++++[>>]<<[.[<]<]<]

フォーマット済み:

++++++++++
[
  -[<<+>>-]
  +<<
]
>,
[
  <[-]
  -[>-<-----]
  >++
  [
    -[>>+<<-]
    >>
  ]
  >+++[<<]
  ,>,
]
<
[
  ,>>---[>>]
  <<+++[<<]
]
>->>->>>>->>>>>>->
[
  [>>]
  >,<
  <+
  [
    ++[>+++++++++++<-]
    <+
  ]
  >>[++.>-.>]
  >++++++++++[>>]
  <<[.[<]<]
  <
]

末尾の改行なしで入力を期待します。

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

テープは10個のノードで初期化され、各ノードには1つのノードにゼロが続きます。1つはピンの初期値であり、0はナビゲーションを容易にし、スペース文字のプレースホルダーとして機能します。入力の各番号に対して、そのピンは3ずつ増加します。ご注意ord('O') - ord('.') = 33テープ上の左から右にピンの順序は単純で、印刷の段階で、ピンの値は11で乗算されます(この乗算は、空白文字を生成するのにも使用されている。)1まで10。入力がa 10で終わる場合、10は最初にaとして扱われるため、修正が行われます1

入力が処理された後、負の値が各行の後に配置されます。次に、行はループで印刷され、先行スペースの数は前に処理された行の数によって決まります。


1

Clojure、216文字(ugh)

これはさらにゴルフができると確信しています。

(let[s(map #(dec(read-string %))(.split(slurp *in*)" +"))](println(apply str(replace(apply hash-map(interleave(map #(char(+ 48 %))(range 10))(map #(if(some #{%}s)"O"".")(range 10))))"6 7 8 9\n 3 4 5\n  1 2\n   0"))))

次のように使用します。

echo -n "2 4 9 8 10 5" | clojure a-file-which-contains-this-program.clj

1

AWK:96バイト

{gsub(/ /,"");a="6 7 8 9\n 3 4 5\n  1 2\n   0";gsub("["$0"]","O",a);gsub(/[0-9]/,".",a);print a}

注意:

  • 入力値のスペース区切り文字はオプションです(ただし、必要に応じてスペース区切り文字も使用できます)
  • 番号は順番になっている必要はありません
  • 入力はSTDINで読み取られます

1

C#-192バイト

C#だから!

私は数学で出力を構築しようと試みましたが、単純な文字列のトークン置換メソッドは、高レベル言語に最適です。Linqの依存関係は長くなりますが、カウンタを保持して範囲チェックを行うよりも短いです。

using System.Linq;class A{static void Main(string[]a){var s=@"7 8 9 0
 4 5 6
  2 3
   1";for(int c=11;c-->1;)s=s.Replace((char)(48+c%10),a.Contains(""+c)?'O':'.');System.Console.Write(s);}}

編集:UNIX行が戻ります(-3バイト)


1

Scala、150 148

def t(n:Any)=("G H I J D E F   B C     A"/:('A'to'J'))((j,i)=>j.replace(i,(if((n+" ").indexOf((i-64)+" ")>=0)'0'else'.'))).grouped(7).maxBy(println)

スペースで区切られた文字列のセットを受け入れます


1

JavaScript ES6、78バイト

F=i=>'7890\n 456\n  23\n   1'.replace(/\d/g,e=>'0.'[+!~i.search(e+'\\b')]+' ')

次のスニペットを使用してテストします。テストを容易にするため、プロンプトとアラート、および通常の関数表記を使用します。

i=prompt()
alert('7890\n 456\n  23\n   1'.replace(/\d/g,function(e){return'0.'[+!~i.search(e+'\\b')]+' '}))


1

VB / Basic-229

私の目標はjavaを打ち負かすことでした^^

Dim f
Sub m()
f = " 1 2 3 4 5 6 7 8 9 10"
a = l(7, 10) + l(4, 6) + l(2, 3) + l(1, 1)
MsgBox a
End Sub
Function l(b, e)
r = Space(3 - (e - b))
For i = b To e
r = r + IIf(InStr(f, Str(i)), "0 ", ". ")
Next
l = r + vbCr
End Function

chr(13)の代わりにvbCrを編集

r = r +スペース(3-(e-b))

速記

subの代わりに関数を使用

sub MAIN()-> sub m()


回答にバイト単位のコード長を含めてください。
ProgramFOX

私はそうしますが、私はまだコードを少しいじっています
-dwana

1

Java-223文字

public class Pins {public static void main(String[] args) {String s = "7 8 9 0\n 4 5 6\n  2 3\n   1";for (String arg : args) {s = s.replace(arg.replace("10", "0"), "o");}s = s.replaceAll("\\d", ".");System.out.println(s);}}

以前はこの方法が好きでしたが、小さなソリューションを必要とすることに気付きました。

public class Pins {
public static void main(String[] args) {
    String s = "7 8 9 0\n 4 5 6\n  2 3\n   1";
    for (String arg : args) {
        s = s.replace(arg.replace("10", "0"), "o");
    }
    s = s.replaceAll("\\d", ".");
    System.out.println(s);
}
}

1

K、57バイト

まだそれほど競争力はありませんが、始まりです。

`0:((!4)#\:" "),',/'|0 1 3 6_(". ";"O ")@|/(1+!10)=/:(),.

使用例:

  `0:((!4)#\:" "),',/'|0 1 3 6_(". ";"O ")@|/(1+!10)=/:(),."3 5 7 9 10"
O . O O 
 . O . 
  . O 
   . 
  `0:((!4)#\:" "),',/'|0 1 3 6_(". ";"O ")@|/(1+!10)=/:(),."1"
. . . . 
 . . . 
  . . 
   O 

入力文字列を評価することから始めます.-幸いなことに、スペースで区切られた数字はKの有効なリストリテラルです.evalの結果に空のリストを追加することにより、単一のピンの場合でもリストであることを確認できます。次に、ピンの位置を表すブールベクトルを作成します。

  (1+!10)=/:3 5 7 9 10
(0 0 1 0 0 0 0 0 0 0
 0 0 0 0 1 0 0 0 0 0
 0 0 0 0 0 0 1 0 0 0
 0 0 0 0 0 0 0 0 1 0
 0 0 0 0 0 0 0 0 0 1)
  |/(1+!10)=/:3 5 7 9 10
0 0 1 0 1 0 1 0 1 1

次に、文字列のリストにインデックスを付けて、ピンの位置ごとにスペースが埋め込まれた文字を取得します。

  (". ";"O ")@0 0 1 0 1 0 1 0 1 1
(". "
 ". "
 "O "
 ". "
 "O "
 ". "
 "O "
 ". "
 "O "
 "O ")

そのシーケンスを行にスライスし(_)、それらを逆にし(|)、各フラグメントを結合します(,/'):

  ,/'|0 1 3 6_(". ";"O ")@0 0 1 0 1 0 1 0 1 1
("O . O O "
 ". O . "
 ". O "
 ". ")

今、私たちが望むパターンのように見え始めています。残っているのは、各行の先頭のスペースをタック(((!4)#\:" "),')して、行を標準出力(0:)に出力することだけです。


1

パスカル(FPC)、165バイト

var f:string='. . . .'#10' . . .'#10'  . .'#10'   .';i:byte;z:array[1..10]of byte=(25,18,20,10,12,14,1,3,5,7);begin repeat read(i);f[z[i]]:='O'until eof;write(f)end.

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

標準入力から数値を取得し、フォーメーションを標準出力に出力します。

パスカル(FPC)、175バイト

function f(q:array of byte):string;var i:byte;z:array[1..10]of byte=(25,18,20,10,12,14,1,3,5,7);begin f:='. . . .'#10' . . .'#10'  . .'#10'   .';for i in q do f[z[i]]:='O'end;

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

ピン位置の配列を取得し、フォーマットされた文字列を返す、同じことを行う関数。


1

Powershell、84バイト

$p='6789
 345
  12
   0'
-split$args|%{$p=$p-replace($_-1),'O '}
$p-replace'\d','. '

テストスクリプト:

$f = {

$p='6789
 345
  12
   0'
-split$args|%{$p=$p-replace($_-1),'O '}
$p-replace'\d','. '

}

# one space at the end of each line with pins
@(
,("1 2 3 4 5 6 7 8 9 10",
@"
O O O O 
 O O O 
  O O 
   O 
"@)

,("7 10",
@"
O . . O 
 . . . 
  . . 
   . 
"@)

,("3 5 7 9 10",
@"
O . O O 
 . O . 
  . O 
   . 
"@)

,("1",
@"
. . . . 
 . . . 
  . . 
   O 
"@)
) | % {
    $s, $expected = $_
    $result = &$f $s
    $result-eq$expected
    $result
}

出力:

True
O O O O
 O O O
  O O
   O
True
O . . O
 . . .
  . .
   .
True
O . O O
 . O .
  . O
   .
True
. . . .
 . . .
  . .
   O

0

Java- 371 316 294文字

public class Bowling{public static void main(String[] a){boolean[] o=new boolean[10];int i;for(String s:a){i=Integer.parseInt(s)-1;o[i]=true;}for(int j=9;j>=0;j--){p((o[j]?"0 ":". "));p(j==6?"\n ":"");p(j==3?"\n  ":"");p(j==1?"\n   ":"");}p("\n");}static void p(String l){System.out.print(l);}}

これを初めて行うとき、私はそれがくだらないと確信していますが、私は初心者です。番号が順序付けられていない場合にも機能します。番号は間違っていますが、それを修正する方法を見つける時間がありません...

public class Bowling {
    public static void main(String[] args) {
        boolean[] ordened = new boolean[10];
        int i;
        for (String s : args) {
            i = Integer.parseInt(s) - 1;
            ordened[i] = true;
        }
        for (int j = 9; j >= 0; j--) {
            p((ordened[j] ? "0 " : ". "));
            p(j == 6 ? "\n " : "");
            p(j == 3 ? "\n  " : "");
            p(j == 1 ? "\n   " : "");
        }
        p("\n");
    }
    static void p(String l){
        System.out.print(l);
    }
}

java B 1 2 3 5 10たとえば、入力は次のように与えられます。出力は次のようになります。

0 . . . 
 . 0 . 
  0 0 
   0 

1
番号付けが間違っています。
オプティマイザー14

私はそれを修正しようとします
ハロエンヴィアネ14

0

Japt -Rx29 19 18 17バイト

5ÇÆ".O"gUø°TøÃÔû

それを試してみてください


説明

                      :Implicit input of integer array U
5Ç                    :Map each Z in the range [0,5)
  Æ                   :  Map the range [0,Z)
          °T          :    Increment T (initially 0)
        Uø            :    Does U contain T? (false=0, true=1)
   ".O"g              :    Get the character in the string ".O" at that index
            Ã         :  End mapping
             ¸        :  Join with spaces
              Ã       :End mapping
               Ô      :Reverse
                û     :Centre pad each element with spaces to the length of the longest
                      :Implicitly join with newlines, trim (not strictly necessary) and output
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.