3
1

名刺バインダー管理 (paizaランク B 相当)

背景

スクリーンショット 2024-08-17 20.24.49.png

1枚のファイルには、n個のポケットが横に並んでおり、表と裏の両面から名刺を眺めることができます。
このため、1つのポケットには、2枚の名刺が背中合わせに入っています。

  • 1番からn番の名刺は、1枚目のファイルの表面から見たときに左詰めに並んでおり、
  • n+1番から2n番の名刺は、1枚目のファイルの裏面から見たときに左詰めに並んでいます。
  • 2枚目以降のファイルにも同様に名刺が並んでいます

このプログラムは、名刺を収納したバインダーにおいて、与えられた名刺番号 m に対応する裏側の名刺番号を求めるものです。各ポケットには2枚の名刺が背中合わせに入っており、1枚のファイルには n 個のポケットが並んでいます。

全体のコード

以上のステップをまとめると、最終的なコードは以下のようになります。

# 入力を受け取る
n, m = map(int, input().split())

# 名刺番号を調整するために m-1 を計算
adjusted_m = m - 1

# adjusted_m を n で割った商に n を掛けた値を base とする
base = (adjusted_m // n) * n

# adjusted_m を n で割った余りを remainder とする
remainder = adjusted_m % n

# adjusted_m を 2*n で割った余りが n より小さい場合
if adjusted_m % (2 * n) < n:
    # base に 2*n を足して、余りを引いた値を result とする
    result = base + 2 * n - remainder
else:
    # そうでない場合、base から余りを引いた値を result とする
    result = base - remainder

# 名刺番号を出力
print(result)

たとえば、n = 3m = 5 の場合:

  • adjusted_m = 4 です。
  • base = 3 になります。
  • remainder = 1 です。
  • adjusted_m % (2 * n) = 4 なので、4 < 3 は偽です(つまり、名刺は裏側にあります)。
  • result = base - remainder = 3 - 1 = 2 となり、出力されるのは 2 です。

ステップごとの詳細

このコードは、名刺の番号 m が与えられたときに、その名刺がファイルのどちらの面にあるかを判断し、その裏側にある名刺の番号を計算して出力するものです。以下にコードの各部分を詳しく説明します。

コードの解説

1. 入力を受け取る

n, m = map(int, input().split())

まず、n と m の2つの整数値を標準入力から受け取ります。この際、input() 関数で入力を受け取り、split() でスペース区切りの値に分割し、map() 関数を使ってそれぞれを整数値に変換します。

  • n: 1つのファイルに含まれるポケットの数を表します。
  • m: 名刺の番号です。
  • input().split() は、入力された文字列をスペースで区切り、それを整数に変換して nm に代入します。

2. 名刺番号を調整する

adjusted_m = m - 1
  • 名刺番号 m を0ベースに変換するために、m-1 を計算して adjusted_m に代入します。これにより、計算が簡単になります。

3. adjusted_mn で割った商に n を掛けた値を base とする

base = (adjusted_m // n) * n
  • adjusted_mn で割った商(整数部分)に n を掛けた値を base として計算します。これは、名刺が属するファイルのブロックの開始番号に相当します。

4. adjusted_mn で割った余りを remainder とする

remainder = adjusted_m % n
  • adjusted_mn で割った余りを remainder として計算します。これは、名刺がそのブロック内で何番目に位置しているかを示します。

5. 条件による分岐

if adjusted_m % (2 * n) < n:
    result = base + 2 * n - remainder
else:
    result = base - remainder
  • adjusted_m % (2 * n) < n: 名刺がファイルの表側にあるかどうかを判断します。
    • 表側にある場合 (adjusted_m % (2 * n) < n):
      • result = base + 2 * n - remainder: base2 * n を足し、remainder を引いた値を result とします。これにより、裏側の名刺番号を計算します。
    • 裏側にある場合:
      • result = base - remainder: base から remainder を引いた値を result とします。これにより、表側の名刺番号を計算します。

6. 裏側の名刺番号を出力

print(result)
  • 最後に、計算された result(裏側の名刺番号)を出力します。
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1