Language detail: なでしこ

Coverage: 46.10%
number of '+' ratings
contribution for coverage

Unsolved challenges

codes

Feed

Used modules

next >>

π (Nested Flatten)

1万回ループの無限級数(1-1/3+1/5-1/7…)で三桁の精度です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 組み込みPI
PIを表示

# 無限級数
a=1
nで1から10000まで繰り返す
    a=a+(-1^n)*(1/(2*n+1))
a*4を表示

# モンテカルロ法
t=10000
m=10000
a=0
nで0からtまで繰り返す
    もし(HYPOT(mの乱数/m,mの乱数/m))<1ならば
        a=a+1
a*4/tを表示
タブ区切りデータの処理 (Nested Flatten)

なでしこで、手順に忠実に書いてみました。

 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
input="ID    Surname    Forename    Age
1    Sato    Hanako    17
0    Suzuki    Taro    18"

data=inputをTSV取得
# ヘッダを切り取る
head=dataの0を配列切り取る

# 第1カラムでソート
dataの0を表数値ソート
# 第2カラムと第3カラムを入れ替え
data=dataの1と2を表列入替
# ヘッダも入れ替え
head=headの1と2を配列入替
# 第4カラムに1を加算
Iで0から(dataの配列要素数-1)まで繰り返す
    data[I][3]=data[I][3]+1
# ヘッダとデータを結合
output=(headの表行列交換)にdataを表追加
# 結果を表示
outputを表TSV変換して表示

●配列入替(AのXとYを)
    AのXにA[Y]を配列挿入
    AのY+1を配列削除
    Aで戻る

●表列入替(AのXとYを)
    AのYを表列取得
    AのXにそれを表列挿入
    それのY+1を表列削除
    それで戻る

●表追加(AにBを)
    Aの(Aの配列要素数)にBを配列一括挿入
    Aで戻る
2^i * 3^j * 5^k なる整数 (Nested Flatten)

#7639を参考に移植。for文がないのがきつい・・・

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
limit=100
n=0
i=1
(n<limit)の間
    tmp=i
    (tmp%2=0)の間,tmp=tmp/2
    (tmp%3=0)の間,tmp=tmp/3
    (tmp%5=0)の間,tmp=tmp/5
    もし(tmp=1)ならば
        iを表示
        n=n+1
    i=i+1
文字列型日時ののN秒後時間取得 (Nested Flatten)

なでしこで。下の二つの関数はほかから流用です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
DateEx("2008/08/27 23:59:25",40)を表示
DateEx("2008/08/27",40)を表示

●DateEx(str,n)
    dateとは配列=区切(str," ")
    もし(date[1]="")ならば、date[1]=今
    配列結合(UNIX2date(date2UNIX(date,0)+n)," ")
●date2UNIX(date,tzd)
    戻(日数差("1970/1/1",date[0])*(60*60*24)+秒差("0:0:0",date[1])+tzd)
●UNIX2date(unix)
    tmpとは配列
    dayとは整数=unix/86400%86400
    unix=unix-day*86400
    tmp[0]=日付加算("1970/1/1","//{day}")
    tmp[1]="{ゼロ埋め(unix/3600%24,2)}:{ゼロ埋め(unix/60%60,2)}:{ゼロ埋め(unix%60,2)}"
    tmpで戻る
LL Golf Hole 7 - バイト数を読みやすくする (Nested Flatten)

日本語言語なのに、ぜんぜん日本語っぽい投稿をしてないなと思ったので、少々長くなりますがあえて。

1
2
3
4
5
6
7
8
「バイト数を入力してください」と尋ねて入力に代入
単位は「{改行}k{改行}M{改行}G{改行}T」
カウンタは0
入力が1024以上の間
    入力を1024で直接割る
    カウンタに1を直接足す
入力を1で小数点四捨五入
それ&単位[カウンタ]を表示
LL Golf Hole 5 - 最上位の桁を数え上げる (Nested Flatten)

