今回から新シリーズ「Kボナッチ数列」を解いていきましょう。

 

6-1    「K ボナッチ数列」を解くために:part1 

 まずは一般的なフィボナッチ数列について考えてみましょう。                        
「フィボナッチ数列」とは、1, 2 項目を 1 とし、 3 項目以降は前項 2 項の和となる数列です。                具体的には、1, 1, 2, 3, 5, 8, ... となります。                        
 フィボナッチ数列の N 項目を 10000 で割ったあまりを求めてください。                        

入力例   出力例
1000   8875

 

まずは一般に言われているフィポナッチ数列です。

問題文のとおりに作成すれば容易に作成できます。

A = []
N = int(input())
A.append(1)
A.append(1)
a=0
for i in range(1,N-1):
    a = A[i-1] + A[i]
    A.append(a)
print(A[-1] % 10000)    
 

6-2  「K ボナッチ数列」を解くために:part2

元の問題の「K ボナッチ数列」を考えます。
1, 2, ..., K 項目を 1 とし、 K + 1 項目以降は前項 K 項の和となる数列のことを、「K ボナッチ数列」と呼ぶことにします。
整数 K と N が与えられるので、 K ボナッチ数列の N 項目を 10000 で割ったあまりを求めてください。
今回の問題では N, K の値が小さいことが保証されるため、各項を求めるときに毎回前項 K 項の和を計算しても実行時間制限に間に合います

入力例   出力例
3   105
10    

 

さて、「Kボナッチ数列」なるものは何か?

確かに問題文の通りですが、イメージがわきずらくはありませんか。

例でいけば、K=3です。

[1, 1, 1, 3, 5, 9, 17, 31, 57, 105]
K=3ですので、3 = [0] + [1] + [2] = 1+1+1

                              5 = [1] + [2] + [3] = 1+1+3 という具合に配列が作成されます

定義がわかれば、前回のプログラムを修正することでプログラムは容易に作成できます。

A = []
K = int(input())
N = int(input())
for i in range(K):
    A.append(1)
for i in range(N-K):
    a = sum(A[i:i+K])
    A.append(a)
print(A[-1] % 10000)    
  

 

前回で営業活動によるCFを直接法、間接法で作成していきました。

 

今回は営業活動によるCFの小計以下利息、配当金及び法人税等について考えていきましょう。

 

①-3 利息及び配当金、法人税等

利息や配当金が営業活動によるCFに含まれるのにはちょいと違和感もあるのですが、

下記の2つから観点から選択できます。

A 損益の算定に含まれるか否か

B 投資活動の成果か財務活動の成果か

                                               A     B

受取手形                      営業活動        投資活動

受取配当金    営業活動    投資活動

支払利息     営業活動    財務活動

配当金の支払   財務活動    財務活動

一般的にはAを採用している方が多いような気がします。

 

CFの作成は営業活動直接法、投資活動、財務活動と同様に勘定分析で行います。

 

             未払利息
支払 2,500   |  期首    250
期末    150    |  P/L  2,400

 

                未収利息
期首    400  | 受取 2,400
P/L   2,430  | 期末    450
          2,850  |           2,850

 

            未払法人税等
支払 22,700 | 期首 11,700
期末 13,800 |  P/L   24,800 
          36,500 |           36,500

 

営業活動によるCF
営業収入                  1,100,750
商品の仕入による支出               △667,000
人件費の支出                                 △276,200
その他の営業費支出                     △ 68,000
小計                                                          89,550

利息の受取額               2,400     

利息の支払額                                      △2,500

法人税等の支払額                           △22,700

営業活動によるCF       66,750

投資活動によるCF
有価証券の取得による支出           △12,500
有価証券の売却による収入                11,550 
有形固定資産の取得による支出  △84,000
有形固定資産の売却による収入       25,000
投資活動によるCF      △  59,950

財務活動によるCF
借入金による収入                           18,000
借入金の返済による支出               △ 20,000
株式の発行による収入                  60,000 
配当金の支払額                                  △40,000
財務活動によるCF                                 18,000 

現金及び現金同等物の増減額           24,800
現金及び現金同等物の期首残高 158,000
現金及び現金同等物の期末残高     182,800

これで完成しました。

 

⑤現金及び現金同等物に含まれる為替差損益

外貨建ての現金及び現金同等物には期末換算替えで為替差損益が発生する場合があります。

