Xで50音順に「かに」で終わる形容動詞(正確には連用形ですが)を並べている人がいて、面白そうなので自分もやってみました。
やってみるとわかるんですけど、かなり難しいです。ぱっと思いつく範囲では半分も埋まりませんでした。圧倒的敗北を喫して悔しかったので辞書を解禁して調べました。が、それでも敗北しました……。以下が戦いの結果です。複数ある場合は2〜3つくらい書いてます。
あ→明らかに、艶やかに い→如何に、居丈高(いたけだか)に う→麗(うら)らかに え→ お→厳かに、穏やかに か→軽やかに き→煌(きら)びやかに く→ け→絢爛豪華に こ→腰高に、事細かに さ→ささやかに し→静かに、しなやかに す→健やかに、速やかに せ→背高に そ→ た→確かに ち→ つ→慎ましやかに、詳(つまび)らかに て→ と→年若に、ど真ん中に な→和やかに、なだらかに に→賑やかに、俄かに ぬ→ ね→根明に の→長閑(のどか)に、伸びやかに は→華やかに、遥かに、晴れやかに ひ→密かに、秘めやかに ふ→ふくよかに、不束(ふつつか)に へ→ ほ→朗らかに ま→実(まこと)しやかに、間近(まぢか)に、円(まろ)やかに み→身近に、雅やかに む→睦(むつ)まやかに め→目近(めぢか)に も→物静かに、物柔らかに や→安らかに、吝(やぶさ)かに ゆ→豊かに、緩やかに よ→ ら→ り→ る→ れ→ ろ→ わ→わずかに、割高に
文語を採用するともう少し埋まりそうでしたが、なんだか負けた気分なので文語は外してます。
まず、ら行が全滅なことに驚きました。しかしまあ、ら行と「ぬ」「へ」「よ」はこれらの文字で始まる単語自体が少なそうで、該当する形容動詞がなくてもさほど不思議ではないです。しかし「え」「く」「そ」「ち」「て」は意外でした。本当にないのかなあ?私の探し方が悪いだけかもしれません。
たぶん「かに」で終わる形容動詞で全て埋めるのは不可能なんじゃなかろうか?うーん??
この記事にコメントする
目次: ゲーム
大昔にちょっとだけやって中断していたゲーム「農家はREPLACE()されました」を9割位までクリアしました。
実績の残り2個はランキングに載れ的なやつで、やる気が起きなかったのでこれにておしまいです。
序盤は適当にループを回して、文法系を全開放(list, dict, set_world_sizeなど)、迷路までの作物、複数ドローンを開放します。中盤は各種作物に最適化して組んだプログラムを動かす&放置&資源がたまったらレベルを適宜開放、を繰り返します。実装したらやることがなくなっちゃう。
プログラムは最大レベル(農場サイズ32x32、ドローン32機)に合わせて決め打ち実装した方が効率的で速いです。が、中盤は農場サイズやドローン数が少なく、32x32決め打ち実装だと動かなくて辛いです。個人的には農場サイズやドローン数が可変にできるように実装した方がゲーム進行的には楽だと思いました。
カボチャとサボテンの実装を紹介しようと思います。一応、カボチャマスターとサボテンマスターは取れるはず、たぶん。
各ドローンは1機1行を担当します。西から東の一方向にスキャンし続け、割れたカボチャがあったら植え直し、一列全部がきれいなカボチャになったらドローンの処理おしまいです。これを全行に対して実行します。
最初のドローンは北に移動しながらドローンを複製できるだけ複製して、複製の上限に達したら自分も1行担当します。全面カボチャになって、ドローンが最初のドローン1機だけになったら収穫します。
def cond():
a = num_items(Items.Power) > MIN_POWER
b = num_items(Items.Carrot) > MIN_CARROT
c = num_items(Items.Pumpkin) < MAX_PUMPKIN
return a and b and c
def get_pline():
pline = 0
for i in range(get_world_size()):
if get_entity_type() == Entities.Pumpkin:
pline += 1
move(North)
return pline
def drone():
plist = []
pnum = 0
for i in range(get_world_size()):
plist.append(False)
while True:
if get_entity_type() == Entities.Grass:
till()
if get_entity_type() == Entities.Pumpkin and can_harvest():
if not plist[get_pos_x()]:
plist[get_pos_x()] = True
pnum += 1
if pnum == get_world_size():
return
else:
plant(Entities.Pumpkin)
if get_water() < 0.5:
use_item(Items.Water)
move(East)
def pumpkin():
clear()
while cond():
if not spawn_drone(drone):
drone()
if get_pline() == get_world_size():
while num_drones() > 1:
pass
harvest()
move(North)
動作を見たらすぐ気づくと思いますが、効率は良くないです。特に最初のドローンがスキャンする処理が長引くと、複数ドローンが出せない時間も長引いてしまいボトルネックになります。
全面にサボテンを植えて、東北側に大きなサボテン、南西側に小さなサボテンを集めるようにソートし、収穫します。ヒントにある通り、行ごとにソート、列ごとにソートの順に実行すれば全面ソート済みになります。
コードはこんな感じ。もっと短くできそうですけど気にしない。
def move_to(x, y):
ws = get_world_size()
dirx = East
if (x - get_pos_x() + ws) % ws > (ws / 2):
dirx = West
diry = North
if (y - get_pos_y() + ws) % ws > (ws / 2):
diry = South
while get_pos_x() != x:
move(dirx)
while get_pos_y() != y:
move(diry)
def cond():
a = num_items(Items.Power) > MIN_POWER
b = num_items(Items.Pumpkin) > MIN_PUMPKIN
c = num_items(Items.Cactus) < MAX_CACTUS
return a and b and c
def is_ready(l):
for i in range(get_world_size()):
if l[i] == -1:
return False
return True
def is_sorted(l):
for i in range(get_world_size() - 1):
if l[i] > l[i + 1]:
return False
return True
def get_west_x():
return (get_pos_x() - 1 + get_world_size()) % get_world_size()
def get_east_x():
return (get_pos_x() + 1 + get_world_size()) % get_world_size()
def get_south_y():
return (get_pos_y() - 1 + get_world_size()) % get_world_size()
def get_north_y():
return (get_pos_y() + 1 + get_world_size()) % get_world_size()
def swap_item(l, a, b, dir):
t = l[a]
l[a] = l[b]
l[b] = t
swap(dir)
def plant_water():
if get_entity_type() == Entities.Grass:
till()
plant(Entities.Cactus)
if get_water() < 0.5:
use_item(Items.Water)
def drone_x(st):
move_to(0, st)
xlist = []
for i in range(get_world_size()):
xlist.append(-1)
while cond() and not is_ready(xlist):
plant_water()
xlist[get_pos_x()] = measure()
move(East)
move_to(0, st)
vmax = get_world_size() - 1
while cond():
if is_sorted(xlist):
return
for i in range(vmax):
if get_pos_x() > 0 and xlist[get_west_x()] > xlist[get_pos_x()]:
swap_item(xlist, get_west_x(), get_pos_x(), West)
move(East)
for i in range(vmax):
if get_pos_x() < get_world_size() - 1 and xlist[get_east_x()] < xlist[get_pos_x()]:
swap_item(xlist, get_east_x(), get_pos_x(), East)
move(West)
move(East)
vmax -= 2
def drone_y(st):
move_to(st, 0)
ylist = []
for i in range(get_world_size()):
ylist.append(-1)
while cond() and not is_ready(ylist):
ylist[get_pos_y()] = measure()
move(North)
vmax = get_world_size() - 1
while cond():
if is_sorted(ylist):
return
for i in range(vmax):
if get_pos_y() > 0 and ylist[get_south_y()] > ylist[get_pos_y()]:
swap_item(ylist, get_south_y(), get_pos_y(), South)
move(North)
for i in range(vmax):
if get_pos_y() < get_world_size() - 1 and ylist[get_north_y()] < ylist[get_pos_y()]:
swap_item(ylist, get_north_y(), get_pos_y(), North)
move(South)
move(North)
vmax -= 2
def area(func, start, end):
for i in range(start, end):
spawn_drone(func, i + 1)
func(start)
while num_drones() > 1:
pass
def cactus():
clear()
while cond():
for i in range(0, get_world_size() - 1, max_drones()):
area(drone_x, i, min(get_world_size() - 1, i + max_drones() - 1))
for i in range(0, get_world_size() - 1, max_drones()):
area(drone_y, i, min(get_world_size() - 1, i + max_drones() - 1))
harvest()
ソートアルゴリズムは何でも良いですが、このゲームの大きな制約が2つあって、
おそらくバブルソート系のアルゴリズムを選択せざるを得ないでしょう。上記の実装ではシェイカーソートを使いました。シェイカーソートの存在は知ってましたが、実用的じゃないので実装したことなかったです。改めて実装してみるとなかなか新鮮でした。
この記事にコメントする
| < | 2026 | > | ||||
| << | < | 05 | > | >> | ||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| - | - | - | - | - | 1 | 2 |
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 | - | - | - | - | - | - |
26年1月23日
26年1月23日
24年12月9日
24年12月9日
25年12月18日
25年12月18日
25年12月18日
25年11月28日
25年11月28日
25年11月28日
25年10月6日
25年10月6日
25年9月29日
25年9月29日
20年8月24日
20年8月24日
16年2月14日
16年2月14日
25年7月20日
25年7月20日
wiki
Linux JM
Java API
2002年
2003年
2004年
2005年
2006年
2007年
2008年
2009年
2010年
2011年
2012年
2013年
2014年
2015年
2016年
2017年
2018年
2019年
2020年
2021年
2022年
2023年
2024年
2025年
2026年
過去日記について
アクセス統計
サーバ一覧
サイトの情報合計:
本日: