yakataの情報奮闘記

プログラミングの話をします

すっごい今更だけど夏コミの話

夏コミお疲れ様でした。

自分はRegen RadikalerというサークルでOscillatus 零というゲームの背景を作成しました。当日遊びに来てくださった方、買ってくださったからありがとうございました。

ようやくリアルが少し落ち着いたので、ゲームのフォルダを整理していました。このゲームのために描いた背景は前後編合わせて、20枚強(差分抜き 写真加工背景抜き)。

一般的な絵師さんからすると少ないと思いますが、自分の中ではここまで長く続いた趣味は中高続けたジャグリングくらいなもので、結構驚いています。

ゲーム背景1 病院廊下
ゲーム背景2 主人公の病室
Oscillatus零の背景を一部紹介

今回学んだことで一番大きなことは「どうやってチャットで会話しているとき、互いに気分を害さずにモチベーションを保つか」みたいなことだったりします。

一昔前、即レス is Godみたいな信仰があり、かつ、チャットじゃ良くも悪くも心は伝わらないという言説もあり、情報だけが詰まった即レスをしていた時期が自分にもありました。今でも即レスがよいという考えは変わっていないのだけれど、強い言葉を使ったために、チャットの雰囲気が壊れ、それを修復するのにめちゃくちゃ時間がかかるのを考慮するとなるべく強くない言葉に翻訳してから投げたほうが結果的に時間効率がよくなると考えるようになりました。

気分悪くしないのが一番効率よいならそちらを選ばない理由はないです。

冬コミの話

それでここからが宣伝なのですが、はじめて自分でコミケに申し込みました!!一人で広報から創作、販売までやっているサークル長を見て自分でもやりたくなったのが理由です(単純)。自分の描いた背景本を出そうと思います。詳細はじきに。

 

 

Othelloゲームを作っている話

Twitterを巡回していたらこんなツイートに出会った。

こういうものには騙されるに限る。眼の前の人参がたとえ仮想的なものだとしても。

 

 というわけでオセロを作ってみた

f:id:ponyo4869yakata398:20180709133418p:plain

一回石を打つごとにボードと今の勝ち負け状況を表示します。ボードが埋まると終了して、"39-25 The black won!"のように表示されるようにした。

入力は”色 縦のライン 横のライン”で行います。

ソースコードこちら

 

これからの課題

上の入力を見て察した人も多いかと思いますが、どちらの番か判断することが出来ていません。その他にも

  • 其の場所に石を置けるのかを判定できない
  • ボードが埋まらずにゲームが終了したときを判定できない
  • 可能であればGUIで実装もしたい

という諸々の課題があります。もはやこれはオセロではないのでは?

ということで逐次更新します。

 

 

 

Weebleにお邪魔しました

実は2回目

 

VRの強い人とか強い人がいるコワーキングスペース

有料だが、強い人の「自分ならこう書く」を教えてもらえるだけで価値が有る場所

 

VRやりたいと言ったら、とりあえずスクラップアンドビルドして10KSくらい作りなと言われたので、Qiitaの記事を真似たり、Vtuber表示させて触れるようにしたりしようと思う。

 

イラスト屋さんの端くれなので、自分の作った絵を3Dに起こしてアバターにしたりとか夢は広がる

 

【バッチファイル公開】競技プログラムでいつもやってること(の一部)を自動化した

競技プログラム用のmain.rbに標準入力を入れて出力するbatファイルを作った。

テストツールでいいじゃんという話はあるけど、時間効率がいいので。

 

配布はこちら

github.com

 

現状sample1.txtからsample4.txtに標準入力を入れておくのは手動なので、それを改善したい。

そのときには出力と合っているのかも取れたらいいな。

絵を描くときのフォルダ構造

絵を描くときのフォルダ構造が各々で異なっていたので、個人的フォーマットを決める意味でこの記事を書いてみる。

創作イラストフォルダ/それぞれのイラストフォルダ/以下のお話。

 

 

フォルダ構造

結論から言うと以下のようになっている。

  1. .git
  2. texture
  3. trash
  4. 資料
  5. 出力
  6. main

それぞれを解説していく。余裕があれば後でバッチファイル作って公開する。

.git

イラストを書いていくと「〇〇_ラフ.psd」、「〇〇_塗り.psd」とかになって非常に面倒くさい。

正直mainだけでいい気はする。

 

texture

https://www.textures.com/ とかから取ってきたtextureを入れておく箱。出処を書いておくテキストファイルがあったりする。複雑な絵だと、キャラクターフォルダや背景フォルダがこの下に入る

 

trash

本当のゴミ箱に持っていく前にここに貯めておいて終わったらゴミ箱に入れるためのフォルダ。あんまり絵と馴染まなかったTextureとか資料が入る。

そして決まってあとから見たくなる

 

資料

そのままイラストに載せてはいけないけど、雰囲気が似ている(雰囲気を似せたい)神絵師の絵とかを入れておく。グループで何かを作っている場合、LINEのスクショとかも入れる。

 

出力

まんまです。同じ名前のpsdとpngが混ざるとフォルダが汚くなるので。

 

main

