syat

next >>

初期設定の読み書き (Nested Flatten)
参考ページを見ると、設定ファイルがなくても設定を読み書きできる方法のことを言っている?
バッチファイルでレジストリの値を取得するコードを書きました。reg.exe呼んでるだけですが。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
===== 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%]

設定ファイルを読み込むお題であれば過去に出ていますが、それとは違くて?

printf書式変換 (Nested Flatten)
COBOL --> Java の移植と言っても、COBOLのプログラムをそのままJavaに翻訳するような無謀なことはしないと思いますよ。
移植するのはデータのみで、COBOLデータを Oracle などの DB に変換したら、あとはSQLでごりごりっとやるJavaプログラムを新たに設計する感じ。
データの移植も各社が出してるパッケージソフトを使ったり、Cで作ったりします。
すみません雑談でした。
手作業Grep (Nested Flatten)
C#で。標準入力と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 を書きました。
アピールポイントは、キー入力で拡大・回転ができるところと、アルファ値が使えるのできれいな絵が描けるところ。
緑の線は赤や青とふるまいが違うのがわかるでしょうか?
 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) で確認しました。
 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
 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?
効率は悪くないと思うけど、工夫はしてません。

仕様面ではっきりしないのは、
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)

アドレス0から連続して文字が格納されている場合。

1
[>]<[.<]>
キッチンタイマー (Nested Flatten)
1
start http://e.ggtimer.com/%1%%20seconds
ローテートシフト (Nested Flatten)
Cで。
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の特徴。
17歳教 (Nested Flatten)
C#で。
#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)
 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;
}
自分自身を表示する (Nested Flatten)
BASICで。
2番目の条件に該当していないと思いたい。
UBASICで確認。
1
   10   list
IPv6アドレスの短縮 (Nested Flatten)
0が3個以上続くときも::に置き換えてほしいです。0:0:0:0:0:0:0:1 → ::1 みたいな。(問題文のサンプルが見づらくてすみません・・)
next >>

Index

Feed

Other

Link

Pathtraq

loading...