はじめてのyukicoder vol.4

![イキり.png](https://qiita-image-store.s3.amazonaws.com/0/293790/07bcfba1-51d6-e416-9506-c7c1cc94300e.png)

などとイキってたんですが、サイバイマンにやられたヤムチャになった私です

やっぱ世界のなべなんとかさんのネタを・・・最高やな！

結局そこだけ python3を使って解きました

リスト操作なんてpython3のぬるま湯に浸かってた勢の私には（無理無理無理産め）ないです

ではNo.264から

##No.264
```264.f90
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
```207.py
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となるんですよ

総とっかえになるので、このために別にプログラムを組む必要があります

などなど考えたのは、すべてが終わった後だったとね！
<br>

元々は考えていたのは以下の流れでした

・三の倍数を格納した配列[A]を作り、数を確認する
・整数を文字列に変換し、3の付く数字を別の配列[B]に格納する
・[A]の数から空いている所に[B]を入れ、配列[C]を作る
・最後に[C]をソートする

Fortranで書こうとしたんですが、3の付く数字の判定でしくじったんですよね・・・

do構文を用いて効率的にしようとしたんですが、何故かうまくいかないんですよ

compileはできるけどもプログラムとしては動かないという有様で・・・

1日悩んでも上手くいかないので諦めてpythonで書きました

解説しているようなスマートな解き方ではなく、パイソニックともいえない酷いゴリ押しプログラムですが、

動いたんでいいとしません？

次にしましょ、次に
##No.32
```32.f90
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
```163.f90
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
```289.f90
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
```275.f90
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を前と後ろにして比べる手法だとか、

同じソートでも色々あるんですねぇ

最初は最小値を順番に配列に入れなおす方法を考えて書いていたんですが、

その数値が何番目の配列に格納されているのか調べる手段を思いつかなかったので諦めました

今回はこのあたりで以上！