正規表現をお借りして、43バイト。

1
iで0から尋(i)まで繰返,RE(i,"^.0*$")なら表示
LL Golf Hole 3 - 13日の金曜日を数え上げる (Nested Flatten)

なでしこで。

1
2
3
4
5
6
7
8
C=0;D="{今年}/{今月}/13"
もし(MID(今日,9,2)>13)ならば
    D=Dに"/1/"を日付加算
(D<>"2014/01/13")の間
    もし(Dの曜日="金")ならば
        C=C+1
    D=Dに"/1/"を日付加算
Cを表示
LL Golf Hole 1 - tinyurl.comを使ってURLを短縮する (Nested Flatten)

こういうことですか?

1
2
"http://tinyurl.com/api-create.php?url=http://ll.jus.or.jp/2008/info/xgihyo"からHTTPデータ取得
それを"http:\/\/tinyurl.com\/[a-z0-9-]+"で正規表現マッチして表示
環境変数の取得 (Nested Flatten)
なでしこには「環境変数取得」「環境変数展開」の二つが標準命令にあります。
1
2
"PATH"の環境変数取得して表示
"%TMP%"の環境変数展開して表示
クリップボードへの転送 (Nested Flatten)
なでしこでは「コピー」でクリップボードにコピー、「クリップボード取得」でクリップボードを取得できます。
1
2
3
4
# クリップボードにコピー
「Hello World」をコピー
# クリップボードから取得
クリップボード取得して表示

なでしこでは、変数「クリップボード」でクリップボードの読み書きが出来ます。

また、命令としても、クリップボードからの取り出しには「クリップボード取得」、転送には「コピー」が使用できます。

1
2
3
4
5
クリップボードは「変数経由」
クリップボード取得して表示

「命令経由」をコピー
クリップボードを表示
比較しないソートの作成 (Nested Flatten)
こんな感じでしょうか。配列と最小値だけ必要です。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
●sort(data,min)
    tmpとは配列
    bufとは配列
    iとは整数
    dataを反復
        tmp[対象-min]=tmp[対象-min]+1
    iで0から(tmpの配列要素数)-1まで繰り返す
        (tmp[i])回
            bufにi+minを配列追加
    bufで戻る

a="-1 9 4 8 9 6 3 9 5 2"を" "で区切る
sort(a,-1)を表示
循環関数 (Nested Flatten)
1
2
●modular(n,low,high)
    low + n % (high - low + 1)で戻る
コメントの削除 (Nested Flatten)
一行コメントに「##'’」と「//」、複数行コメントに「/**/」、文字列リテラルに「」、『』、""、``と結構種類がありますが、思ったほど面倒ではありませんでした。
 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
