Share Code Quickly

What is Harigami?

Harigami is a simple source code sharing service. You can share source code by an URL which is issued after submission.
You can also run your source code online such as Python, Ruby, JavaScript and so on.
For free.Use for code review.
Preferences
anonymous No title
C
#include <stdio.h>

int main(void)
{
    printf("Hello World!");
    return 0;
}
anonymous No title
Python
# coding: utf-8

from __future__ import division
import ui
import clipboard
from console import hud_alert

shows_result = False

def button_tapped(sender):
	'@type sender: ui.Button'
	# Get the button's title for the following logic:
	t = sender.title
	global shows_result
	# Get the labels:
	label = sender.superview['label1']
	label2 = sender.superview['label2']
	if t in '0123456789':
		if shows_result or label.text == '0':
			# Replace 0 or last result with number:
			label.text = t
		else:
			# Append number:
			label.text += t
	elif t == '.' and label.text[-1] != '.':
		# Append decimal point (if not already there)
		label.text += t
	elif t in '+-÷×':
		if label.text[-1] in '+-÷×':
			# Replace current operator
			label.text = label.text[:-1] + t
		else:
			# Append operator
			label.text += t
	elif t == 'AC':
		# Clear All
		label.text = '0'
	elif t == 'C':
		# Delete the last character:
		label.text = label.text[:-1]
		if len(label.text) == 0:
			label.text = '0'
	elif t == '=':
		# Evaluate the result:
		try:
			label2.text = label.text + ' ='
			expr = label.text.replace('÷', '/').replace('×', '*')
			label.text = str(eval(expr))
		except (SyntaxError, ZeroDivisionError):
			label.text = 'ERROR'
		shows_result = True
	if t != '=':
		shows_result = False
		label2.text = ''

def copy_action(sender):
	'@type sender: ui.Button'
	t1 = sender.superview['label1'].text
	t2 = sender.superview['label2'].text
	if t2:
		text = t2 + ' ' + t1
	else:
		text = t1
	clipboard.set(text)
	hud_alert('Copied')

v = ui.load_view('Calculator')

if min(ui.get_screen_size()) >= 768:
	# iPad
	v.frame = (0, 0, 360, 400)
	v.present('sheet')
else:
	# iPhone
	v.present(orientations=['portrait'])
anonymous No title
HTML
https://calendar.google.com/calendar/embed?height=600&wkst=1&bgcolor=%23ffffff&ctz=Asia%2FTokyo&src=NTViOHVodDZqZHRmZmU3Mm82b2pocGxzN29AZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ&src=amEuamFwYW5lc2UjaG9saWRheUBncm91cC52LmNhbGVuZGFyLmdvb2dsZS5jb20&color=%23F09300&color=%230B8043
anonymous No title
HTML
<iframe src="https://calendar.google.com/calendar/embed?src=fukuta%40uni-spot.com&ctz=Asia%2FTokyo" style="border: 0" width="800" height="600" frameborder="0" scrolling="no"></iframe>
anonymous No title
F#
printfn "Hello, world!"
anonymous No title
VBA
’ブックモジュールに記述

Option Explicit


Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

    Dim shpCat          As Shape        '動作する画像
    Dim shpAroundRng    As Range        'ShpCatの配置されているセル範囲
    Dim appearRng       As Range        'ShpCatが出現するセル
    Dim activeRng       As Range        'ActiveCellを保持するための変数
    Dim SelectRng       As Range        'Selectionを保持するための変数
    Dim visiRng         As Range        '現在画面に表示されているセル範囲
    
    Set visiRng = ActiveWindow.VisibleRange
    Set activeRng = ActiveCell
    Set SelectRng = Selection
    
    
    Application.EnableEvents = False
    
    Set shpCat = getShp(shpName:="cat")
    Call delShp(shpName:="テキスト")
    
    If Not shpCat Is Nothing Then
        
        Set shpAroundRng = shpCat.Parent.Range(shpCat.TopLeftCell, shpCat.BottomRightCell)
        Set appearRng = getAppearRng(visiRng)
        Select Case True
            Case shpCat.Parent.Name <> Sh.Name, Intersect(visiRng, shpAroundRng) Is Nothing '画面内にShpCatが無ければ、shpCatをカットしappearRngに貼り付ける
                shpCat.Cut
                appearRng.Select
                Sh.Paste
                Set shpCat = Sh.Shapes(Selection.Name)
                Target.Select
        End Select
        
        
        Call 猫寄ってくる(activeRng, shpCat)
        
    End If
    
    SelectRng.Select
    Application.EnableEvents = True
    
End Sub


Private Function getShp(ByVal shpName As String) As Shape
    '名前がShpNameのShapeがSetされ次第関数を抜ける
    
    Dim ws          As Worksheet
    
    On Error Resume Next
    For Each ws In ThisWorkbook.Worksheets
        Set getShp = ws.Shapes(shpName)
        If Err.Number = 0 Then Exit For
        Err.Clear
    Next

End Function

Private Sub delShp(ByVal shpName As String)
    'ブック内の全てのShpNameのShapeを削除する
    
    Dim ws          As Worksheet
    
    On Error Resume Next
    For Each ws In ThisWorkbook.Worksheets
        ws.Shapes(shpName).Delete
    Next

End Sub

Private Function getAppearRng(ByVal rng As Range) As Range
    '引数rngの四隅(の一つ内側)のセルの内いずれかをランダムで返す関数
    '1:左上
    '2:右上
    '3:左下
    '4:右下
    
    Randomize
    Dim rndNum As Long
    rndNum = Int(Rnd * 4) + 1
    
    Select Case rndNum
        Case 1:     Set getAppearRng = rng(1).Offset(1, 1)
        Case 2:     Set getAppearRng = rng.Offset(, rng.Columns.Count - 1).Item(1).Offset(1, -1)
        Case 3:     Set getAppearRng = rng.Offset(rng.Rows.Count - 1).Item(1).Offset(-1, 1)
        Case 4:     Set getAppearRng = rng(rng.Count).Offset(-1, -1)
    End Select
        
    
End Function


Private Sub 猫寄ってくる(ByVal rng As Range, ByVal shp As Shape)
    'shpの縦位置がrngの縦位置に達するまで縦移動し続ける
    'shpの横位置がrngの横位置に達するまで横移動し続ける
    'shpとrngの位置が一致したらループを抜ける
    
    Dim sphCenterV      As Double   'shpの縦中央位置
    Dim sphCenterH      As Double   'shpの横中央位置
    Dim rngCenterV      As Double   'rngの縦中央位置
    Dim rngCenterH      As Double   'rngの横中央位置
    Dim beforeShpArea   As String   'shpの1ステップ移動前位置
    Dim afterShpArea    As String   'shpの1ステップ移動後位置
    Dim flgV            As Boolean  'shpの縦位置がrngの縦位置に達したらTrueにする
    Dim flgH            As Boolean  'shpの横位置がrngの横位置に達したらTrueにする
    Const speed As Double = 6
    
    rngCenterV = rng.Top + rng.Height / 2
    rngCenterH = rng.Left + rng.Width / 2
    
    Do
        DoEvents
        
        sphCenterV = shp.Top + shp.Height / 2
        sphCenterH = shp.Left + shp.Width / 2
        
        beforeShpArea = shp.Top & "|" & shp.Left
        If Not flgV Then shp.Top = IIf(sphCenterV - rngCenterV < 0, shp.Top + speed, shp.Top - speed)
        If Not flgH Then shp.Left = IIf(sphCenterH - rngCenterH < 0, shp.Left + speed, shp.Left - speed)
        afterShpArea = shp.Top & "|" & shp.Left
        
        
        If Abs(sphCenterV - rngCenterV) < speed Then flgV = True
        If Abs(sphCenterH - rngCenterH) < speed Then flgH = True
        
        If flgV And flgH Then Exit Do
        If afterShpArea = beforeShpArea Then Exit Do
        
        Application.Wait [Now()] + 0.001 / 86400
    Loop
    
    
    Call にゃーと鳴く(shp, shp.Parent)
    
    
    
End Sub



Private Sub にゃーと鳴く(ByVal shp As Shape, ByVal ws As Worksheet)
    'shpの右隣にテキストボックスを配置して「にゃーー」と入力するにゃ。
    
    Dim テキストTop     As Double
    Dim テキストleft    As Double
    Dim テキスト        As Shape
    
    テキストTop = shp.Top
    テキストleft = shp.Left + shp.Width

    ws.Shapes.AddTextbox( _
            Orientation:=msoTextOrientationHorizontal, _
            Left:=テキストleft, _
            Top:=テキストTop, _
            Width:=100, _
            Height:=60).Select
    
    With Selection
        .Name = "テキスト"
        .ShapeRange.TextFrame2.VerticalAnchor = msoAnchorMiddle
        .ShapeRange.TextFrame2.TextRange.ParagraphFormat.Alignment = msoAlignCenter
        .ShapeRange.Fill.ForeColor.RGB = 11854022
        .ShapeRange.Line.ForeColor.RGB = 0
        .ShapeRange.TextFrame.Characters.Text = "にゃーー"
        .ShapeRange.TextFrame2.TextRange.Font.Bold = msoTrue
        .ShapeRange.TextFrame2.TextRange.Font.Size = 16
    End With
    
End Sub


anonymous No title
VBA
'ブックモジュールに記述

Option Explicit


Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

    Dim shpCat          As Shape        '動作する画像
    Dim shpAroundRng    As Range        'ShpCatの配置されているセル範囲
    Dim appearRng       As Range        'ShpCatが出現するセル
    Dim activeRng       As Range        'ActiveCellを保持するための変数
    Dim visiRng         As Range        '現在画面に表示されているセル範囲
    Set visiRng = ActiveWindow.VisibleRange
    Set activeRng = ActiveCell
    
    Application.EnableEvents = False
    
    Set shpCat = getShp(shpName:="cat")
    Call delShp(shpName:="テキスト")
    
    If Not shpCat Is Nothing Then
        
        Set shpAroundRng = shpCat.Parent.Range(shpCat.TopLeftCell, shpCat.BottomRightCell)
        Set appearRng = getAppearRng(visiRng)
        Select Case True
            Case shpCat.Parent.Name <> Sh.Name, Intersect(visiRng, shpAroundRng) Is Nothing '画面内にShpCatが無ければ、shpCatをカットしappearRngに貼り付ける
                shpCat.Cut
                appearRng.Select
                Sh.Paste
                Set shpCat = Sh.Shapes(Selection.Name)
                Target.Select
        End Select
        
        
        Call 猫寄ってくる(activeRng, shpCat)
        
    End If
    
    activeRng.Select
    Application.EnableEvents = True
    
End Sub


Private Function getShp(ByVal shpName As String) As Shape
    '名前がShpNameのShapeがSetされ次第関数を抜ける
    
    Dim ws          As Worksheet
    
    On Error Resume Next
    For Each ws In ThisWorkbook.Worksheets
        Set getShp = ws.Shapes(shpName)
        If Err.Number = 0 Then Exit For
        Err.Clear
    Next

End Function

Private Sub delShp(ByVal shpName As String)
    'ブック内の全てのShpNameのShapeを削除する
    
    Dim ws          As Worksheet
    
    On Error Resume Next
    For Each ws In ThisWorkbook.Worksheets
        ws.Shapes(shpName).Delete
    Next

End Sub

Private Function getAppearRng(ByVal rng As Range) As Range
    '引数rngの四隅(の一つ内側)のセルの内いずれかをランダムで返す関数
    '1:左上
    '2:右上
    '3:左下
    '4:右下
    
    Randomize
    Dim rndNum As Long
    rndNum = Int(Rnd * 4) + 1
    
    Select Case rndNum
        Case 1:     Set getAppearRng = rng(1).Offset(1, 1)
        Case 2:     Set getAppearRng = rng.Offset(, rng.Columns.Count - 1).Item(1).Offset(1, -1)
        Case 3:     Set getAppearRng = rng.Offset(rng.Rows.Count - 1).Item(1).Offset(-1, 1)
        Case 4:     Set getAppearRng = rng(rng.Count).Offset(-1, -1)
    End Select
        
    
End Function


Private Sub 猫寄ってくる(ByVal rng As Range, ByVal shp As Shape)
    'shpの縦位置がrngの縦位置に達するまで縦移動し続ける
    'shpの横位置がrngの横位置に達するまで横移動し続ける
    'shpとrngの位置が一致したらループを抜ける
    
    Dim sphCenterV      As Double   'shpの縦中央位置
    Dim sphCenterH      As Double   'shpの横中央位置
    Dim rngCenterV      As Double   'rngの縦中央位置
    Dim rngCenterH      As Double   'rngの横中央位置
    Dim beforeShpArea   As String   'shpの1ステップ移動前位置
    Dim afterShpArea    As String   'shpの1ステップ移動後位置
    Dim flgV            As Boolean  'shpの縦位置がrngの縦位置に達したらTrueにする
    Dim flgH            As Boolean  'shpの横位置がrngの横位置に達したらTrueにする
    Const speed As Double = 6
    
    rngCenterV = rng.Top + rng.Height / 2
    rngCenterH = rng.Left + rng.Width / 2
    
    Do
        DoEvents
        
        sphCenterV = shp.Top + shp.Height / 2
        sphCenterH = shp.Left + shp.Width / 2
        
        beforeShpArea = shp.Top & "|" & shp.Left
        If Not flgV Then shp.Top = IIf(sphCenterV - rngCenterV < 0, shp.Top + speed, shp.Top - speed)
        If Not flgH Then shp.Left = IIf(sphCenterH - rngCenterH < 0, shp.Left + speed, shp.Left - speed)
        afterShpArea = shp.Top & "|" & shp.Left
        
        
        If Abs(sphCenterV - rngCenterV) < speed Then flgV = True
        If Abs(sphCenterH - rngCenterH) < speed Then flgH = True
        
        If flgV And flgH Then Exit Do
        If afterShpArea = beforeShpArea Then Exit Do
        
        Application.Wait [Now()] + 0.001 / 86400
    Loop
    
    
    Call にゃーと鳴く(shp, shp.Parent)
    
    
    
End Sub



Private Sub にゃーと鳴く(ByVal shp As Shape, ByVal ws As Worksheet)
    'shpの右隣にテキストボックスを配置して「にゃーー」と入力するにゃ。
    
    Dim テキストTop     As Double
    Dim テキストleft    As Double
    Dim テキスト        As Shape
    
    テキストTop = shp.Top
    テキストleft = shp.Left + shp.Width

    ws.Shapes.AddTextbox( _
            Orientation:=msoTextOrientationHorizontal, _
            Left:=テキストleft, _
            Top:=テキストTop, _
            Width:=100, _
            Height:=60).Select
    
    With Selection
        .Name = "テキスト"
        .ShapeRange.TextFrame2.VerticalAnchor = msoAnchorMiddle
        .ShapeRange.TextFrame2.TextRange.ParagraphFormat.Alignment = msoAlignCenter
        .ShapeRange.Fill.ForeColor.RGB = 11854022
        .ShapeRange.Line.ForeColor.RGB = 0
        .ShapeRange.TextFrame.Characters.Text = "にゃーー"
        .ShapeRange.TextFrame2.TextRange.Font.Bold = msoTrue
        .ShapeRange.TextFrame2.TextRange.Font.Size = 16
    End With
    
End Sub


anonymous No title
Python
import gym
import matplotlib.pyplot as plt
import numpy as np
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
from collections import deque
from tensorflow.keras.losses import Huber
import tensorflow as tf

for device in tf.config.list_physical_devices("GPU"):
    tf.config.experimental.set_memory_growth(device, True)

NUM_EPISODES = 500
MAX_STEPS = 200
GAMMA = 0.99
WARMUP = 10

E_START = 1.0
E_STOP = 0.01
E_DECAY_RATE = 0.001

MEMORY_SIZE = 10000
BATCH_SIZE = 32


