【2024/10/24-11/1】Python-ソフトウェア勢

55回生
この記事は約7分で読めます。

(サムネが一種類なのを見ると悲しくなるので適当な写真を貼ってどうにかなるようにできるようにがんばるという試みをしています)

このタイトルってどうすればいいんですかね。毎週各班が一斉にブログを投稿するのですごい見ずらいと感じます。これGoogleドキュメントかなんかでみんなで共有しながら書いてそれを代表がコピペすればいいと思うんですけど、どうなんですかね。

会議の日休んでしまうことが多くて何週間か不在になってしまって申し訳ないです。

ということで、特に目標は立てれてなかったのですがAtcorderで問題をいくつか解いていたので、今週は解いた問題と、新しく学んだことを記載していこうと思います。言語はPython(AIとかによく使われるやつ)です。よろしくお願いします。

リスト内での順番の入れ替え

「(リストの名前)[左から何番目か],(リストの名前)[入れ替えたい場所が左から何番目か]=左辺の左右を逆にする」

解いた問題:A-Jiro

記号の種類によってリスト内の記号を右や左に動かせば解けるかなーと思ったのでそういうコードを書きました。

最終的に正解できた回答はこれです。

S = input()  # 文字列読み取る
list = [ "A", "B", "C" ]

for i in range(5):  # 5回繰り返す(一応空白を含めた文字の数)
  
  if S[i] == "<":  # もしSのi番目が<という文字なら
    
    if i <= 2:  # もしiが2以下なら
      ins = list.index("A") # listのA番目の数字を代入(順番入れ替える時のエラー防止)
      list[ins], list[ins+1] = list[ins+1], list[ins] #入れ替え
      
    if i == 4: # もしiが4なら(5文字(3文字)目)
      ins = list.index("B") # listのB番目の数字を代入(エラー防止)
      if list[ins+1] != "C": # BとCのがそれぞれ端っこにある場合
        k = 2  # kを2とする
      else:  #そうでなければ(iが4じゃないなら)
        k= 1  # kを1とする
      list[ins], list[ins+k] = list[ins+k], list[ins]

print(list[1])

ついでに「(リストの名前).index(リスト内の要素)」で、「リスト内の要素」が左から何番目にあるのかを求められることを知りました。というか普通の文字列でも右隣に[数字]で「数字」番目の特定の文字をとれることを知りました。やったー。

入力データをリストにする

空白が入ったものをリスト化するためのものです。

(適当な文字)= list(map(int,input().split()))

解いた問題:A-Buildings

一応、回答

N = int(input())
list_H = list(map(int,input().split()))
ans = -1

for i in range(1,N):
  if list_H[i] > list_H[0]:
    ans = i+1
    break

print(ans)

入力をリストで受け取ったことがなかったので、良い学びでした。でもまだ暗記して書くのは難しそうですので沢山使っていきたいです。あとこの問題で初めて問題文の意味を履き違えてぐだぐだしてしまったのでちゃんと読む読めるようになると良いと思います。

リストを軽くする

重複する要素を一つにまとめる

新しい名前のリスト = list(set(まとめたい要素があるリスト))

順番を整理する

昇順

順番を整理したいリスト.sort()

降順

順番を整理したいリスト.sort(reverse=True)

setを使う

GPTさんによるとリストより集合の方が軽いらしいです。重複している物は自動でまとめられますが、順番が消えます。

実例と比較

解いた問題:A-カードゲーム2

【リストを使った方】

N = int(input())  #受け取った数字をNとする
list_a = list(map(int,input().split()))  #リストaを受け取る
list_A = list(set(list_a))  #リストAを重複要素をなくしたリストaとする
list_A.sort()  #リストAを昇順に並び替える
k = 0  #条件を満たさないと変わらない変数k

for i in range(N-2):  #N-2回繰り返す(右に2つ要素がないと確かめようがないので-2してる)
  if list_A[i]+3 in list_A and list_A[i]+6 in list_A:  #もしリストAの左からi+3番目がリストAに含まれている、かつ、リストAの左からi+6番目がリストAに含まれているなら
    print("Yes")  #Yesという文字を出力する
    k = 1  #kを1とする
    break  #ループを無視して下に進む

if k == 0:  #もしkが0なら
  print("No")  #Noという文字を出力

【セットを使った方】

N = int(input())
set_A = set(map(int,input().split()))  #入力をセットAとする(重複と順序は自動でなくなる)
k = 0

for i in set_A:  #セットAの要素の数の回数繰り返す(iはセットAの要素になる)
  if i+3 in set_A and i+6 in set_A:
    print("Yes")
    k = 1
    break

if k == 0:
  print("No")

てな感じで、使い方はリストと似てました。

この二つのコードの中で変えているのはリストかセットかぐらいなのですが、結果は全く違いました。

【リストを使った方】

上記のリストを使ったコードでの結果です。GPTさんによると処理が多すぎたとか何とかでエラー(RE)とか実行時間長すぎ問題(TLE)が起こってたらしいです。

【セットを使った方】

すごーい

リストを使ってた方とセットを使った方の実行時間の差がえげつない

この問題、JOYの二次予選なのですが、検証するデータが多くて完答が難しかった…というか、setを使った瞬間大正解になって仰天しました。set最高。でもこれでA問題なら幸先が不安ですね…

どっちか大きい方を使う

max( 比べるやつA , 比べる奴B )

解いた問題:D-どら焼き

放課後のJOIの一次予選の練習用の問題です。問題文がすごく読みづらかったです。一応自分の回答も載せておきます。

N,M = map(int,input().split())
list_A = list(map(int,input().split()))
list_B = list(map(int,input().split()))
ans = 0

for i in range(N):
  for j in range(M):
    ans += (list_A[i]+list_B[j])*max(list_A[i],list_B[j])

print(ans)

という感じです。おわり。

来週の目標

最近FNFというリズムゲームの二次創作に感銘を受けているので、来週はLuaというプログラム言語を学んでみたいと思います。現時点でわかっているPythonのコードにあてて考えてみたいです。

おまけ

こう言う記事って専門外の人から見たらちんぷんかんぷんだと思うので最近見たTwitterの中で面白そうなロボットのサイトを紹介しようと思います。プルプル動くロボットって可愛いので、動画だけでも見てみてください。

(なんかリンクが貼れないのでこの文字列タップして飛んでください)

凡庸ロボットらしいです。背景のホワイトボードに落書きしてあるのがなんかほっこりしました。

以上です。では今日も一日

コメント

タイトルとURLをコピーしました