例)為替差損益集計

      現金預金から生じた為替差益     300

         売掛金から生じた為替差益      600

         長期借入金から生じた為替差損 100  合計+800

 

間接法の場合

営業債権債務はら発生した為替差損益は無視します(債権債務残高に織り込み済)

よって、為替差益200(300-100)が相殺されます。

財務活動によるCFの長期借入による収入で差損(△100)を計上し、

 

営業活動によるCF(間接法)

 ・・・・・・・・・・・・

為替差益 △200

・・・・・・・・・・・・

現金及び現金同等物に係る換算差額 300(相殺した△300戻す)

現金及び現金同等物増加額            増加額に換算差額も加減算する

現金及び現金同等物期首残高

現金及び現金同等物期末残高

 

これでCF計算書終わります。

 

今回で「ある数で作られた数列」シリーズ最終回です。

 

5-3 「ある数でつくられた数列」を解くために:part5             
「ある数でつくられた数列」では、3つの異なる整数を何度も掛け合わせて得られる数 を 小さい順に管理 する必要があります。
通常の配列を使用すると計算量が大きくなるため、この問題では 優先度付きキュー(ヒープ)を用いる練習をしてみましょう。
3つの整数A_1, A_2, A_3が与えられます。また、N個の整数b_1, b_2, ..., b_Nが与えられます。
各b_iに対して、A_1, A_2, A_3を掛けた値を優先度付きキューに追加し、その時点での最小の値を取り出して出力してください。

Pythonの場合:
・ heapq モジュールを使用する(デフォルトで最小ヒープ)

入力例   出力例
2 3 5   8
3   10
4   12
5    
6    

 

モジュールを使用しなくても、今まで作成してきたプログラムです。作成できます。

A = []
S =[]
X,Y,Z = map(int,input().split())
N = int(input())
for i in range(N):
    S.append(int(input()))
for K in S:
    for i in [X,Y,Z]:
        A.append(K*i)
    A.sort()
    print(A[0])
    del A[0]
今までにいろいろ作成してきたので、説明は省略します。

 

今回はheadqを使って解いていきましょう。

 

heapqはPython標準ライブラリに含まれるモジュールで、ヒープキューアルゴリズム(優先度付きキュー)を提供します。このアルゴリズムは、効率的に最小値や最大値を管理するために使用されます。

関数 説明
heapq.heapify(list)   リストをヒープ構造に変換  
heapq.heappush(heap, item) ヒープに要素を追加  
heapq.heappop(heap)   最小値を取り出して削除  
heapq.heappushpop(heap, item) 要素を追加してから最小値を削除
heapq.heapreplace(heap, item) 最小値を削除してから要素を追加
heapq.nlargest(n, iterable) 最大値上位 n 個を取得  
heapq.nsmallest(n, iterable) 最小値上位 n 個を取得  

 

import heapq
A = []
X,Y,Z = map(int,input().split())
N = int(input())
hp = []

for j in range(N):
    b = int(input())     
    for p in [X,Y,Z]:
        heapq.heappush(hp,b*p) ←ヒープ配列に加えていきます
    
    a = heapq.heappop(hp)            ←最小値を見つけ出し、変数に入れて、配列の要素から削除する
    print(a)
 

heapモジュールを使うことにより、  heapを使用しないプログラムで行わなければならないA.sort()や del A[0]の機能を使わなくても、作成できるということです。処理理スピードも速くなるでしょうね。

 

前回は営業活動によるCFの間接法を考えました。

今回は直接法を考えていきましょう。

 

①-1 営業活動によるCF 直接法

直接法は投資活動や財務活動で行ったように勘定分析から数字を導き出します。

実はPL、BSを作成するうえで、既に勘定分析は行っています(179回をご参照ください)。

関連する勘定分析を再掲し、考えていきましょう。

 

営業収入

            受取手形+売掛金
期首 受取手形      64,000        | 回収                 1,101,000 (1,100,750 + 手形売却損 250) CFは手取り額
           売掛金       296,000        | 貸倒                         5,000
売上                    1,110,000  |  期末 受取手形    49,000     
                                                       |      売掛金     315,000
                             1,470,000      |                            1,470,000

           貸倒引当金
使用 5,000  | 期首       9,000
期末 9,100  | 繰入額   5,100

 

商品の仕入れによる支出

                                 買掛金+支払手形
仕入支払              667,000 | 期首買掛金      236,000
期末 買掛金         259,000 | 支払手形            78,000
          支払手形       76,000 | 仕入高              688,000
                             1,002,000                          1,002,000   

 

                        仕入