class QNetwork:
    def __init__(self, input_size, output_size):
        self.model = Sequential()
        self.model.add(Dense(16, activation="relu", input_dim=input_size))
        self.model.add(Dense(16, activation="relu"))
        self.model.add(Dense(16, activation="relu"))
        self.model.add(Dense(output_size, activation="linear"))

        self.model.compile(loss=Huber(), optimizer=Adam(learning_rate=0.001))


class Memory:
    def __init__(self, memory_size):
        self.buffer = deque(maxlen=memory_size)

    def add(self, experience):
        self.buffer.append(experience)

    def sample(self, batch_size):
        idx = np.random.choice(np.arange(len(self.buffer)), size=batch_size, replace=False)
        return [self.buffer[i] for i in idx]

    def __len__(self):
        return len(self.buffer)


env = gym.make("CartPole-v0")
state_size = env.observation_space.shape[0]
action_size = env.action_space.n

main_qn = QNetwork(state_size, action_size)
target_qn = QNetwork(state_size, action_size)
memory = Memory(MEMORY_SIZE)

state = env.reset()
state = np.reshape(state, [1, state_size])

total_step = 0
success_count = 0
for episode in range(NUM_EPISODES):
    step = 0
    target_qn.model.set_weights(main_qn.model.get_weights())

    epsilon = E_START

    for _ in range(MAX_STEPS):
        step += 1
        total_step += 1
        epsilon = E_STOP + (E_START - E_STOP) * np.exp(-E_DECAY_RATE * total_step)

        if epsilon > np.random.rand():
            action = env.action_space.sample()
        else:
            action = np.argmax(main_qn.model.predict(state)[0])

        next_state, _, done, _ = env.step(action)
        next_state = np.reshape(next_state, [1, state_size])

        if done:
            if step >= 190:
                success_count += 1
                reward = 1
            else:
                success_count = 0
                reward = 0

            next_state = np.zeros(state.shape)

            if step > WARMUP:
                memory.add((state, action, reward, next_state))
        else:
            reward = 0

            if step > WARMUP:
                memory.add((state, action, reward, next_state))

            state = next_state

        if len(memory) >= BATCH_SIZE:
            inputs = np.zeros((BATCH_SIZE, 4))
            outputs = np.zeros((BATCH_SIZE, 2))

            mini_batch = memory.sample(BATCH_SIZE)

            for i, (state_b, action_b, reward_b, next_state_b) in enumerate(mini_batch):
                inputs[i] = state_b

                if not (next_state_b == np.zeros(state_b.shape)).all(axis=1):
                    output = reward_b + GAMMA * np.amax(target_qn.model.predict(next_state_b)[0])
                else:
                    output = reward_b

                outputs[i] = main_qn.model.predict(state_b)
                outputs[i][action_b] = output

            main_qn.model.fit(inputs, outputs, epochs=1, verbose=0)

        if done:
            break

    print("Episode: {}, Steps: {}, eps:{:.3f}".format(episode, step, epsilon))
    plt.plot(episode, step)

    if success_count >= 5:
        break

    state = env.reset()
    state = np.reshape(state, [1, state_size])

plt.xlabel("Episodes")
plt.ylabel("Steps")
plt.legend(loc="best")
plt.show()

main_qn.model.save("../models/dqn_cart_pole.h5")
anonymous No title
VBA
Option Explicit

Public Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (Destination As Any, _
     Source As Any, _
     ByVal Length As LongPtr)
