詰まってた問題が解決したのでメモ.
最近,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()みたいなのないの