How to spend the terminal

技術ブログでさえない

CODE FESTIVAL 2015 予選B

A問題とB問題はRuby、C問題はC++で解いています ※おそらく参考になりません

A問題

A問題は入力された文字を全て含むような小文字アルファベットのみからなるダブル文字列を出力する問題なのですが、どういうわけかこれでACになりました。(Ruby)

s = gets.split
printf("%s%s%s%s\n", s[0], s[1], s[0], s[1])

なぜこれを書いたのか自分でも理解に苦しみますが、とりあえずsには要素数1で0番目に改行を除いた文字列が入っていることになっていて、 printfのs[1]は無視されて偶然ACになったと思います。

B問題

B問題は数字が出てきた回数が出てきてそれが総数の半分を超えるならばその数字を出力し、そうでなければ'?'を出力する問題です。 どうすればいいのかわかっていたはずなのですが、indexメソッドをど忘れしていたので添字を出せず悩みました。

C問題

C問題は降順にソートして終わり!

D問題

わかりませんでした。

まとめ

順位は382位でした。 B問題で躓かなければもっと上だったと思います。

CODE FESTIVAL 2015 予選A

はじめに

みなさんはCODE FESTIVAL 2014をご存知でしょうか?
CODE FESTIVAL(以下CF)2014は、おそらく世界初のフェス型のプログラミングコンテストです。
プロコンガチ勢でも、プログラミングの経験が浅い人でも、参加者全員が楽しめるプロコンでした。
僕はCFには参加できませんでしたが、日帰りイベントのCODE THANKS FESTIVAL 2014に参加できました。
CODE THANKS FESTIVAL(以下CTF)の感想は叙々苑の焼肉弁当です。(CTFも交通費が支給されました)
今年もCODE FESTIVAL 2015が開催されます。

予選A

2015年9月26日21:00~23:00、CF2015の予選Aが開催されました。
結果は3問完答、514位でした。
使用言語はC++です。

A問題

「大文字アルファベット+"2014"」の文字列を「大文字アルファベット+"2015"」に書き換える問題です。
基本的にA問題はif文で分岐する、もしくはただ出力するだけといった簡単な問題が出題されるのですが、今回の問題は難しかったです。

B問題

数列に含まれる数の和を求める問題です。
数列の規則性を発見すれば解くことができると思います。

C問題

指定時間内に終わらせるために必要な時間短縮の回数を求める問題です。
はじめにバブルソートで実装してみたところ、プログラムが時間内に終わりませんでした。
次にクイックソートで実装してみたところ、配列の要素が重複するとバグが発生しました。
重複をどうにかするほどプログラミングが出来ないので時間がないので、stdlib.hのqsort関数を用いました。

D問題

D問題の例に漏れず難問です。
解けませんでした。

まとめ

昨年のCF2014予選Bでは2問完答+部分点だったので、昨年よりも成長したと思います。
今年の参加者はレベルの高い方が多いと思います。みんな叙々苑の焼肉弁当が好きなんですね
ガチな人が多くて驚きましたが、このプロコンの目的は楽しむことです。
予選でも楽しめたらいいと思っています。
10月25日に予選Bがありますので楽しみたい方は是非とも参加してください。
焼肉弁当食べたいからCTFの参加条件緩くしてくださいお願いします

MacBookAir11インチ購入

はじめに

先日(2週間前)いつも使っているPCが壊れた。
所謂生協PCで、アカデミックサポートを受けていたので代替機を貸してもらったが、
ボロボロなうえに、(スペックはそんなに悪くないのに)やたら固まる。
ここで、サブPCが欲しいと思った。

迷い

サブPCが欲しいと思ったが、どれにすればいいのか迷った。
選択肢としては格安ノート、Winタブ、そしてMacBookである。
必要な機能は、
  • Officeが使える
  • プログラミングをしやすい
  • 持ち運びやすい
  • Flash対応
である。 Flash対応というのは艦これがやりたいから
あとは何か機能(タッチパネルなど)が欲しい。
格安ノートには特に機能がないので選択肢から外れる。
WinタブかMacBookかをまわりに聞いてみると圧倒的にMacBookを推されたので、
MacBookProを検討したが、そんなに予算はない。
よってWinタブを検討した。
Winタブを検討しながら今日まで日が過ぎた…。

意識レベルMAX

今日、なぜか意識高いことを熟考していた。正直自分でも意味がわからない。
所謂意識高い人はMacBookを使っている傾向があるので、また迷いだす。
そしてふとツイートをしたところ…

MacBookユーザの夜の夢


