落書きノート

ふと自分が気になった事を書いてます

ProcessingでCG作成

Ubuntu 16.04 LTSでProcessingを使ってみました。そのままでは起動しなかったので色々対策してました。その対策を簡単にメモだけ。。。

Processingを公式サイトからダウンロードしておきます。

> sudo add-apt-repository -y ppa:webupd8team/java
> sudo apt update
> sudo apt install oracle-java8-installer
> tar zxvf Processing-3.3.4.tgz
> cd Processing-3.3.4
> mv java java-tmp
> ln -s /usr/lib/jvm/java-8-oracle /home/users/Processing-3.3.4/java
> ./install.sh
> ./processing

libjni.soが読み込めないと表示されたらLD_LIBRARY_PATHにそのファイルパスを追加します。bashとかzshとか好きなシェルで設定してください。

やっとジェネラティブアートを読み進めてます。今回はこんな感じです。

void setup() {
   size(1000, 700, P3D);
   background(150);
   stroke(0, 50);
   fill(255, 200);
   float xstart = random(10);
   float ynoise = random(10);
   translate(width / 2, height / 2, 0);
   for(float y = - (height / 8); y <= (height / 8); y += 3) {
      ynoise += 0.02;
      float xnoise = xstart;
      for(float x = - (width / 8); x <= (width / 8); x += 3) {
        xnoise += 0.02;
        drawPoint(x, y, noise(xnoise, ynoise));
      }
   }
}

void drawPoint(float x, float y, float noiseFactor) {
  pushMatrix();
  translate(x * noiseFactor * 4, y * noiseFactor * 4, -y);
  float edgeSize = noiseFactor * 26;
  ellipse(0, 0, edgeSize, edgeSize);
  popMatrix();
}

f:id:kh2n:20170619190708p:plain

[普及版]ジェネラティブ・アート―Processingによる実践ガイド

[普及版]ジェネラティブ・アート―Processingによる実践ガイド

Javaで問題を解く

*追記 : プログラムが少し間違ってましたので修正しました。ついでに改良しました。

問題1.3です。

世界で闘うプログラミング力を鍛える本 ~コーディング面接189問とその解法~

世界で闘うプログラミング力を鍛える本 ~コーディング面接189問とその解法~

import java.util.Scanner;

class q1_3 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        scan.useDelimiter("\\s*,\\s*|\n");
        String input = scan.next();
        int length = Integer.parseInt(scan.next());
        String[] split = input.split("");
        String[] a = new String[length * 2];
        int j = length * 2 - 1;
        for(int i = length; i >= 0; i--) {
            if(split[i].equals(" ")) {
                a[j--] = "0";
                a[j--] = "2";
                a[j--] = "%";
            } else
                a[j--] = split[i];
        }
        String answer = "";
        for(int i = j + 1; i < length * 2; i++)
            answer = answer + a[i];
        answer = answer + "\"";
        System.out.println(answer);
    }
}

C++で問題を解く AIZU ONLINE JUDGE

準備運動に解いたつもりが、悩ましい問題に直面して苦戦しました。もう少しレベルを落としたほうが良いかなぁ…。でもまだイントロダクションですが…。

// Print a Rectangle

#include <iostream>

using namespace std;

int main(void) {
  int H,W;
  while(cin >> H >> W && H && W) {
    for(int i = 0; i < H; i++) {
      for(int j = 0; j < W; j++) {
        cout << "#";
      }
      cout << endl;
    }
    cout << endl;
  }
  return 0;
}

// Print a Frame

#include <iostream>

using namespace std;

int main(void) {
  int H, W;
  while(cin >> H >> W && H && W) {
    for(int i = 0; i < H; i++) {
      for(int j = 0; j < W && (i == 0 || i == H - 1); j++) {
        cout << "#";
      }
      for(int k = 0; k < 1 && (i && i != H - 1); k++) {
        cout << "#";
      }
      for(int l = 0; l < W - 2 && (i && i != H - 1); l++) {
        cout << ".";
      }
      for(int m = 0; m < 1 && (i && i != H - 1); m++) {
        cout << "#";
      }
      cout << endl;
    }
    cout << endl;
  }
  return 0;
}

Haskellで不定期練習

OCamlの方が便利かも。今回、繰り返しをやったんですけど、Haskellはちょっとこの辺り不便でした。

import Text.Printf
import Data.List
import Data.Array

main :: IO ()

main = do
  putStrLn "変数a"
  v1 <- getLine
  putStrLn "変数b"
  v2 <- getLine
  putStrLn "変数c"
  v3 <- getLine
  let tl = [read v1 :: Int, read v2 :: Int, read v3 :: Int]
  let ab = listArray (0, 2) $ sort tl
  printf "変数aは%dです。\n" $ ab ! 0
  printf "変数bは%dです。\n" $ ab ! 1
  printf "変数cは%dです。\n" $ ab ! 2



import System.Random

main :: IO ()

f n
  | n == 0 = "グー"
  | n == 1 = "チョキ"
  | n == 2 = "パー"
  
main = do
  a <- (getStdRandom $ randomR (0, 2) :: IO Int)
  putStr $ "コンピュータが生成した手 : "
  putStrLn $ f a



main :: IO ()

f n
  | n >= 3 && n <= 5 = "春"
  | n >= 6 && n <= 8 = "夏"
  | n >= 9 && n <= 11 = "秋"
  | n == 1 || n == 2 || n == 12 = "冬"
  | otherwise = "そんな月はありません。"
                
main = do
  putStrLn "何月ですか"
  v1 <- getLine
  let month = read v1 :: Int
  putStrLn $ f month



import Data.IORef