期首 240,000 | 売上原価   668,000 
仕入 688,000 | 期末            260,000   (閉鎖残高254,000 +評価損戻す 6,000) 
          928,000 |                      928,000

 

人件費の支出

                        退職給付引当金
退職一時金     1,150 | 期首                   23,000
年金掛金               50  | 退職給付費用   3,300 ②
期末               25,100  |  
                        26,300  |        26,300

PL 給料 275,000+ 退職一時金1,150 + 年金掛け金50 = 276,200

 

その他の営業支出

         前払営業費
期首  2,000 | P/L  68,300
支出68,000 | 期末 1,700

 

以上を集約しますと

営業活動によるCF

営業収入              1,100,750

商品の仕入による支出           △667,000

人件費の支出                             △276,200

その他の営業費支出                 △ 68,000

小計                                                      89,550

 

これで直接法完成です。

 

次回は残っている利息と配当金について考えてみましょう。

 

今回から新シリーズ「ある数でつくられた数列」を解いていきましょう。

 

5-1  「ある数でつくられた数列」を解くために:part3 

 「ある数でつくられた数列」では、小さい方から k 番目 の値を求める際に重複を排除する必要があります。この問題で計算結果から重複を取り除く練習をしましょう。
3 つの整数 A_1, A_2, A_3が与えられます。
その後与えられる b_i (1 ≦ i ≦ N) と A_1, A_2, A_3を掛け合わせてできる整数の種類を出力してください。

入力例   出力例
1 2 3   11
5    
1    
2    
3    
4    
5    

 

個々に掛け合わせ、重複数字を取り除きます。

AD = []
x,y,z = map(int,input().split())
N = int(input())
for i in range(N):          
    a = int(input())
    A = a * x 
    AD.append(A)
    A = a * y
    AD.append(A)
    A = a * z
    AD.append(A)
ADS = set(AD)      ←set()関数を使って重複を排除しています
print(len(ADS))
 

AD:[1, 2, 3, 2, 4, 6, 3, 6, 9, 4, 8, 12, 5, 10, 15]
ADS:{1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15} 

 

5-2  「ある数でつくられた数列」を解くために:part4 
「ある数でつくられた数列」では k が 1 ≦ k ≦ 1000 と大きく、計算量を意識する必要がありましたがこの問題では k が最大で 30 と小さくなっています。←なっていない
part 3 で学んだ重複排除と配列を駆使して解答してみましょう。
その数列は 1 に 3 つの素数を複数回掛け合わせてできた数を小さい順に並べたものとなっています。
ある素数を一回も使わないこともあることに注意してください。

あなたはその数列で k 番目のものを出力するプログラムを作成してください。
入力例        出力例
2 3 5 7        8
この問題は計算量をKが最大30としていますが、

すべてのテストケースにおいて、以下の条件をみたします。

* 入力はすべて整数
* 1 ≦ A_1, A_2, A_3 ≦ 10
* 1 ≦ N ≦ 10^5
* 1 ≦ b_i ≦ 10^5

この条件はたぶん間違いだと思います。Kの設定がないのです。

また例題には

3 5 7 1000 という問題例もあり、Kは35を超えています。

ここにあげられた問題はFinal問題そのままですので、なんか別問題のつもりが、Final問題となってしまったように想像できます。

ということで、Final問題を解くことにします。Paizaの関係者がお読みなら、修正をお願いします。

 

FINAL    ある数でつくられた数列                 
あなたは 3 つの素数 P_1, P_2, P_3 を使って数列をつくることになりました。                        
その数列は 1 に 3 つの素数を複数回掛け合わせてできた数を小さい順に並べたものとなっています。                        
ある素数を一回も使わないこともあることに注意してください。                        
あなたはその数列で k 番目のものを出力するプログラムを作成してください。                        
P_1, P_2, P_3 はそれぞれ相異なる素数
* 2 ≦ P_1, P_2, P_3 ≦ 7
* 1 ≦ k ≦ 1,000
入力例        出力例
2 3 5 7        8
 

入力される素数をかけ合わせていけばいいようです。

 

A = []
A.append(1)
C = []
C.append(1)
X,Y,Z,K = map(int,input().split())
for i in range(K):               
    v = A[0]
    del A[0]
    for j in [X,Y,Z]:
        C.append(j*v)   ←単純に掛け合わせていけばよい 配列Cは出力用テーブル
        A.append(j*v)   ←配列Aは作業よテーブル

    A = list(set(A))    ←重複削除
    A.sort()    