ここからMacBookユーザによる勧誘がはじまったのだ!(半分嘘)
意識高いことを熟考していたのは、電波を受信していたからきっとMacBookと縁があるのだろうとMacBookについて熟考する。
まず僕がMacBookに求めていたことはオールインワンだったのだが、サブPCだと割り切れば、そんな必要はないと考えた。
サブPCとしてMacBookを検討した結果、MacBookAir11インチが物理的にも価格的にも最適だという結論を得た。
思い立ったが吉日と早速AppleストアでMacBookAirを購入。Corei7、メモリ8GB、US配列のカスタマイズをした。
ちょうどローンの利率が1%だったのも幸いだった。(0%だともっとよかったのだが)
ちなみにローンが通るかどうかは今日(2015/07/20)の段階では不明なので、通らなかったらつらい。

最後に

ローンが通れば1週間以内にMacデビューできるので、とても楽しみ。
MacC#も、なでしこも、使えないのはちょっと…と思っているが、UNIXなのでハッカーライフを楽しめそうだ。
(2015.07.27 追記)Mac届きました。

スタック領域

某プロコンで巨大な配列が必要(だと感じた)になった。

int array[100000][100000];

これでコンパイルするとコンパイルは出来るが、実行できない。
もしかしてWindowsがイカれてしまったのかと思い、これからは静的メモリ確保ではなく動的メモリ確保で生きていこうと思っていたが、調べてみるとスタック領域という領域があるようである。
スタック領域とはざっくり言えば関数のスタックや自動変数を格納しておく領域のことである。(多分)
スタック領域はとても小さく、調べてみたところ自分の環境では約2MBほどだと思われる(gcc4.8.1)。
これをどうにかするにはstaticもしくはグローバル変数として宣言することによって静的領域に格納させる、動的確保で配列を作ることが挙げられる。
ちなみにこの問題ではr行c列ということになっていたので、GCCでは

int r, c;
scanf("%d %d", &r, &c);
int array[r][c];

も可能である。

C#始めてみた

C#始めてみた。
一応CとC++JavaRubyの経験がある(C++はbetterC、JavaFizzBuzz程度だが)のですぐに出来るかなと思っていたがコンストラクタの継承あたりで躓いている。

class Cicken
{
    protected bool sex;
    public Cicken(bool Csex)
    {
        sex = Csex;
    }
    public void Voice()
    {
        System.Console.WriteLine("???");
    }
    public void Sex()
    {
        if (sex)
        {
            System.Console.WriteLine("female");
        }
        else
        {
            System.Console.WriteLine("male");
        }
    }
}

class Egg : Cicken
{
    public string state;
    public Egg(bool Csex)
    {
        state = "egg";
    }
    new public void Voice()
    {
        System.Console.WriteLine("korokoro");
    }
}

class Test
{
    static void Main()
    {
        Cicken cicken = new Cicken(true);
        Egg egg = new Egg(false);

        cicken.Voice();
        cicken.Sex();
        egg.Voice();
        egg.Sex();
    }
}

これをビルドしようとすると「'Cicken'に引数を 0 個指定できるコンストラクターがありません」というエラーが出る。
どうやら子クラスのコンストラクタ呼び出しの直前に親クラスの引数0個のコンストラクタを呼び出すかららしい。
そういう時は子クラスのコンストラクタ

Ko(int fuga) : base(fuga){ ... }
とすればいいらしい。

class Cicken
{
    protected bool sex;
    public Cicken(bool Csex)
    {
        sex = Csex;
    }
    public void Voice()
    {
        System.Console.WriteLine("???");
    }
    public void Sex()
    {
        if (sex)
        {
            System.Console.WriteLine("female");
        }
        else
        {
            System.Console.WriteLine("male");
        }
    }
}

class Egg : Cicken
{
    public string state;
    public Egg(bool Csex) : base(Csex)
    {
        state = "egg";
    }
    new public void Voice()
    {
        System.Console.WriteLine("korokoro");
    }
}

class Ocs
{
    static void Main()
    {
        Cicken cicken = new Cicken(true);
        Egg egg = new Egg(false);

        cicken.Voice();
        cicken.Sex();
        egg.Voice();
        egg.Sex();
    }
}

実行結果

???
female
korokoro
male

こうすると動いた。
Rubyだと親クラスにinitializeメソッドを書くだけで勝手に初期化してくれるのでC#は少し面倒だ。
まあいちいちコンストラクタを書いたりbase()と明記させることによって人に親クラス子クラスについて考えさせてくれるのかもしれない。

初心者向けプログラミング言語 BASIC

この記事はSLP KBIT Advent Calendar 2014 - Adventarの9日目の記事です。



はじめに

初心者向けプログラミング言語としてBASICを紹介します。
古すぎ?現代の初心者に教えるべきでない?いやいや初心者向けであることには変わらない。

