クックパッドスプリングインターンシップ2022に参加した

作成日:

event

本記事は、クックパッド春の超絶技巧パンまつり〜スプリングインターンシップ 2022〜の参加レポートです。インターンシップは、3/18、4/24 日に開催されたのですが、3/18 日の方に参加しました。

インターンシップ概要

1 日のスケジュールは下記の通りです。本来なら、オフラインでパン作りが体験できる予定だったのですが、コロナウイルスの影響でオンラインで開催され、パン作りもできませんでした。なので、オンラインでクックパッド CTO の成田さんのパン作りが中継されるという形でした。

13:00 集合&注意事項説明
13:15 超絶技巧プログラミングの講義
14:00 超絶技巧プログラミングの発表作品の作成
17:00 作品の発表
18:00 Q&A
18:30 終了

超絶技巧プログラミングの講義では、「あなたの知らない超絶技巧プログラミングの世界」の著者である遠藤さんにどのような超絶技巧プログラムがあるのかの紹介や、作成方法などを教えていただきました。14:00 からは、講義や本を参考にしながら、実際に自分で超絶技巧プログラムを作成します。そして、17:00 から作成したプログラムを発表します。発表では、悪い箇所を指摘されるのではなく、良い箇所をとことん褒めていただけるという感じです。

感想

結論から言うと、とても楽しかったです。初めて超絶技巧プログラミングというものをしたのですが、とても奥が深く、実装できたらとても達成感がありました。また、初めて ruby を触るということで、心配だったのですが基本的な構文だけで作成できたので安心しました。 インターンといっても、本気でプログラムを書くと言うより、楽しくプログラムを書くと言う感じなので、気楽に参加できました。 心残りなのは、オンラインでの開催だったことと、実際にパン作りができなかったことです。ただ、オンラインでもとても楽しいインターンシップでした。自分も手作りのパンを作ってみようと思いました。

作成したプログラム

私が発表のために作成したプログラムを紹介します。 私は、アスキーアートでデジタル時計を作成しました。
スクリーンショット 2022-03-24 21.18.55.png

リアルタイムで時間が更新されます。
スクリーンショット 2022-03-24 21.18.56.png

get-num


def convertSharpToNum(asciiart,input_num)
  num = asciiart.scan('#').length
  num_string = ""
  loop{
   if num ==0 then
    break
   end
   num_string +="#{input_num}"
   num-=1
 }
 convertedAsciiart = asciiart.gsub("#"){num_string.slice!(0,1)}
 return convertedAsciiart
end

def getZero
  asciiart = <<END
    #######
  ##       ##
##           ##
##           ##
##           ##
##           ##
##           ##
##           ##
##           ##
  ##       ##
    #######
END

  return convertSharpToNum(asciiart,0);
end

def getOne
  asciiart = <<END
     ####
  ##   ##
##     ##
       ##
       ##
       ##
       ##
       ##
       ##
       ##
  #############
END
return convertSharpToNum(asciiart,1);
end

def getTwo
  asciiart = <<END
    #####
  ##     ##
##        ##
        ##
        ##
      ##
    ##
    ##
  ##
##
###############
END
    return convertSharpToNum(asciiart,2);
end

def getThree
  asciiart = <<END
  ####
##    ##
        ##
        ###
      #####
   ########
      #####
        ###
        ##
##    ##
  ####
END
return convertSharpToNum(asciiart,3);
end

def getFour
  asciiart = <<END
     ##    ##
    ##     ##
   ##      ##
  ##       ##
 ##        ##
##         ##
#################
           ##
           ##
           ##
           ##
END
return convertSharpToNum(asciiart,4);
end

def getFive
  asciiart = <<END
##############
##
##
##
###########
            ##
            ##
            ##
##         ##
  ##      ##
  #######
END
return convertSharpToNum(asciiart,5);
end

def getSix
  asciiart = <<END
    #######
  ##        ##
##           ##
##
##
#############
##           ##
##            ##
##           ##
  ##        ##
  #########
END
  return convertSharpToNum(asciiart,6);
end

def getSeven
  asciiart = <<END
##############
##          ##
##         ##
          ##
          ##
        ##
        ##
      ##
      ##
    ##
    ##
END
  return convertSharpToNum(asciiart,7);
end

def getEight
  asciiart = <<END
    #######
  ##       ##
##           ##
##           ##
  ##       ##
    #######
  ##       ##
##           ##
##           ##
  ##       ##
    #######
END
  return convertSharpToNum(asciiart,8);
end

def getNine
  asciiart = <<END
    #######
  ##       ##
##           ##
##           ##
  ##       ##
    #######
        ##
        ##
      ##
      ##
    ##
END
  return convertSharpToNum(asciiart,9);
end

def getNum(input_num)
  case input_num
  when 0 then
    return getZero
  when 1 then
    return getOne
  when 2 then
    return getTwo
  when 3  then
    return getThree
  when 4  then
    return getFour
  when 5  then
    return getFive
  when 6  then
    return getSix
  when 7  then
    return getSeven
  when 8  then
    return getEight
  when 9  then
    return getNine
  end
end

get-num.rb ではデジタル時計で利用する数字のアスキーアートの作成と、そのアスキーアートを取得するための関数を書いています。

clock.rb


require './get-num.rb'
require "date"

def sliceNum(num)
    tens_place = (num/10) %10
    ones_place = (num/1) %10
    return tens_place,ones_place
end
print "\x1b[2J"

loop{
    nowTime = DateTime.now
    hour_tens_place,hour_ones_place = sliceNum(nowTime.hour)
    minute_tens_place,minute_ones_place = sliceNum(nowTime.minute)
    seconde_tens_place,second_ones_place = sliceNum(nowTime.second)
    hour_tens_place_str = getNum(hour_tens_place).split(/\R/)
    hour_ones_place_str = getNum(hour_ones_place).split(/\R/)
    minute_tens_place_str = getNum(minute_tens_place).split(/\R/)
    minute_ones_place_str = getNum(minute_ones_place).split(/\R/)
    seconde_tens_place_str = getNum(seconde_tens_place).split(/\R/)
    second_ones_place_str = getNum(second_ones_place).split(/\R/)
    print "\x1b[1;1H"
    i = 0
    loop{
        if i > 11 then
            break
        end

        if i==3||i==4||i==7||i==8 then
            str ="#{hour_tens_place_str[i]}#{hour_ones_place_str[i]}時時    #{minute_tens_place_str[i]}#{minute_ones_place_str[i]}分分    #{seconde_tens_place_str[i]}#{second_ones_place_str[i]}"
        else
            str ="#{hour_tens_place_str[i]}#{hour_ones_place_str[i]}        #{minute_tens_place_str[i]}#{minute_ones_place_str[i]}        #{seconde_tens_place_str[i]}#{second_ones_place_str[i]}"
        end
        puts str
        i+=1
    }
}

clock.rb では、時刻を取得し、アスキーアートの表示を行なっています。
1 つ目の loop では無限ループを使い、最新の時間を取得しています。そして、時間によって取得するアスキーアートの数字を変えています。2 つ目の loop では、取得したアスキーアートの数字を横並びで表示させるために文字列を操作して、表示させています。i=3,4,7,8 ではデジタル時計の":"の部分を表示させるために条件を書き分けています。

$ ruby clock.rb

By kiyo