Sub test()
    
    Dim strA As String
    Dim strB As String
    Dim btA(3) As Byte
    Dim btB(3) As Byte
    Dim i As Long
    
    strA = "AAAAAAAAAAAAAAAA"
    
    'VarPtr(strA)とはstrAの文字列の実体が置かれているアドレスが書かれているアドレス。
    '以下を実施することでstrBの文字列の実体が置かれているアドレスが書かれているアドレスに
    'strAの実体が置かれているアドレスが書き込まれる。
    Call CopyMemory(ByVal VarPtr(strB), ByVal VarPtr(strA), 4)
    
    'Midステートメントの実施
    Mid(strA, 3, 2) = "BB"
        
    'strAに変更を加えたのにstrBにも影響が
    Debug.Print "両者の文字列を表示"
    Debug.Print strA
    Debug.Print strB
    
    '文字列の実体が書かれているアドレスを取得
    Call CopyMemory(btA(0), ByVal VarPtr(strA), 4)
    Call CopyMemory(btB(0), ByVal VarPtr(strB), 4)
    
    '同じ文字列の実体を指し示している2つの変数なのでstrBにも影響が出るのは当然
    'Midステートメントは文字列の実体を操作しているだけと想像できる
    Debug.Print vbCr & "両者の文字列の実体のアドレス"
    For i = 0 To 3
        Debug.Print Hex(btA(i)) & " ";
    Next i
    Debug.Print ""
    For i = 0 To 3
        Debug.Print Hex(btB(i)) & " ";
    Next i
    Debug.Print ""
    
    'Midステートメントのやっていることを想像
    '3文字目は先頭アドレス+4バイト目(1文字目0バイト1バイト、2文字目2バイト3バイト)
    'どこかに用意した"BB"のアドレスから2文字(4バイト分)
    'Call CopyMemory(ByVal StrPtr(strA) + 4, ByVal StrPtr("BB"), 4)
    '↑Midステートメントの代わりにMidステートメントと同じ場所で実施すれば同じ結果となる
    
    'Replace
    strA = Replace(strA, "BB", "CC")
    
    '今度はstrBには影響しない
    Debug.Print vbCr & "両者の文字列を表示"
    Debug.Print strA
    Debug.Print strB
    
    '文字列の実体が書かれているアドレスを取得
    Call CopyMemory(btA(0), ByVal VarPtr(strA), 4)
    Call CopyMemory(btB(0), ByVal VarPtr(strB), 4)
    
    '違う文字列の実体を指し示している。
    'Replaceのコードを見れば、strAに代入してしまったので別の文字列の実体を指し示すようになったということ。
    Debug.Print vbCr & "両者の文字列の実体のアドレス"
    For i = 0 To 3
        Debug.Print Hex(btA(i)) & " ";
    Next i
    Debug.Print ""
    For i = 0 To 3
        Debug.Print Hex(btB(i)) & " ";
    Next i
    Debug.Print ""
    
    '文字数を取得(文字列の実体より前4バイトで文字数を表す)
    Dim btC(3) As Byte
    Call CopyMemory(btC(0), ByVal StrPtr(strA) - 4, 4)
    
    'リトルエンディアンで20=32バイト=16文字と分かる
    Debug.Print vbCr & "strAの文字数を取得"
    For i = 0 To 3
        Debug.Print Hex(btC(i)) & " ";
    Next i
    Debug.Print ""
    
    'こんなことしちゃって良いの?
    '文字数変更で8文字(16バイト)
    btC(0) = 16
    Call CopyMemory(ByVal StrPtr(strA) - 4, btC(0), 4)
    
    Debug.Print vbCr & "8文字に変更したstrAの表示"
    Debug.Print strA
    
    '終端が00じゃ無いんですけど!!(16バイト目が00になっていない)
    Dim btD(31) As Byte
    Call CopyMemory(btD(0), ByVal StrPtr(strA), 32)
    Debug.Print vbCr & "strAの8文字とstrAより後の8文字を表示"
    Debug.Print btD
    Debug.Print "↑strAの終端が00じゃ無いんですけど!!"
    
End Sub
墨鴉🍔 簡単脱出ゲーム
Python
import sys

time_limit = 10
progress = 0
items = []


def start():
    return


def prologue():
    global progress

    print('目が覚めたら、知らない部屋にいた。')
    print('ここはいったいどこだ……?')
    print('とりあえず、出口を探さないと')

    progress = 1

    return


def epilogue():
    print('ふと、目が覚めた')
    print('辺りを見回すと、そこは見慣れた自分のアパートだった')
    print('あの謎の木箱はひとつもなく、あるのは自分の家具だけ')
    print('夢だったのだろうか……?')
    print('ふと、床に目をやると、悪寒が走った')
    print('床には、焼けただれて黒くなった、あの不気味な人形があった')
    print('…………')
    print('すぐに人形は処分した')
    print('それからは、なにごともなく生活を送っている')
    print('だが、あの奇妙な夢と、人形のことは誰にも話せずにいる')
    print('Fin')
    sys.exit()