BASICとは

BASICとは

Beginner's
All-purpose
Symbolic
Instruction
Code

の略で、初心者向け汎用記号命令コードという意味です。
オリジナルはコンパイラですが、多く出回っているのはインタプリタです。
今年で生まれてから50年です。
センター試験数学IIの選択問題で出てきます。(コンピュータと計算)
僕は数列が苦手だったのでやりました。(結果は聞かないで)
BASICについて詳しく知りたい方は
http://ja.wikipedia.org/wiki/BASIC
を見て下さい。

僕とBASICの出会い

僕とBASICが初めて出会ったのは2013年、ハードオフポケコン「PC-G850VS」を購入した時です。
触って少ししてパソコンでC言語を勉強し始めました。
なのでそこまでBASICに慣れていないです。
f:id:moxtsuan:20141105211455j:plain

プログラムを見てみよう

BASICプログラムを見たことのない人が多いような気がするのでプログラムを書いてみます。
ちなみに実行する時は

RUN

を入力します。

代入とか

10 LET A=10
20 LET B=12.3
30 LET S$="HELLO"
35 REM 出力
40 PRINT A
50 PRINT B
60 PRINT S$
70 END

結果

10
12.3
HELLO

LETは代入します。
変数には数値型と文字列型があります。
変数名の最後に$がついているのは文字列型です。
数値型には整数と実数が入ります。
REMはコメント(行末)です。
PRINTは出力です。

PRINT "hello world"

というように文字列を出力できますし

PRINT A/B

というように計算結果も出力できます。
ENDはプログラムの終わりを表しています。

入力して出力するプログラム

10 INPUT A
20 PRINT A
30 END

INPUTは入力です。

INPUT PROMPT "文字列":A

とすると文字列を出力してから入力を求める...らしいです。
PC-G850VSではエラーになります。

条件による分岐

条件による分岐を行いたいときはIF文を使います。

IF 条件式1 THEN 命令1
ELSE IF 条件式2 THEN 命令2
ELSE 命令3

まず条件式1を評価して真(その通り)であれば命令1を行います。
偽(そうでない)であれば条件式2を評価して真であれば命令2を行い、
偽であれば命令3を行います。

C言語と違うのは条件式でA==10の場合A=10と書き、
A!=10の場合A<>10と書きます。


繰り返し

繰り返しの命令がしたい時はこのようにします。

10 FOR I=0 TO 5
20 PRINT I
30 NEXT
40 END

結果

0
1
2
3
4
5

FORは繰り返すことができます。

FOR I=A TO B STEP C
NEXT

まずIにAを代入し、NEXTまで進むとCだけ足して(何も書かないと1だけ)
Bになるまで繰り返します。
処理系によってはWHILE~WENDもあります。
使い方は割愛します。

配列

配列は

10 DIM A(5)

というふうに宣言できます。
C言語風に書くと

int A[5]

です。
使い方は割愛します。

GOTO is God

GOTOは指定された行番号にジャンプします。
アセンブラ言語のJMPのようなものです。

10 PRINT "GOTO is God"
20 GOTO 10
30 END

このコードは永遠に"GOTO is God"を出力し続けます。


GOTO is God

ちなみにGOTO教はBASICなど一部の言語以外では迫害されるのでカミングアウトしないほうがいいです。

その他

その他いろんな命令があります。
C言語の関数のように扱えるGOSUB、出力する場所を変えるLOCATEなどがあります。

BASICを使うには

ここまで読んでBASICを使いたくなった物好きな方は以下のものをおすすめします。
・99 BASIC(Windows)
使いやすい(らしい)BASIC。
・(仮称)十進BASIC(WindowsLinuxMac OS)
センター試験に近い(らしい)BASIC。
・Chipmunk Basic(Mac OSWindowsLinux)
元々はMac OS用に開発されたフリーウェア。
オブジェクト指向プログラミングが可能。
プチコン(ニンテンドーDSiニンテンドー3DS)
ゲーム機で出来るBASIC。

VisualBasicとSmallBasicとActiceBasicはもはや別物だと思う...

おすすめサイト

BASICを学びたいなら以下のサイトがおすすめです。
・ドットインストール BASIC入門
http://dotinstall.com/lessons/basic_basic
なぜある!


最後に

工業高校ではBASIC、商業高校ではCOBOL(今年で55年)というように50年ものの古代言語はひっそりと生きてきました(LISP?いやいやそんな最新鋭を行く言語は)。
しかしBASICを学ぶ環境であるPC-G850VSは昨年度で生産完了しました。
もう若い人は学ばないのかもしれません(プチコンあるから学ぶ人もいると思うけど)。
僕はBASICという言語を知っているので布教しなければいけません。
こんな言語学ばないほうがいいと思うよ!
スパゲティコード書いちゃうようになっちゃうし。
というわけでBASICのお話でした。