f :: IORef Bool -> IO ()
main :: IO ()

f flag = do
  t <- readIORef flag
  if t == True then
    return ()
  else do
  putStrLn "整数値"
  v1 <- getLine
  let t = read v1 :: Int
  if t > 0 then
    putStrLn "その値は正です。"
    else if t < 0 then
    putStrLn "その値は負です。"
    else
    putStrLn "その値は0です。"
  putStrLn "もう一度? 1...Yes/0...No"
  v2 <- getLine
  let choose = read v2 :: Int
  if choose == 1 then
    writeIORef flag False
    else
    writeIORef flag True
  f flag
    
main = do
  s <- newIORef False
  f s

Javaで問題を解く

問題1.2です。なかなか考えました。

世界で闘うプログラミング力を鍛える本 ~コーディング面接189問とその解法~

世界で闘うプログラミング力を鍛える本 ~コーディング面接189問とその解法~

import java.util.Scanner;
import java.util.Hashtable;
import java.util.Enumeration;

class q1_2 {
    public static void main(String[] args) {
        Hashtable<String, Integer> numbers =
            new Hashtable<String, Integer>();
        Scanner scan = new Scanner(System.in);
        boolean flag = true;
        String input = scan.nextLine();
        String input2 = scan.nextLine();
        String[] split = input.split("");
        String[] split2 = input2.split("");
        for(String s : split) {
            if(numbers.containsKey(s))
                numbers.put(s, numbers.get(s) + 1);
            else
                numbers.put(s, 1);
        }
        for(int i = 0; i < split2.length; i++) {
            if(numbers.containsKey(split2[i])
               && numbers.get(split2[i]) > 0) {
                numbers.put(split2[i], numbers.get(split2[i]) - 1);
                continue;
            } else {
                flag = false;
                break;
            }
        }
        Enumeration<Integer> e = numbers.elements();
        while(e.hasMoreElements())
            if(e.nextElement() > 0)
                flag = false;
        if(flag)
            System.out.println("この二つの文字列は並び替えになっています。");
        else
            System.out.println("この二つの文字列は並び替えになっていません。");
    }
}

SDLでゲームプログラミング

ゲームプログラミングで試したいことが出来たので、とりあえず雛形を作りました。いつものように単発で作っていくだけです。次回以降の記事からメニュー選択画面を作ってみたいと思います。思いつきなのでとりあえずmacOSで試しました。

#include <SDL2/SDL.h>
#include <stdio.h>

const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
bool init();
bool loadMedia();
void close();
SDL_Window *gWindow = NULL;
SDL_Surface *gScreenSurface = NULL;
SDL_Surface *gHelloWorld = NULL;
SDL_Event event;
bool done = false;

bool init()
{
  bool success = true;
  if(SDL_Init(SDL_INIT_VIDEO) < 0) {
    printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
    success = false;
  } else {
    gWindow = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
    if(gWindow == NULL) {
      printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
      success = false;
    } else {
      gScreenSurface = SDL_GetWindowSurface(gWindow);
    }
  }

  return success;
}

bool loadMedia()
{
  bool success = true;
  gHelloWorld = SDL_LoadBMP("./hello_world.bmp");
  if( gHelloWorld == NULL )
    {
      printf( "Unable to load image %s! SDL Error: %s\n", "02_getting_an_image_on_the_screen/hello_world.bmp", SDL_GetError() );
      success = false;
    }
  
  return success;
}

void close()
{
  SDL_FreeSurface(gHelloWorld);
  gHelloWorld = NULL;
  SDL_DestroyWindow(gWindow);
  gWindow = NULL;
  SDL_Quit();
}

int main( int argc, char* args[] )
{
  if(!init()) {
    printf( "Failed to initialize!\n" );
  } else {
    if(!loadMedia()) {
      printf( "Failed to load media!\n" );
    }
    else {
      while(!done) {
        while(SDL_PollEvent(&event)) {
          switch(event.type) {
          case SDL_KEYDOWN:
            if(event.key.keysym.sym == SDLK_ESCAPE) {
              done = true;
            }
            break;
          case SDL_QUIT:
            done = true;
            break;
          }
          SDL_BlitSurface(gHelloWorld, NULL, gScreenSurface, NULL);
          SDL_UpdateWindowSurface(gWindow);
        }
      }
    }
  }
  
  close();
  
  return 0;
}
> brew install sdl2
> g++ menu.cpp -o menu -I/usr/local/include -L/usr/local/lib -lSDL2

f:id:kh2n:20170616155215p:plain

Javaで問題を解く

1.1の問題の続きです。1.2はまた後でやります。まずはHashtableだけを。これを使うと考えるのがかなり楽になってすっきりしました。

世界で闘うプログラミング力を鍛える本 ~コーディング面接189問とその解法~

世界で闘うプログラミング力を鍛える本 ~コーディング面接189問とその解法~

import java.util.Scanner;
import java.util.Hashtable;

class q1_1_first {
    public static void main(String[] args) {
        Hashtable<String, Integer> numbers =
            new Hashtable<String, Integer>();
        Scanner scan = new Scanner(System.in);
        String input = scan.nextLine();
        String[] str = input.split("");
        boolean flag = true;
        for(String s : str) {
            numbers.put(s, 0);
        }
        for(int i = 0; i < str.length; i++) {
            if(numbers.get(str[i]) == 1) {
                System.out.println("固有の文字列ではありません。");
                flag = false;
                break;
            }
            if(numbers.containsKey(str[i]))
                numbers.put(str[i], 1);
        }
        if(flag)
            System.out.println("固有の文字列です。");
    }
}

もう少し寝てから活動を再開かな。