などとイキってたんですが、サイバイマンにやられたヤムチャになった私です
やっぱ世界のなべなんとかさんのネタを・・・最高やな!
結局そこだけ python3を使って解きました
リスト操作なんてpython3のぬるま湯に浸かってた勢の私には(無理無理無理産め)ないです
ではNo.264から
No.264
implicit none
integer(8) n,k,s
read(*,*) n,k
s=n-k
select case (abs(s))
case(1)
if (n>k) then
write(*,*)"Lost"
else
write(*,*)"Won"
end if
case(2)
if (n>k) then
write(*,*)"Won"
else
write(*,*)"Lost"
end if
case(0)
write(*,*)"Drew"
end select
end
ぐー、ちょき、ぱーの三つを順に0、1、2に例えた時の勝敗を調べるプログラムです
はじめてcase構文を使いましたが、ifの入り子構造よりも見やすくて非常にいいですねぇ
難点としてはcase内部には数式を詰めないといけないということでしょうか
特に問題はないですね
次が一番やべぇやつだったNo.207です
No.207
A, B = input().strip().split(' ')
A=int(A)
B=int(B)
B=B+1
num=[i for i in range(A,B,1)]
num1=[i for i in num[:] if i % 3 == 0]
num2=[str(i) for i in num]
num3=[]
for i in range(0,B-A):
if num2[i].find('3') == -1:
pass
else:
num3.append(num2[i])
num4=[int(i) for i in num3]
world_nabe=num1+num4
world_nabe2 = list(set(world_nabe))
world_nabe2.sort()
for i in world_nabe2[:]:
print(i)
世界のなべなんとかさんのネタを基にしたプログラムですね
たぶん問題としては非常に簡単なんだとは思います
というのも、AとBも差が100以内と決まっているので、細かく見る必要がある桁は下三桁までなんですよね
何言っているんだ?になると思うんですが、
例えばAが199801のときBは最大で199900となります
こう見ると、完全に上三桁を無視できません?
三の倍数の性質として各桁の数の総和が三の倍数であれば三の倍数となります。
そのため、上三桁の数の合計を出してしまえば、あとは下桁との合算を行うだけです。
結果的に下三桁を考えるだけでいいんですよね
ただ、厄介なのがAが199901の時であればBの最大が200000となるんですよ
総とっかえになるので、このために別にプログラムを組む必要があります
などなど考えたのは、すべてが終わった後だったとね!
元々は考えていたのは以下の流れでした
・三の倍数を格納した配列[A]を作り、数を確認する
・整数を文字列に変換し、3の付く数字を別の配列[B]に格納する
・[A]の数から空いている所に[B]を入れ、配列[C]を作る
・最後に[C]をソートする
Fortranで書こうとしたんですが、3の付く数字の判定でしくじったんですよね・・・
do構文を用いて効率的にしようとしたんですが、何故かうまくいかないんですよ
compileはできるけどもプログラムとしては動かないという有様で・・・
1日悩んでも上手くいかないので諦めてpythonで書きました
解説しているようなスマートな解き方ではなく、パイソニックともいえない酷いゴリ押しプログラムですが、
動いたんでいいとしません?
次にしましょ、次に
No.32
implicit none
integer(8) a,b,c,l,m,n
read(*,*) l
read(*,*) m
read(*,*) n
a=((n*1)/25)
if (.not.a==0) then
m=m+a
n=n-a*25
end if
b=((m*25)/100)
if (.not.b==0) then
l=l+b
m=m-b*4
end if
c=((l*100)/1000)
if (.not.c==0) then
l=l-c*10
end if
write(*,*) l+m+n
end
これも言うことはないです
段階を踏まないと両替ができない・・・面倒なところはそれだけです
No.163
implicit none
integer(8) i
character(100) moji
read(*,*) moji
do i=1,len(moji)
if (moji(i:i) >= 'a' .and. moji(i:i) <= 'z') then
moji(i:i) = char(ichar(moji(i:i)) - 32)
else if (moji(i:i) >= 'A' .and. moji(i:i) <= 'Z') then
moji(i:i) = char(ichar(moji(i:i)) + 32)
end if
end do
write(*,*) moji
end
これも特にいうことはないです
文字コードの数値が分からなくて、人力で調べたことは内緒
No.289
implicit none
integer(8) i,j
character(10000) moji
character(10000) suchi
integer(8),allocatable :: x(:)
allocate (x(10000))
read(*,*) moji
x=0
do i=1,len(moji)
if (moji(i:i) >= '1' .and. moji(i:i) <= '9') then
suchi=moji(i:i)
read(suchi,*) j
x(i)=j
end if
end do
write(*,*) sum(x)
end
( ^ω^) どーせNo.207と同じ末路辿るんでしょ、知ってる知ってる・・・
yuki>AC
( Д ) ⊙ ⊙ ファッ
何故これが良くて207が駄目だったんですかねぇ
正直うまくいった理由が分からないです
No.275
program heikin
integer(8) a,n,s
real(8) b
real(8),allocatable :: x(:)
read(*,*) n
allocate (x(n))
read(*,*) (x(m),m=1,n)
call mat(x,n)
if (mod(n,2)==1) then
s=int(n/2)
s=s+1
write(*,*) x(s)
else
s=n/2
b=(x(s)+x(s+1))/2
write(*,*) b
end if
end program
subroutine mat(x,n)
integer(8) n,j,i,t
real(8),dimension(n) ::x
do i=1,n-1
do j=i+1,n
if(x(i) > x(j))then
t=x(i)
x(i)=x(j)
x(j)=t
end if
end do
end do
end subroutine
Fortranはpythonと違ってリスト操作を別に書かないといけないのが面倒ですねぇ・・・
バブルソートっていうんですかね?ネットのプログラムを見ながら書いたんでよくわかってない
ネットでもiとjをずらす手法とか、iとjを前と後ろにして比べる手法だとか、
同じソートでも色々あるんですねぇ
最初は最小値を順番に配列に入れなおす方法を考えて書いていたんですが、
その数値が何番目の配列に格納されているのか調べる手段を思いつかなかったので諦めました
今回はこのあたりで以上!