CC = list(set(C))        ←重複削除               
CC.sort()
print(CC[K-1])

 

A:

[2, 3, 5]
[3, 4, 5, 6, 10]
[4, 5, 6, 9, 10, 15]
[5, 6, 8, 9, 10, 12, 15, 20]
[6, 8, 9, 10, 12, 15, 20, 25]
[8, 9, 10, 12, 15, 18, 20, 25, 30]
[9, 10, 12, 15, 16, 18, 20, 24, 25, 30, 40]

CC:

[1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 30, 40]

 

最終問題を解きましたが、

次回はこのシリーズのメインである、最小ヒープ(heapq)について考えてみましょう。

 

今回は前回作成したPL、BSから営業によるCFを作成しましょう。

 

①-2 営業活動によるCF 間接法

第72回第一問より
会計期間X1.4.1 ~ X2.3.31

本問は間接法のみですが、間接法を作成しましょう。

直接法に比べて比較的容易に作成できるので、多くの企業は間接法を採用しているようです。

 

基本は税引前利益から営業利益へ修正します。それに加え営業利益内の非資金項目を修正します。

ただし、営業債権や仕入債務等に係る営業外損益は修正しないことに注意が必要です。

理由は、営業活動から発生した、棚卸減耗損、商品評価損、手形売却損、為替差損益は                        
調整しない。すでに営業債権や営業債務に取り込まれているからです。

修正が終われば、営業債権、仕入債務、営業活動に関わる、前払営業費、未払金等のBSの増減で

記載します。

 

では前回作成したPL、BSを再掲します。

貸方
売上                                        1,110,000                      
受取利息                                       2,430 
有価証券売却益                          1,750
法人税等調整額        1,320  
合計                                       1,115,500
借方
仕入                                            668,000
商品評価損                                    6,000
給料                                            275,000
退職給付費用                               3,300
減価償却費                                    5,900
貸倒引当金繰入額                       5,100
その他営業費                             68,300
支払利息             2,400
手形売却損                                        250
有価証券評価損                               200
固定資産売却損                           3,500   
法人税等                                      24,800
繰越利益剰余金                         52,750
合計                                         1,115,500

 

閉鎖残高(一部)
借方        期首残高   閉鎖残高     増減額
受取手形                             64,000                  49,000      △15,000
売掛金                               296,000                315,000          19,000
繰越商品                          240,000                 254,000          14,000
前払営業費                          2,000                      1,700            △300
貸方

支払手形                            78,000                    76,000        △2,000
買掛金                              236,000                  259,000          23,000
貸倒引当金                           9,000                      9,100                100

退職給付引当金               23,000                    25,100            2,100

 

営業活動によるCF

税引前利益                         76,230 (当期純利益 52,750+ 法人税等24,800 - 法人税等調整額1,320)

減価償却費                                  5,900

貸倒引当金の増加額                       100

退職給付引当金の増加額           2,100

受取利息                                  △2,430

有価証券売却益                        △1,750

支払利息                                          2,400

有価証券評価損                                200

固定資産売却損                         3,500

売上債権の増加額                   △4,000

棚卸資産の増加額                △14,000

前払費用の減少額                           300

仕入債務の増加額                     21,000

小計             89,550

 

商品評価損と手形売却損は修正しません。

資産が増加した場合、CFは減少、減少した場合、CFは増加

負債が増加した場合、CFは増加、減少した場合,、CFは減少

資産の場合増減がCFでは逆になること覚えておくと便利

引当金は直接減額されるものあるので、引当金の増減で計算します。

(退職給付費用や貸倒引当金繰入額は使用しない)

 

次回は直接法を考えてみましょう。

いよいよこのシリーズも最終問題。

いよいよラスボス登場です。

あらゆる大きさの長方形が降ってきます。

難問です。

 

4-4   落ちものシミュレーション 

プログラミングが大好きなあなたは、自作の落ちものゲームを開発することにしました。
ゲームの仕様は次のようになっています。

・ ゲームは縦幅 H、横幅 W の長方形のフィールドで行われます。
・ ゲームが始まると、様々なサイズの長方形がフィールドの上方から一つずつ順番に落ちてきます。
・ 落ちてくる長方形の直下に他の長方形もしくはフィールドの底辺がある場合、接触したとみなして長方形の位置は固定されます。