psdファイルを入れるところ。わざわざフォルダ作らなくてもいいのだけど、様々な理由でイラストフォルダが汚れるので、隔離している。

 

その他

Blenderで3Dモデリングしてから絵を描く場合は3Dフォルダ、同じような絵を2種類作る場合はmainではなく、共有パーツ、1つ目のフォルダ、2つ目のフォルダとなるなど細部は絵によって変わる。

 

20180623追記

バッチファイル作りました。

メモ帳で開くとわかると思いますが、これくらいのバッチファイルなら簡単に書けます。お絵かき沼の人にもおすすめです。

github.com

ABC100で初めて全問通した話

AtCoder Beginner Contest 100 - AtCoderのリンク

 

タイトルの通りです。ABC099 C問題(chokudaiさんとかが難しいとツイートしていたDPを使って解くやつ)の解き方というか、コンピュータリソースの使い方を見てからワンランク上がった気がします。

※以下のコードはすべてRubyコードです。表示バグってます。直し方教えてください……。

 

目次

 

A問題について

入力フォーマットの誤植(※修正済み)と出力が変わり種になっていて、引っかかりました。

 

考え方

隣り合うケーキを取っては行けない→1人が最大個取るには交互に8個取るのが最善→2人とも最大8個取ることは可能

 

実装

  1. a,b = gets.chomp.split.map(&:to_i)
  2. if a<=8 && b<=8
  3. puts "Yay!"
  4. else
  5. puts ":("
  6. end


B問題について

考え方

100で0回割り切れる100番目の数は100じゃなくて101だよ

※サーバーが重かったのもあってここで間違えた答え出すとロスが厳しかったようですね。

実装

  1. d,n = gets.chomp.split.map(&:to_i)
  2.  
  3. if n != 100
  4. puts n*(100**d)
  5. else
  6. puts 101*(100**d)
  7. end

 

C問題について

考え方

最終的な出力が回数なので3倍する話は無視でいい

結局aiは何回2で割れるのかということを実装すればOK

 

実装

  1. _ = gets.chomp.to_i
  2. ary = gets.chomp.split.map(&:to_i)
  3. count = 0
  4.  
  5. ary.each do |ai|
  6. quot = ai/2
  7. remainder = ai%2
  8. while remainder == 0 && quot!=0
  9. count += 1
  10. remainder = quot%2
  11. quot /= 2
  12. end
  13. end
  14.  
  15. puts count


 

D問題について

最初絶対値で評価するのを見逃していてとんちんかんな実装をしていた。

考え方

合計の絶対値の和で比較

→-をつけるかつけないかだけ(最大値比較なので、-になったら無視される)

→綺麗さ・美味しさ・人気度の3つの項目において+-の組み合わせ(2^3通り)全てで調べる

 

試行が定数倍増えても気にしないのがコンピュータのいいところ。

実装

  1. n,m = gets.chomp.split.map(&:to_i)
  2. ary =
  3. n.times do
  4. # ary[0][2]→z1
  5. ary << gets.chomp.split.map(&:to_i)
  6. end
  7. ans = 0
  8.  
  9. # +-の組み合わせで8通り試す
  10. plmi=[[0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]]
  11. plmi.each do |i|
  12. eva =
  13. ary.each do |xyz|
  14. eva << (xyz[0]**1
  15. end
  16. # 降順ソート
  17. eva.sort! {|a, b| b <=> a }
  18. tmp_ans = 0
  19. m.times do |i|
  20. tmp_ans += eva[i]
  21. end
  22. ans = [ans,tmp_ans].max
  23. end
  24.  
  25. puts ans

+-全通り調べるために配列手書きしているところとeva(評価evaluation)の代入がほとんど繰り返しなのはリファクタリングしたほうがいい。ただ、ネストが深くなりそう。

 

まとめ

このABC100で茶色になれました

パフォーマンス1576なので、毎回これくらいの成績を取ると水色だよってことですね。

ただ、今回のような実装は簡単、思いつくのが少し大変というものは比較的得意なのですが、

前回のC問題のような一目見てDP問題だとわかってからが勝負みたいな、実装に対する知識?場数?が要求されるものだとまだまだ厳しいです。

*1:-1)**i[0])+xyz[1]*((-1)**i[1])+xyz[2]*((-1)**i[2]

AGC025で惨敗した話

AGC025に参加しました。A問題しか解けないという悔しい結果に。

 

特にB問題はcombinationを実装できなくて負けたので、基礎力不足です。

 

B問題解説

RGBと無色でタイルを塗り分ける方法は何通りあるかという問題。Nの大きさより、O(N)まで許される。これだけだと難しい(というか計算量的に解けない?)ので、以下の条件がついている。

赤色に塗られていれば A 点、緑色に塗られていれば A+B 点、青色に塗られていれば B 点、無色ならば 0 点

https://agc025.contest.atcoder.jp/tasks/agc025_b

これを「RとBを独立に塗って重なったらGになるとする」と読み替えられると方針がすんなり決まる。

 

というわけで200点しか取れなかったのですが、レートは上がりました。20回以内だとレートが抑えて表示されるというものの影響でしょうか?

次回はcombinationの実装の話でも