def help():
    print('help: コマンド一覧')
    print('look: 周囲を見渡す')
    print('search: 物を持つ')
    print('item: 所持品を確認')


def look():
    print('周りを見渡してみる')

    if progress == 1:
        print('広さはワンルームのアパートくらいだ')
        print('出口はおろか、窓さえも見当たらない')
        print('部屋の中にあるものといえば、古めかしい木箱ばかりだ')
        return

    if progress == 2:
        print('他に開く木箱はなさそうだ')
        print('だが、木箱は雑然と置かれている')
        print('部屋が薄暗くて大変そうだが、木箱の間にはところどころすきまがある')
        return

    if progress == 3:
        print('木箱も、木箱のすきまも調べた……')
        print('何気なく天井を見ると、電球のようなものが付いている')
        print('あの電球、電気が点くのだろうか……?')
        return

    if progress == 4:
        print('困った、とうとうなにも手がかりはない……')
        print('持っているものは、不気味な人形に、マッチ、それに、フラスコというわけのわからない物だけ……')
        print('こんなもの、どうしろっていうんだ……')
        return

    return


def search(object):
    global progress

    if progress == 1 and '木箱' in object:
        print('周りにある木箱を調べてみる')
        print('ほとんどの蓋は釘で留められていて開かない')
        print('…………')
        print('あ! ひとつだけ、蓋が開く箱があった')
        print('')
        print('【不気味な人形】を手に入れた')
        print('なんでこんなものが……? 気持ち悪いな')
        progress = 2
        items.append('【不気味な人形】')
    elif progress == 2 and 'すきま' in object:
        print('木箱のすきまに手を入れて、なにか落ちていないか調べてみた')
        print('…………')
        print('あ! なにかが指先に当たった! これは……')
        print('【マッチ】を手に入れた')
        progress = 3
        items.append('【マッチ】')
    elif progress == 3 and '電球' in object:
        print('木箱を足場にして、天井の電球に手を伸ばしてみる')
        print('なんだこれは……? 中に液体が入っている?')
        print('これは電球じゃない、中に液体の入ったフラスコだ……')
        print('どうしてこんなものを天井に……?')
        print('【フラスコ】を手に入れた')
        progress = 4
        items.append('【フラスコ】')
    elif progress == 4 and '人形' in object and 'マッチ' in object and 'フラスコ' in object:
        print('なんとなく、フラスコの中身を開けてみた')
        print('臭い、これはなにかの油だろうか……')
        print('それを、躊躇うこともなく人形にかけてみる')
        print('…………')
        print('そして、マッチをこすって火を点けた')
        print('…………')
        print('不気味な人形が、髪の毛からメラメラと燃えていく')
        print('それを見つめていたら、段々と眠気が襲ってきた')
        print('木箱によりかかり、目を閉じる')
        print('…………')
        progress = 5
        epilogue()
    else:
        print('いろいろ試してみたが、手がかりは得られなかった……')

    return


def item():
    global items
    print('今の持ち物は……')

    if len(items) == 0:
        print('着ているもの以外は、なにも持っていない')
    else:
        for item in items:
            print(item)

    return


def main():
    global time_limit
    global progress

    while(True):
        if progress == 0:
            prologue()

        print('さて、どうしよう……')
        print('*helpでコマンド一覧')
        command = input()

        if 'help' in command:
            help()
        elif 'look' in command:
            look()
        elif 'search' in command:
            search(command)
        elif 'item' in command:
            item()
        elif 'exit' in command:
            sys.exit()
        else:
            print('そんなことをしても仕方ないな……')

        time_limit -= 1
        if time_limit == 0:
            print('あれ……?')
            print('急に、眠たくなってきた')
            print('ダメだ……眠くて……起きて……いられない……')
            break

    sys.exit()


if __name__ == '__main__':
    start()
    main()