入力例   出力例  
7 10 4   ..........  
1 8 1   ..######..
4 1 5   .....#....  
1 6 2   .....#....  
2 2 0   ##...#....  
    ##...#....  
    .########.

これは難問です。

..........
..##......

...#######

......####

上記のようなパターンが生まれます。

いままでのプログラムなら#が底に落ちてしまいます。

 

H,W,N = map(int,input().split())            
            
AD =[["."] * W for _ in range(H)]            
AA = []            
dd = []            
DD = []            
CC = {}            
CCV = []            
for i in range(N):            
    a =list(map(int,input().split()))          ←落ちてくる長方形のテーブルです     
    AA.append(a)                                            AA: [[1, 8, 1], [4, 1, 5], [1, 6, 2], [2, 2, 0]]        
                    
for i in range(W):                                           ←すでに落ちた列の行を位置を記憶します            
    CC[i] = 0                      CC:{0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0}       
                
for HH,WW,XX in AA:            
    for i in range(XX,XX+WW):            
        dd.append(i)                                          ←落ちてくる長方形の列幅と位置を示しています        
    DD.append(dd)                 DD:[[1, 2, 3, 4, 5, 6, 7, 8], [5], [2, 3, 4, 5, 6, 7], [0, 1]]          
    dd = []               
            
HH,WW,XX = AA[0]            
HH1 = HH            
for i in range(HH):                  ←最初の長方形を落とします。障害がないので底にできます
    for j in range(XX,XX+WW):             下記①を参照ください  
        AD[H-i-1][j]= "#"            
        CC[j] +=1            
            
for k in range(1,N):                ←2番目から最後まで、長方形を落下させます  
    HH,WW,XX = AA[k]            
    CCV=[]            
    SW=0            
    for x in CC.values():                 ←辞書型CCから値だけをCCVに入れます   
        CCV.append(x)                                        下記②を参照ください
                
    if sum(CCV[XX:XX+WW]) == 0:          ←CCVが0ならばそのまま落下させる       
        SW = 0            
    else:            
        SW=1            
        HH1 = max(CCV[XX:XX+WW])   ←"#"があればその最高行をHH1とします          
                 
    if SW ==0:                     ←なければそのまま着地する
        for i in range(HH):            
            for j in range(XX,XX+WW):            
                AD[H-i-1][j]= "#"              
                CC[j] +=1            
    else:                       ←あれば一つ上の行に着地させます 
        for i in range(HH1,HH1+HH):            
            for j in range(XX,XX+WW):            
                AD[H-i-1][j]= "#"             
                CC[j] = HH1+HH               ←その時の行をアップデートします。範囲すべてを変更します 
                           
for i in AD:            
    print("".join(i))            

 

①最初の長方形を落とす

AD: 

..........
..........
..........
..........
..........
..........
.########.

CC:{0: 0, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 0}

 

②2番目の長方形から順次落下(すでに埋まっている行を列ごとに示します)

CC:{0: 0, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 0}
CCV:[0, 1, 1, 1, 1, 1, 1, 1, 1, 0]
CC:{0: 0, 1: 1, 2: 1, 3: 1, 4: 1, 5: 5, 6: 1, 7: 1, 8: 1, 9: 0}
CCV:[0, 1, 1, 1, 1, 5, 1, 1, 1, 0]
CC:{0: 0, 1: 1, 2: 6, 3: 6, 4: 6, 5: 6, 6: 6, 7: 6, 8: 1, 9: 0}
CCV:[0, 1, 6, 6, 6, 6, 6, 6, 1, 0]

 

③最終的な行の位置

CC:{0: 3, 1: 3, 2: 6, 3: 6, 4: 6, 5: 6, 6: 6, 7: 6, 8: 1, 9: 0}

 

これで完成です。

 

今回は前回に引き続き閉鎖残高を求めましょう

第72回第一問より
会計期間X1.4.1 ~ X2.3.31

 

閉鎖残高

借方        期首残高   閉鎖残高

現金預金                    158,000     182,800

受取手形                             64,000                  49,000 

売掛金                               296,000                315,000

有価証券                             15,000                   17,500

繰越商品                          240,000                 254,000

前払営業費                          2,000                      1,700

未収利息                                   400                      (450) 179回より

建物                                   250,000              (360,000) 177回より

貸付金                                 60,000                   60,000

