syat
printf書式変換
(Nested
Flatten)
COBOL --> Java の移植と言っても、COBOLのプログラムをそのままJavaに翻訳するような無謀なことはしないと思いますよ。
移植するのはデータのみで、COBOLデータを Oracle などの DB に変換したら、あとはSQLでごりごりっとやるJavaプログラムを新たに設計する感じ。
データの移植も各社が出してるパッケージソフトを使ったり、Cで作ったりします。
すみません雑談でした。
移植するのはデータのみで、COBOLデータを Oracle などの DB に変換したら、あとはSQLでごりごりっとやるJavaプログラムを新たに設計する感じ。
データの移植も各社が出してるパッケージソフトを使ったり、Cで作ったりします。
すみません雑談でした。
手作業Grep
(Nested
Flatten)
C#で。標準入力とUIを別スレッドにしているので、追加入力可能です。
コマンドラインとUIの組み合わせって意外と新鮮だと思いました。
コマンドラインとUIの組み合わせって意外と新鮮だと思いました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | using System;
using System.Windows.Forms;
using System.Threading;
namespace HandGrep {
// 行選択ダイアログクラス
class Dialog : Form {
ListBox list;
public ListBox List {
get { return list; }
private set { list = value; }
}
public Dialog() {
this.Width = 300; this.Height = 200;
this.Text = "選択して×ボタンを押してください。";
this.List = new ListBox();
this.List.Dock = DockStyle.Fill;
this.List.SelectionMode = SelectionMode.MultiExtended;
this.Controls.Add(this.List);
}
public void AddLine(string line) {
this.List.Items.Add(line);
}
}
// メインクラス
class Program {
static object objLock; // 排他オブジェクト
static AutoResetEvent evDialogLoad; // ダイアログ初期化イベント
static AutoResetEvent evDialogClose; // ダイアログ終了イベント
static Dialog dlg; // ダイアログ
delegate void MyDelegate();
static void Main(string[] args) {
objLock = new object();
evDialogLoad = new AutoResetEvent(false);
evDialogClose = new AutoResetEvent(false);
// ダイアログ作成
dlg = new Dialog();
dlg.Load += new EventHandler( // ダイアログ初期化イベントハンドラ登録
delegate(object o, EventArgs e) {
evDialogLoad.Set();
});
// ダイアログを別スレッドで表示
new MyDelegate(
delegate() {
dlg.ShowDialog();
}
).BeginInvoke(new AsyncCallback(OnDialogClose), null);
evDialogLoad.WaitOne(); // ダイアログの初期化待ち
// 標準入力ループ
string line;
while ((line = Console.ReadLine()) != null) {
// 標準入力から1行読み込み、ダイアログに追加
dlg.Invoke(new MyDelegate(
delegate() {
lock (objLock) {
if (dlg == null) return;
dlg.AddLine(line);
}
}
));
}
evDialogClose.WaitOne(); // ダイアログの終了待ち
}
// ダイアログクローズ後のコールバック
static void OnDialogClose(IAsyncResult result) {
lock (objLock) {
// 選択行を標準出力に書き込む
foreach (string line in dlg.List.SelectedItems) {
Console.WriteLine(line);
}
dlg = null;
}
evDialogClose.Set();
}
}
}
|
ストレンジアトラクタの描画
(Nested
Flatten)
Processing で Rössler attractor を書きました。
アピールポイントは、キー入力で拡大・回転ができるところと、アルファ値が使えるのできれいな絵が描けるところ。
緑の線は赤や青とふるまいが違うのがわかるでしょうか?
アピールポイントは、キー入力で拡大・回転ができるところと、アルファ値が使えるのできれいな絵が描けるところ。
緑の線は赤や青とふるまいが違うのがわかるでしょうか?
see: Wikipedia:Rössler attractor(en)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | RosslerLine[] lines;
float zoom, rotX, rotY;
void setup() {
lines = new RosslerLine[3];
lines[0] = new RosslerLine(0.2, 0.1, 5.7, 1, 1, 1, 0x33FF0000);
lines[1] = new RosslerLine(0.2, 0.2, 5.7, 1, 1, 1, 0x3300FF00);
lines[2] = new RosslerLine(0.2, 0.3, 5.7, 1, 1, 1, 0x330000FF);
size(500, 500, P3D);
zoom = 7.8;
rotX = 1.0;
rotY = -0.8;
clearScreen();
}
void preDraw() {
pushMatrix();
translate(width / 2, height / 2);
rotateX(rotX);
rotateY(rotY);
scale(zoom);
}
void postDraw() {
popMatrix();
}
void clearScreen() {
preDraw();
background(0);
stroke(64); line(0, 0, 0, 30, 0, 0); // draw x-axis
stroke(128); line(0, 0, 0, 0, 30, 0); // draw y-axis
stroke(192); line(0, 0, 0, 0, 0, 30); // draw z-axis
postDraw();
}
void draw() {
preDraw();
for (int i = 0; i<lines.length; i++) {
lines[i].update();
}
postDraw();
}
void keyPressed() {
switch (key) {
case '+': zoom += 0.2; break; // zoom in
case '-': zoom -= 0.2; break; // zoom out
case ' ': break; // clear screen
case '4': rotY -= PI / 12; break; // rotate left or right
case '6': rotY += PI / 12; break; // rotate right or left
case '8': rotX -= PI / 12; break; // rotate up or down
case '2': rotX += PI / 12; break; // rotate down or up
default : println("key[" + keyCode + ", " + key + "]"); return;
}
clearScreen();
println("zoom:" + zoom + " rot:(" + rotX + ", " + rotY + ")");
}
class RosslerLine {
float a = 0.2, b = 0.2, c = 5.7;
float x = 1.0, y = 1.0, z = 1.0;
float dt = 0.0015;
int stepPerFrame = 35;
int col;
RosslerLine(float a, float b, float c, float x, float y, float z, int col) {
this.x = x; this.y = y; this.z = z;
this.a = a; this.b = b; this.c = c;
this.col = col;
}
void update() {
stroke(col);
float x0 = x, y0 = y, z0 = z;
for (int i = 0; i < stepPerFrame; i++) {
float dx = ( - y - z ) * dt;
float dy = ( x + a * y ) * dt;
float dz = ( b + z * (x - c) ) * dt;
x += dx; y += dy; z += dz;
}
line(x0, y0, z0, x, y, z);
}
}
|
16進数から10進数の変換
(Nested
Flatten)
書き忘れましたが、扱える整数の幅は符号なし64bitなので、 0 ~ 18446744073709551615 です。
C99にはlong long型があるから簡単じゃん、と思ったら処理系の違いで苦労した。
strtoull で変換し、printf の %ull で出力するのが標準かと。
VC2008EE と gcc(MinGW) で確認しました。
strtoull で変換し、printf の %ull で出力するのが標準かと。
VC2008EE と gcc(MinGW) で確認しました。
see: HeadWing | 64bit Integer in MinGWC
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include <stdio.h>
#include <stdlib.h>
#ifdef _MSC_VER
#define strtoull _strtoui64
#endif
#ifdef __MINGW32__
#define FORMAT_LLU "%I64u"
#else
#define FORMAT_LLU "%llu"
#endif
int main(void) {
char buf[128];
memset(buf, 0x00, sizeof(buf));
if ( fgets(buf, sizeof(buf), stdin) ) {
unsigned long long ll;
ll = strtoull(buf, NULL, 16);
printf(FORMAT_LLU, ll);
}
return 0;
}
|
ケブンッリジ関数
(Nested
Flatten)
qsortにランダム関数をつっこんで大丈夫なのだろうか(無限ループになったりしないかな?)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include <stdio.h>
#include <stdlib.h>
#define IS_SPACE(c) ( (c) == ' ' || (c) == '\n' )
#define MBCLEN 2
/* ランダム比較関数 */
int compare_random(const void *a, const void *b) {
return rand() - RAND_MAX / 2;
}
/* ケブンリッジ関数 */
void ciambrgde(char *buf) {
char *p = buf;
while (*p) {
char *word_head;
/* 空白を読み飛ばす */
while (IS_SPACE(*p)) { p++; }
if (! *p) { break; }
/* 単語の末尾を探す */
word_head = p;
while (*p && ! IS_SPACE(*p)) { p += MBCLEN; }
/* 4文字以上の単語なら入れ替えを行う */
if ( (p - word_head) >= MBCLEN * 4 ) {
qsort(word_head + MBCLEN, (p - word_head)/MBCLEN - 2, MBCLEN, compare_random);
}
}
return;
}
int main() {
char buf[] = "こんにちは みなさん おげんき ですか? わたしは げんき です。\n\
この ぶんしょう は いぎりす の ケンブリッジ だいがく の けんきゅう の けっか\n\
にんげん は もじ を にんしき する とき その さしいょ と さいご の もじさえ あっていれば\n\
じゅんばん は めちゃくちゃ でも ちゃんと よめる という けんきゅう に もとづいて\n\
わざと もじの じゅんばん を いれかえて あります。\n\
どうです? ちゃんと よめちゃう でしょ?\n\
ちゃんと よめたら はんのう よろしく";
ciambrgde(buf);
printf(buf);
return 0;
}
|
急勾配の判定
(Nested
Flatten)
リストを前から見ていくこともできます。
後ろから見るほうがシンプルだけど、リストの長さが未確定の場合はこちらが有利。
ちなみに [1,0].isHeavySlope() は true になりますが何か?
後ろから見るほうがシンプルだけど、リストの長さが未確定の場合はこちらが有利。
ちなみに [1,0].isHeavySlope() は true になりますが何か?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Array.prototype.isHeavySlope = function() {
if (this.length == 0) return true;
var pre, sub;
for each (var n in this) {
if (pre == undefined) {
sub = pre = n;
} else {
sub -= n;
if (pre <= n || sub <= 0) return false;
pre = n;
}
}
return true;
}
|
sumの初期値を -∞ にしたらだめじゃん。勘違いです。忘れてください。
てことは [0] は急勾配じゃないということでFA?
てことは [0] は急勾配じゃないということでFA?
効率は悪くないと思うけど、工夫はしてません。
仕様面ではっきりしないのは、
1.空リストは急勾配? not 急勾配?
2.問題文の「空列の和は0とします」をどう読むか。
[0] は 0 + 空列 なので、not 急勾配になる?
(sum の初期値を 0 とするか -∞ にするかというだけの話だけど)
仕様面ではっきりしないのは、
1.空リストは急勾配? not 急勾配?
2.問題文の「空列の和は0とします」をどう読むか。
[0] は 0 + 空列 なので、not 急勾配になる?
(sum の初期値を 0 とするか -∞ にするかというだけの話だけど)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | Array.prototype.isHeavySlope = function() {
var sum = 0;
for (var i = this.length-1; i >= 0; i--) {
if (this[i] <= sum) return false;
sum += this[i];
}
return true;
}
>>> [].isHeavySlope()
true
>>> [0].isHeavySlope()
false
>>> [1,0].isHeavySlope()
false
>>> [0,1].isHeavySlope()
false
>>> [4,2,1].isHeavySlope()
true
>>> [3,2,1].isHeavySlope()
false
|
LL Golf Hole 6 - 10進数を2進数に基数変換する
(Nested
Flatten)
アドレス0に格納されている10進数を2進に変換して表示します。
1 2 3 4 | >>>+<<< # init
[->>>[-]+>[->[-]+>]+<[<<]<] # convert into binary
>>>[>>]<< # move to the end
[>>+++[->++++[-<<++++>>]<]<.[-]<-<<] # output
|
ローテートシフト
(Nested
Flatten)
Cで。
64bit整数に2個つめてからシフトしています。
マイナスシフト(左シフト)、32を超えるシフトにも対応。
64bit整数に2個つめてからシフトしています。
マイナスシフト(左シフト)、32を超えるシフトにも対応。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #include <stdio.h>
#include <stdlib.h>
#ifdef _MSC_VER
typedef _int32 int32_t;
typedef _int64 int64_t;
#elif __GNUC__
#include <stdint.h>
#endif
/* rotate : numをshift回だけ右にローテートシフトする */
int32_t rotate(int32_t num, int shift)
{
int64_t numnum;
/* シフト数の正規化(32以下の正数にする) */
while (shift < 0) shift+= 32;
shift %= 32;
/* シフト */
numnum = num;
numnum = (numnum<<32) | num;
return (numnum>>shift) & (int32_t)-1;
}
int main(int argc, char *argv[])
{
char buf[32+1];
int32_t num = 0;
int32_t num2 = 0;
int shift = 1;
if (argc < 2) {
printf("Usage: %s <bits> <shift>\n", argv[0]);
return EXIT_FAILURE;
} else if (argc == 2) {
num = strtol(argv[1], NULL, 2);
} else if (argc > 2) {
num = strtol(argv[1], NULL, 2);
shift = strtol(argv[2], NULL, 10);
}
num2 = rotate(num, shift);
printf("%032s\n", itoa(num2, buf, 2));
return EXIT_SUCCESS;
}
|
自分自身を表示する
(Nested
Flatten)
BASICが動くマシンがないので確認できませんが、DELETE命令、そういえばそんなのありましたね
行番号は0から始まって良いんでしたっけ?私はN88BASIC使いでしたが、0で始めたことは無かったです(大抵100から)
いま手元にあるUBASICだとDELETEも行番号0もダメみたいです。機種やバージョンによって言語仕様がバラバラなのもBASICの特徴。
行番号は0から始まって良いんでしたっけ?私はN88BASIC使いでしたが、0で始めたことは無かったです(大抵100から)
いま手元にあるUBASICだとDELETEも行番号0もダメみたいです。機種やバージョンによって言語仕様がバラバラなのもBASICの特徴。
17歳教
(Nested
Flatten)
C#で。
#8519とほとんど同じロジックです
#8519とほとんど同じロジックです
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | using System;
class Seventeen {
public static void Main(String[] args) {
DateTime dt;
DateTime now = DateTime.Now;
DateTime nextMonth = now.AddMonths(1);
try {
dt = DateTime.Parse(args[0]);
} catch {
Console.WriteLine("時刻を指定してください");
return;
}
Console.WriteLine("今日は{0}", now);
Console.WriteLine("誕生日は{0}", dt);
Console.WriteLine("17才と{0}日", (int)(now - dt).TotalDays);
dt = dt.AddYears(17);
int month = (now.Year - dt.Year) * 12 + (now.Month - dt.Month);
int day = now.Day - dt.Day;
if (day < 0) {
month--;
day += DateTime.DaysInMonth(nextMonth.Year, nextMonth.Month);
}
Console.WriteLine("17才と{0}ヶ月と{1}日", month, day);
}
}
|
文字列を指定されたバイト数で分割
(Nested
Flatten)
Cで。
文字サイズの取得はmbstring.hを使用。
時間の測定にはclock関数を使用(つ 参考ページ)
Cなので比較的速いとは思います。
香川県(69KB)で15ms以下。北海道(842KB)で100ms付近。(マシンはP4 3GHz)
文字サイズの取得はmbstring.hを使用。
時間の測定にはclock関数を使用(つ 参考ページ)
Cなので比較的速いとは思います。
香川県(69KB)で15ms以下。北海道(842KB)で100ms付近。(マシンはP4 3GHz)
see: C言語: 実行時間測定の方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mbstring.h>
#include <time.h>
/* splitBytes : 文字列から指定した長さを切り出す
* 引数 data : 文字列データ
* data_len : 文字列データの長さ
* divide_len : 切り出す長さ
* out : 切り出した文字列を格納する領域
* 戻り値 : 切り出した長さ
*/
int splitBytes(char *data, int data_len, int divide_len, char out[])
{
char *p = data;
char *q = out;
while (p < data + data_len) {
int clen = _mbclen(p);
if (q - out + clen > divide_len)
break;
_mbccpy(q, p);
p += clen;
q += clen;
}
*q = '\0';
return q - out;
}
int readFile(char *filename, char *buf, int buf_len)
{
FILE *fp;
int read_len;
fp = fopen(filename, "r");
read_len = fread(buf, 1, buf_len, fp);
fclose(fp);
return read_len;
}
#define DIVIDE_LEN 2000
int main()
{
char test[850 * 1024];
char buf[DIVIDE_LEN+1];
int data_len;
char *s;
clock_t start_tm, end_tm;
// data_len = readFile("01HOKKAI.CSV", test, sizeof(test));
data_len = readFile("37KAGAWA.CSV", test, sizeof(test));
start_tm = clock();
for (s = test; 0 < data_len; ) {
int cut_len = splitBytes(s, data_len, DIVIDE_LEN, buf);
// printf("buf=[%s] cut_len=[%d]\n", buf, cut_len);
s += cut_len;
data_len -= cut_len;
};
end_tm = clock();
printf("実行時間 %f ms\n", (double)(end_tm - start_tm)/CLOCKS_PER_SEC*1000);
return 0;
}
|
IPv6アドレスの短縮
(Nested
Flatten)
next >>
0が3個以上続くときも::に置き換えてほしいです。0:0:0:0:0:0:0:1 → ::1 みたいな。(問題文のサンプルが見づらくてすみません・・)



syat
#9218()
[
Batchfile
]
Rating0/0=0.00
バッチファイルでレジストリの値を取得するコードを書きました。reg.exe呼んでるだけですが。
see: Preferences API 入門
===== getreg.bat ===== @echo off rem reg.exeの結果を1行ごと%rに格納する for /F "usebackq delims=" %%r in (`reg.exe QUERY %1 /v %2`) do ( rem %rをタブ区切りデータとみなし、3列目を%tに格納する for /F "tokens=3 delims= " %%t in ("%%r%") do ( rem %tが空でなければ、レジストリ値だとみなす if not "%%t%" == "" ( echo %%t% goto e ) ) ) :e ===== 使用例 caller.bat ===== @echo off for /F "usebackq delims=" %%v in (`call getreg "HKEY_CURRENT_USER\Control Panel\Desktop" Wallpaper`) do set WALLPAPER=%%v% echo 壁紙=[%WALLPAPER%] for /F "usebackq delims=" %%v in (`call getreg "HKEY_CURRENT_USER\Control Panel\Colors" ActiveTitle`) do set ACTIVETITLE=%%v% echo タイトルバーの色=[%ACTIVETITLE%]Rating0/0=0.00-0+