●コメント削除(TEXTの|TEXTを)
    ONELINEとは整数=0
    MULTILINEとは整数=0
    LITERALとは整数=0
    SKIP_FLAGとは整数=0
    BUFとは配列
    TMPとは配列=TEXTを文字列分解
    TMPを反復
        #一文字飛ばす
        もし(SKIP_FLAG=1)ならば
            SKIP_FLAG=0
            続ける
        #文字列リテラル内
        もし(LITERAL=1)ならば
            もし(対象=「"」||対象=「`」||対象="」"||対象="』"||対象="」")ならば
                LITERAL=0
        違えば
            もし(対象=「"」||対象=「`」||対象="「"||対象="『"||対象="「")ならば
                LITERAL=1
        #文字列リテラル外
        もし(LITERAL=0)ならば
            #一行コメント
            もし(ONELINE=1)ならば
                もし(対象=改行)ならば
                    ONELINE=0
                違えば
                    続ける
            違えば
                #「##'’」形式
                もし(対象="#"||対象="#"||対象="'"||対象="’")ならば
                    ONELINE=1
                    続ける
                #「//」形式
                もし(対象="/"&&TMP[回数]="/")ならば
                    ONELINE=1
                    SKIP_FLAG=1
                    続ける
            #複数行コメント
            もし(MULTILINE=1)ならば
                #コメント閉じ
                もし(対象="*"&&TMP[回数]="/")ならば
                    MULTILINE=0
                    SKIP_FLAG=1
                続ける
            違えば
                #コメント開始
                もし(対象="/"&&TMP[回数]="*")ならば
                    MULTILINE=1
                    SKIP_FLAG=1
                    続ける
        BUFに対象を配列追加
    BUFを""で配列結合で戻る

TEXT=「a=a*b/c//test
"hello,world /*test*/#test"を表示 # comment
/* comment */」

TEXTをコメント削除して表示
設定ファイルから値を取得 (Nested Flatten)

上、言語を選び損ねましたorz

標準のINI関数ではセクションがないと値を取得できないので、セクションがないファイルの場合は「ハッシュ変換」を使うと便利です。

ShowPrice.ini name=りんご cost=200

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
●ShowPrice
    tmpとは文字列
    nameとは文字列
    costとは文字列
    tmp="{母艦パス}ShowPrice.ini"を開いてハッシュ変換
    name=tmp@"name"
    cost=tmp@"cost"
    "「{name}」は{cost * 1.05}円(税込み)"を表示 

ShowPrice
ミリ秒まで含んだ時刻文字列 (Nested Flatten)
WinAPIのGetLocalTimeを使っています。
 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
●GetLocalTime({参照渡}LPSYSTEMTIME) =DLL("kernel32.dll","VOID GetLocalTime(LPSYSTEMTIME)")
●詳細時刻取得
    SYSTEMTIMEとは文字列
    Iとは整数
    BUFとは配列
    SYSTEMTIMEに16を確保 //16bit*8[byte]
    GetLocalTime(SYSTEMTIME)
    Iで0から7まで繰り返す
        BUF[I]=SYSTEMTIMEの(I*2+1)を"WORD"でバイナリ取得
    BUFで戻る

●時刻整形(T)
    BUFとは文字列
    Iとは整数
    T[0]=T[0]を4でゼロ埋め //年
    T[7]=T[7]を3でゼロ埋め //ミリ秒
    Iで1から6まで繰り返す
        T[I]=T[I]を2でゼロ埋め
    T[0]&T[1]&T[3]&T[4]&T[5]&T[6]&"."&T[7]で戻る
    #"{T[0]}年{T[1]}月{T[3]}日{T[4]}時{T[5]}分{T[6]}.{T[7]}秒"で戻る

テストエディタとはエディタ
その幅は200
1の間
    テストエディタ=時刻整形(詳細時刻取得)
    0秒待つ
自分自身のファイル名を知る方法 (Nested Flatten)

99yenさんのものだとパスも表示されてしまうので。

1
コマンドライン[0]からファイル名抽出を表示
1
2
3
4
// ファイルのパス
コマンドライン[0]を表示
// なでしこインタプリタのパス
ナデシコランタイムパスを表示
文字変換表に基く文字列の変換 (Nested Flatten)

手を抜いて、正規表現で拡張版。

1
2
3
4
5
●trex(s,a,b)
    sの"[{a}]"を"[{b}]"へ正規表現入換

trex("typewriter","a-z","A-Z")
表示
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
●tr(s,a,b)
    oldとは配列 = aを文字列分解
    newとは配列 = bを文字列分解
    Iとは整数。ENDとは整数
    もし(要素数(old)>要素数(new))ならば
        END = 要素数(new) - 1
    違えば
        END = 要素数(old) - 1
    Iで0からENDまで繰り返す
        s = sのold[I]をnew[I]に置換
    sで戻る

tr("typewriter","qwertyuiop","QWERTYUIOP")
表示
next >>

Index

Feed

Other

Link

Pathtraq

loading...