繰延税金資産                      3,600                     4,900     

合計                               1,089,000      1,245,350       

貸方

支払手形                            78,000                    76,000

買掛金                              236,000                  259,000

未払金                                                                126,000

未払利息                                   250                       150⑩ 179回より

未払法人税等                    11,700      13,800    

借入金                                 45,000                    43,000

退職給付引当金               23,000                    25,100

貸倒引当金                           9,000                      9,100

減価償却累計額              115,000                   49,400  ⑪ 177回より

資本金                                400,000      450,000

資本準備金                         40,000                    50,000 ⑫ 178回より

利益剰余金                         24,000      28,000

別途積立金                         50,000                    55,000  

繰越利益剰余金                57,050                    60,800

合計                                1,089,000              1,245,350

 

                     繰越利益剰余金

別途積立金     5,000 | 期首 57,050

配当金     44,000 | 当期 52,750

期末                60,800 |   

                      109,800            109,800

配当金は178回、当期は179回より

 

これで、BSが完成です。

前回のPLとあわせて、次回は営業活動によるCFを作成していきましょう。

 

今回から営業活動によるCFを考えていきましょう。

 

①営業活動によるCF

始める前に、先に損益と閉鎖残高を完成させましょう。

第72回第一問より
会計期間X1.4.1 ~ X2.3.31

本問は先にCF計算書があって、損益や閉鎖残高を求めていきますが、

先に損益及び閉鎖残高を求めてから、CFを作成してみます。

 

損益

商品売買取引は全て掛けで行っている。

                                  買掛金+支払手形

仕入支払              667,000 | 期首買掛金      236,000

期末 買掛金         259,000 | 支払手形            78,000

          支払手形       76,000 | 仕入高              688,000

                             1,002,000                          1,002,000   

 

                        仕入

期首 240,000 | 売上原価   668,000 ①

仕入 688,000 | 期末            260,000   (閉鎖残高254,000 +評価損戻す 6,000) 

          928,000 |                      928,000

 

                         退職給付引当金

退職一時金     1,150 | 期首                   23,000

年金掛金               50  | 退職給付費用   3,300 ②

期末               25,100  |  

                        26,300  |        26,300

 

減価償却費 第177回で計算済み 建物 減価償却費 5,900③

           前払営業費

期首  2,000 | P/L  68,300

支出68,000 | 期末 1,700

 

支払利息 

14 借入金 20,000 (利率5% 利払日6月、12月末日) 12月返済済み

   前期末 未払利息 20,000 X 2.5% X (3カ月/6カ月) = 250 支払利息250 /  未払利息 250

       翌期首振替 未払利息 250 / 支払利息 250

       6月支払 支払利息 500 / 現金預金 500

       12月支払 支払利息 500 / 現金預金 500    

       20,000 X 5% = 1,000 X (9カ月/12カ月) = 750

15 借入金 X2.2.1 新規借入 閉鎖43,000 - (16)25,000 = 18,000 

       利率5% 利払日 7月、翌年1月 

                        18,000 X 2.5% X (2カ月/6カ月) = 150

                        支払利息 150 / 未払利息 150

16 借入金 25,000 利率? 利払日9月、3月末

  支払利息 支払 CF 支払利息 2,500 - (14) 1,000  = 1,500

      支払利息 P/L  (14) -250 + 1,000 + (15) 150 + (16) 1,500 = 2,400 ④

 

              未払利息

支払 2,500    |  期首    250

期末    150⑪ |  P/L  2,400④

 

     有価証券

期首      15,000 | 売却      11,550   

購入      12,500 | 評価損        200 ⑤

売却益    1,750 |  期末     17,500

               29,250 |                29,250

 

固定資産売却損 177回より、3,500 ⑥

 

売上

2 売掛金支払、約束手形217,000 裏書譲渡  受取手形217,000 / 売掛金 217,000

3 手形割引 20,000   現金預金     19,750 / 受取手形 20,000

                                           手形売却損      250 /

 

                                   受取手形+売掛金

期首 受取手形      64,000        | 回収                 1,101,000 (1,100,750 + 手形売却損 250) CFは手取り額

           売掛金       296,000        | 貸倒                          5,000

売上                    1,110,000⑧  |  期末 受取手形    49,000     

                                                       |      売掛金     315,000

                             1,470,000      |                            1,470,000

 

           貸倒引当金

使用 5,000  | 期首       9,000

期末 9,100  | 繰入額   5,100

 