3つの値の最大値を求めるプログラム10言語分

この記事はSLP KBIT Advent Calendar 2014 - Adventarの2日目の記事です。

はじめに

やあ (´・ω・`)
ようこそ、当ブログへ。
この記事は時間稼ぎだから、まず読んで落ち着いて欲しい。
うん、「処分市」なんだ。済まない。
仏の顔もって言うしね、謝って許してもらおうとも思っていない。
でも、このタイトルを見たとき、君は、きっと言葉では言い表せない
「ときめき」みたいなものを感じてくれたと思う。
殺伐とした世の中で、そういう気持ちを忘れないで欲しい、そう思って
この記事を作ったんだ。
じゃあ、注文を聞こうか

本題

入力された3つの値の最大値を求めるプログラムを10言語分書いてみた。
使用言語はC、C++JavaRubyPythonJavaScript、なでしこ、FORTRANBASICシェルスクリプトである。

C言語

#include <stdio.h>

int main(void)
{
  int num1,num2,num3;
  int max;
  
  scanf("%d",&num1);
  scanf("%d",&num2);
  scanf("%d",&num3);
  
  max = num1;
  if( max < num2 ) {
    max = num2;
  }
  if( max < num3 ) {
    max = num3;
  }
  
  printf("%d\n",max);
  
  return 0;
}

C++

#include <iostream>

using namespace std;

int main(void)
{
  int max;
  int num1,num2,num3;
  
  cin >> num1;
  cin >> num2;
  cin >> num3;
  
  max = num1;
  if( max < num2 ) {
    max = num2;
  }
  if( max < num3 ) {
    max = num3;
  }
  
  cout << max;
  
  return 0;
}

C++(C++11)

#include <iostream>
#include <algorithm>

using namespace std;

int main(void)
{
  int num1,num2,num3;
  
  cin >> num1;
  cin >> num2;
  cin >> num3;
  
  cout << max( {num1, num2, num3} );
  
  return 0;
}

Java

import java.util.Scanner;

public class Max {
  public static void main(String[] args) {
    int num1,num2,num3;
    int max;
    int i;
    
    Scanner input = new Scanner(System.in);
    
    num1 = input.nextInt();
    max = num1;
    num2 = input.nextInt();
    if( max < num2 ) {
      max = num2;
    }
    num3 = input.nextInt();
    if( max < num3 ) {
      max = num3;
    }
    
    System.out.printf("%d\n",max);
    
  }
  
}

Ruby

# coding: utf-8

num = [gets.to_i, gets.to_i, gets.to_i]
puts num.max 

Python

# -*- coding: utf-8 -*-

num = [input(), input(), input()]
max(num)

JavaScript

num1 = window.prompt("数1");
num2 = window.prompt("数2");
num3 = window.prompt("数3");
 
max = num1;
if( max < num2 ) {
  max = num2;
}
if( max < num3 ) {
  max = num3;
}

document.write("最大値は" + max );

なでしこ

最大とは整数。
数1とは整数。
数2とは整数。
数3とは整数。

「数1:」と尋ねる。
数1はそれ。
「数2:」と尋ねる。
数2はそれ。
「数3:」と尋ねる。
数3はそれ。

最大に数1を代入。
もし、最大 < 数2ならば
	最大に数2を代入。
もし、最大 < 数3ならば
	最大に数3を代入。

最大を表示。

BASIC

10 INPUT NUM1
20 INPUT NUM2
30 INPUT NUM3
40 MAX = NUM1
50 IF MAX < NUM2 THEN MAX = NUM2
60 IF MAX < NUM3 THEN MAX = NUM3
70 PRINT MAX
80 END

FORTRAN

program max
  integer mx
  integer num1,num2,num3
  
  read *,num1
  read *,num2
  read *,num3
  
  mx = num1
  if( mx < num2 ) then
    mx = num2
  endif
  if( mx < num3 ) then
    mx = num3
  endif
  
  print *,mx
end program max

シェルスクリプト

#!/bin/sh

max=${1}
if [ ${max} -lt ${2} ]
then
   max=${2}
fi
if [ ${max} -lt ${3} ]
then
   max=${3}
fi

echo ${max}

まとめ

RubyPythonはマジックコメントを除けば2行で書ける(好ましくない書き方だと思われるが)ので、とても柔軟な言語だと思った。
正直こんな簡単なプログラムだとあまり違いがわからないので他のプログラムでもやってみたい。

B1の方々へ

togetterでもNAVERでも動画でもいいと思うので参加してみては?


12/2 C++(C++11)追記