詰まってた問題が解決したのでメモ.
最近,J1のときにやった問題を解き直してるんだけど,こういう問題にあたった.
以下に示す顔を表示するプログラムを作成せよ.ただし,配列は14×14とし,配列の値が1のとき■を出力し,0のとき□を出力することで絵を作成せよ.
□□□□■■■■■■□□□□
□□□■□□□□□□■□□□
□□■□□□□□□□□■□□
□■□□□□□□□□□□■□
□■□■■■□□■■■□■□
■□□□□□□□□□□□□■
■□□□■□□□□■□□□■
■□□□□□□□□□□□□■
■□□■■■■■■■■□□■
□■□□■□□□□■□□■□
□■■□□■■■■□□□■□
□□■□□□□□□□□■□□
□□□■□□□□□□■□□□
□□□□■■■■■■□□□□
要するに配列で0,1を保存してそれを使って顔を描けって感じ.
これを0,1で配列に入れるのに,□■で書かれた顔を0,1に変換するプログラムをささっと書こうと思った.
作ろうとしたプログラム
入力
□□□□■■■■■■□□□□
□□□■□□□□□□■□□□
□□■□□□□□□□□■□□
□■□□□□□□□□□□■□
□■□■■■□□■■■□■□
■□□□□□□□□□□□□■
■□□□■□□□□■□□□■
■□□□□□□□□□□□□■
■□□■■■■■■■■□□■
□■□□■□□□□■□□■□
□■■□□■■■■□□□■□
□□■□□□□□□□□■□□
□□□■□□□□□□■□□□
□□□□■■■■■■□□□□
出力
0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,…..
最初にgetchar()で一文字ずつ取得して処理しようとした.でも■□はUnicodeで多バイト文字だから動かなかった.
次に,getwchar()を使おうとした.でもワイド文字じゃダメだった.
その次は,文字列で処理しようとしたけど,strcmp()とかstrcpy()がなんかおかしい.
結果,こんなんになった.
#include <stdio.h>
#include <string.h>
int main(){
char c[8];
char pattern[8]="%3s";
pattern[1]=strlen("■")+0x30;
while(scanf(pattern,c)!=EOF){
if(!strcmp(c,"■")){
printf("1");
}else if(!strcmp(c,"□")){
printf("0");
}else{
continue;
}
printf(",");
}
return 0;
}
□が何バイトになるかわからないから,strlen()でバイト数をとってからscanf()で一文字分取得する感じ.もっと簡単な方法はなかったのか……
まあ,これでうごいたしこれでいいかな,って.
おまけ
実はCで詰まったときにJavaでもつくった.
import java.util.Scanner;
public class Test{
public static void main(String[] args){
Scanner stdIn = new Scanner(System.in);
char c;
String str;
while(stdIn.hasNext()){
str=stdIn.next();
for(int i=0;i<str.length();i++){
c=str.charAt(i);
if(c=='□'){
System.out.print("0");
}else if(c=='■'){
System.out.print("1");
}else{
continue;
}
System.out.print(",");
}
}
}
}
ロジックが同じだし,同じ動作をする.
でも,Javaでしか作れないっていうのは悔しかったからCでもつくった.
愚痴
CでもJavaでもなんでも,文字コードを意識しなきゃいけないのとってもめんどい.
めんどいからUnicode以外は世界から消えて欲しい…
あとなんでjava.util.ScannerにnextChar()みたいなのないの