12 貸付金 60,000 利払日 6月、翌年1月末 X2.2月以降0.5%上げている

未収 期首 400 (2か月分)  400 X (6カ月 / 2カ月) = 1,200 / 60,000 = 2%(半期)

前期末 未収利息 400 / 受取利息 400

翌期首 受取利息 400 / 未収利息 400

6月受取 現金預金 1,200 / 受取利息 1,200

2月受取 現金預金 1,200 / 受取利息 1,200

期末 60,000 X 2.25% = 1,350 X (2カ月/6カ月) = 450

          未収利息 450 / 受取利息 450

 

                  未収利息

期首    400      | 受取 2,400

P/L   2,430 ⑨ | 期末    450

          2,850      |           2,850

 

未払法人税等

支払 22,700 | 期首 11,700

期末 13,800 |  P/L   24,800 ⑦

          36,500 |           36,500

これで損益穴埋め終了です。

貸方

売上                                        1,110,000                      

受取利息                                       2,430 

有価証券売却益                          1,750

法人税等調整額        1,320  

合計                                       1,115,500

借方

仕入                                            668,000

商品評価損                                    6,000

給料                                            275,000

退職給付費用                               3,300

減価償却費                                    5,900

貸倒引当金繰入額                       5,100

その他営業費                             68,300

支払利息             2,400

手形売却損                                        250

有価証券評価損                               200

固定資産売却損                           3,500   

法人税等                                      24,800

繰越利益剰余金                         52,750

合計                                         1,115,500                  

 

次回は閉鎖残高を作成しましょう。

「落ちものシュミレーション」を続けましょう

 

4-3 「落ちものシミュレーション」を解くために : part3 

今回の問題では、長方形の大きさに特別な制約はなく、落ちてくる長方形が 2 個の場合を解いてみましょう。
2 個の長方形が落ちてきた後のフィールドの状態を表示するプログラムを書いてください。
ゲームの仕様は次のようになっています。
・ ゲームは縦幅 H、横幅 W の長方形のフィールドで行われます。
・ ゲームが始まると、様々なサイズの長方形がフィールドの上方から一つずつ順番に落ちてきます。
・ 落ちてくる長方形の直下に他の長方形もしくはフィールドの底辺がある場合、接触したとみなして長方形の位置は固定されます。

入力例   出力例  
7 10 2   ..........  
1 8 1   ..........  
4 1 5   .....#....  
    .....#....  
    .....#....  
    .....#....  
    .########.

 

だんだん複雑になってきました。大きさがバラバラな長方形が2個落ちてきます。

1個目と2個目に重複個所があるかどうかがポイントです。

この例では2個目の5番目が1個目と重複しています。

H,W,N = map(int,input().split())

AD =[["."] * W for _ in range(H)]         ←配列の模様を初期化します     
AA = []
dd = []
DD = []
for i in range(N):          ←落ちてくる長方形をテーブルに入れます
    a =list(map(int,input().split()))      AA:[[1, 8, 1], [4, 1, 5]]
    AA.append(a)

for HH,WW,XX in AA:          重複しているかどうかを確認のため、2個の長方形を  
    for i in range(XX,XX+WW):      テーブルに入れます       

        dd.append(i)           DD:[[1, 2, 3, 4, 5, 6, 7, 8], [5]] 
    DD.append(dd)                                             
    dd = []                 

com = set(DD[0]) & set(DD[1])                 ←論理積を使って、重複個所を認識します
sw = 0                com:{5} 重複しているのでswを立てます
if com:
    sw = 1

HH,WW,XX = AA[0]           ←最初のデータを長方形の範囲を"・"を"#"に変える
HH1 = HH
for i in range(HH):
    for j in range(XX,XX+WW):
        AD[H-i-1][j]= "#"

HH,WW,XX = AA[1]                                    
if sw ==0:            
    for i in range(HH):                                ←2個目のデータで1個目と重複がなければ1個目と同様です
        for j in range(XX,XX+WW):
            AD[H-i-1][j]= "#"    
else:               ←重複していれば、行を1つ上げて"#"に変えていけばOK
    for i in range(HH1,HH1+HH):
        for j in range(XX,XX+WW):
            AD[H-i-1][j]= "#"       

for i in AD:
    print("".join(i))

 

いろいろな重複確認の方法があると思いますが、2個しか落ちてこないでの、論理積で重複の有無を確認しました。

おかげさまで100回到達!