UWSC 掲 示 板
投稿時に「証明書が不正です」と出る場合には、JavaScriptをオンにしてください
動作不具合での質問の場合には環境(OS,IEのバージョン等)の表記もしてください
タイトルは質問内容を表したものにしてください
ネットゲーム関係の質問はご遠慮ください

1回だけ〜 / ロボコップ
「A.bmpが出ない間、V.bmpが出たら右キーを1回押す」
を作りたいのですが

WHILE (CHKIMG("A.bmp")=FALSE)
IFB CHKIMG("V.bmp")
KBD(VK_RIGHT,DOWN)
KBD(VK_RIGHT,UP,50)
ENDIF
WEND

上記だとA.bmpが出なくてV.bmpが出る間、右キーが連発してしまいます。
右キーを“1回だけ”押すにはどうすればいいでしょうか?

No.4922 2017/12/29(Fri) 17:49:10

Re: 1回だけ〜 / 森
なんとデジャヴな・・・
http://www3.rocketbbs.com/13/bbs.cgi?id=umiumi&mode=pickup&no=4885

質問内容からは、希望動作がはっきり分かりませんので勘ですが、
1.画面上にAかVのどちらかが出現する
2.Aが現れたらクリックしてプログラムを終了
3.Vの場合はクリックして(クリックしたらVが消える)1に戻る

みたいな感じじゃないでしょうか。
だとしたら、WENDの前にsleep(1)ぐらいを入れれば良いと思います。

単純に、Vを1回押したらプログラムを終了すればいいのでしたら、
ENDIFの前にbreakです。

No.4925 2017/12/29(Fri) 19:15:34
CREATEFORMで作成した<frame>を利用したイベント操作について / さやか
CREATEFORMで作成したフォームにボタンが有り、それを押す事によりFUNCTIONで指定した処理を行いたいのですがうまくいきません。<frame>を利用したかった場合であればうまくいくのですが、どこがまちがっているのでしょうか?(テスト.htmlを読込フォーム作成)


obj = CREATEFORM("テスト.html", "GETFORMDATA_SCRIPT", TRUE, FOM_NOHIDE, 1070, 700, 150, 0)
obj.Document.location.reload()
obj.Document.Frames["frame_hidari"].Document.write(frame_hidari)
obj.Document.Frames["frame_ue"].Document.write(frame_ue)
obj.Document.Frames["frame_migi"].Document.write(frame_migi)

//イベント呼び出し
OleEvent(obj.document.all.btnCalc, "HTMLButtonElementEvents", "onclick", "EventCalc")
//イベント呼び出し


while obj.visible
sleep(0.1)
wend


FUNCTION EventCalc()
MsgBox("「計算する」が押されました")
RESULT = "cal"
FEnd
---------------------
//テスト.html

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="C:\Users\Desktop\UWS\CREATEFORM\オリジナル\style.css">
<title>フレーム使用例</title>
</head>

<frameset cols="174,*">

<frame name="frame_hidari">
</frame>

<frameset rows="500,*">
<frame name="frame_ue">
</frame>

<frame name="frame_migi">
</frame>
</frameset>

<noframes>
このページはフレームを使用しています。
</noframes>
</frameset>



<body style="overflow:hidden;">
<form method="POST">
<div id=frame_hidari>
左テスト
</div>

<div id="frame_ue">
上テスト
<input type="button" id="btnCalc" value="計算する">

</div>

<div id="frame_migi">
右テスト
</div>
</form>
</body>
</html>

No.4905 2017/12/27(Wed) 11:25:04

Re: CREATEFORMで作成した<frame>を利用したイベント操作について / さやか
訂正
<frame>を利用したかった場合→<frame>を利用しなかった場合

No.4906 2017/12/27(Wed) 11:26:31

Re: CREATEFORMで作成した<frame>を利用したイベント操作について / さやか
過去の掲示板の下記のソースを参考にしています。

TextBlock frame_hidari
<HTML>
<BODY>
フレーム左
</BODY>
</HTML>
EndTextBlock

TextBlock frame_ue
<HTML>
<BODY>
フレーム上
</BODY>
</HTML>
EndTextBlock

TextBlock frame_migi
<HTML>
<BODY>
フレーム右
</BODY>
</HTML>
EndTextBlock


TextBlock GETFORMDATA_SCRIPT
<html>
<head>
<title>フレーム使用例</title>
</head>

<frameset cols="174,*">

<frame name="frame_hidari">
</frame>

<frameset rows="500,*">
<frame name="frame_ue">
</frame>

<frame name="frame_migi">
</frame>
</frameset>

<noframes>
このページはフレームを使用しています。
</noframes>
</frameset>

</html>
EndTextBlock

obj = CREATEFORM("about:blank", "GETFORMDATA_SCRIPT", TRUE, FOM_NOHIDE, 1070, 700, 150, 0)
obj.Document.write(GETFORMDATA_SCRIPT)
obj.Document.location.reload()
obj.Document.Frames["frame_hidari"].Document.write(frame_hidari)
obj.Document.Frames["frame_ue"].Document.write(frame_ue)
obj.Document.Frames["frame_migi"].Document.write(frame_migi)


while obj.Visible
 Sleep(0.1)
WEND

No.4907 2017/12/27(Wed) 11:27:55

Re: CREATEFORMで作成した<frame>を利用したイベント操作について / 森
まずは、フレーム中身のwriteが、これではできないと思います。
参考にしたスクリプトと良く見比べてみてください。
次に、フレーム中身のwriteがちゃんとできた状態で試してみたのですが、DOM操作でエラーが発生しますね。

公式FAQによると、
  IEの操作(DOM)にて、フレーム内の操作ができない  #N37
  http://www.uwsc.info/faq.html#N37
  フレームが別ドメインまたはプロトコルが違う場合には、セキュリティの為に DOMでの操作はできません。
  しかし、UWSCのIE操作関連の関数であればアクセスができます。(Ver5.1.0以上)
  
とのことなので、それが原因かもです。
興味があったので色々やってみましたが、どうも難しいですね。
興味があったのは確かですが、やはり今どきフレームは・・・と思いました。
画面分割でしたら、STYLE使ってやった方が良いと思います。
もしくは、これも今風ではありませんがTABLEで。

No.4919 2017/12/29(Fri) 13:58:24
mouseorgの挙動 / うなご
mouseorg関数で第2引数が
1は座標情報をクライアント領域基準
2はクライアント領域基準化+直接ウィンドウに関数の操作を送る
という感じだと思うのですが、2の方をウィンドウ基準(タイトルバーの左上基準)もしくはスクリーン座標を基準にする方法などありますか?

3年前に組んだ低レベル操作のマクロがありそれを実行しながら別モニタで作業をしたいです。
mouseorg関数以外でもなにか思いつくことがあれば教えていただけるとうれしいです。。。

(使っている関数で位置が関係するのはMMV,BTN,CHKIMGです。操作的にはKBDも使ってます。。)

No.4915 2017/12/28(Thu) 23:05:26
Googleスプレッドシートのメニューのファイルをクリックする方法 / ゆう
Google Chromeのブラウザーでアクセスし、Googleスプレッドシートのメニューのファイルをクリックする方法が分かりません。下記のコードで試してみたのですが、うまくいきません。何か良い方法ないでしょうか?


id=GETID("Google スプレッドシート - Google Chrome")
CLKITEM(id, "ファイル")

No.4850 2017/12/16(Sat) 02:21:41

Re: Googleスプレッドシートのメニューのファイルをクリックする方法 / ゆう
下記のリンクにGoogleスプレッドシートの画像を貼りました。
https://gyazo.com/9fa0a30cbfd1914e430e77a9fed82814

No.4851 2017/12/16(Sat) 02:22:45

Re: Googleスプレッドシートのメニューのファイルをクリックする方法 / stuncloud
seleniumを使うなど、WebDriver経由での操作が確実だと思います
さすがにすごいDOM構造だったので骨が折れそうですが…

No.4869 2017/12/20(Wed) 11:02:54

Re: Googleスプレッドシートのメニューのファイルをクリックする方法 / satocha
メニューを開くだけなら下の方法でできました(ffとchromeクローンのvivaldiで確認。chrome未確認)。

ただ、ここから先はどうも難しそうです。DOM操作はstuncloudさんのおっしゃるとおり容易ではありません。たとえば、「ファイル」の部分はfilemenu=ie.getElementById('docs-file-menu')で取得できます(IEオブジェクト使用の場合)が、filemenu.click()としても何も起きません。seleniumは試していませんが、変わらない気がします。

それに、G社のサービスは頻繁な機能更新で有名です。苦労の末DOM解析ができたところで、それがいつまで使えるか不透明です。

シートの中身まで操作したいのであれば、手元にシートをダウンロードして操作したあと書き戻すなどしたほうがいいと思います。

-----------------------------------------------------------
id=GSpread.Focus( "無題のスプレッドシート" )
sleep(0.5)
GSpread.openMenu( "表示形式" )
sleep(1)
kbd(vk_esc)
GSpread.openMenu( "データ検索" )

module GSpread
public id =-1
hashtbl shortcut
procedure GSpread
for sc in split( shortcutdata, "<#CR>" )
ary =split( sc )
shortcut[ ary[0] ]=eval( "vk_" + ary[1] )
next
textblock shortcutdata
ファイル f
編集 e
表示 v
挿入 i
表示形式 o
データ d
ツール t
フォーム m
アドオン n
ヘルプ h
データ検索 x
シート選択 k
endtextblock
fend

function Focus( TitleOfSpreadSheet )
for id in getAllwin()
if pos( TitleOfSpreadSheet, status( id, st_title ) )
ctrlwin( id, activate )
break
endif
next
result =id
fend

procedure openMenu( menu )
kbd( vk_shift, down )
kbd( vk_alt, down )
kbd( shortcut[ menu ] )
kbd( vk_shift, up )
kbd( vk_alt, up )
fend
endmodule

No.4873 2017/12/20(Wed) 16:28:17

Re: Googleスプレッドシートのメニューのファイルをクリックする方法 / せきしんご
stuncloud様、btnでならできています。
No.4892 2017/12/25(Mon) 11:29:39

Re: Googleスプレッドシートのメニューのファイルをクリックする方法 / せきしんご
satocha様、chromeで教えて頂いたソース試してみましたが、ファイルをクリックせずデータ検索の画面になります。BTNで処理としてはできています、ありがとうございました。
No.4893 2017/12/25(Mon) 11:34:01

Re: Googleスプレッドシートのメニューのファイルをクリックする方法 / satocha
>ファイルをクリックせずデータ検索の画面になります
説明が足りなかったかもしれません。お示したのは、「表示形式」メニューを開いて閉じ、1秒後に「データ検索」を行う例です。

textblockの中にあるファイル、編集、表示…というメニューは皆、おなじやり方で呼べるようにしてあります。
「ファイル」なら、
GSpread.openMenu( "ファイル" )
でファイルメニューが開きます。

No.4895 2017/12/25(Mon) 16:36:54

Re: Googleスプレッドシートのメニューのファイルをクリックする方法 / せきしんご
satocha様、難しくてソースを読み解く事ができませんでした。希望通りの処理できました。
ありがとうございました。

No.4901 2017/12/26(Tue) 12:34:46
下記の文字列の4つ目の<#TAB>を<#CR>に変換する方法ないでしょうか? / はるか
下記の文字列の4つ目の<#TAB>を<#CR>に変換する方法ないでしょうか?
正規表現でパターンを組むのもどういうパターンにしたらいいか分かりませんですし、CHGMOJを使用しても一括置き換えになるのでできません。ご教授願いませんか?
---------------------

[元の文字列]
<#TAB>タイトル1<#TAB>タイトル2<#TAB>タイトル3<#TAB>項目0
項目1
項目2
項目3

[希望の処理]
<#TAB>タイトル1<#TAB>タイトル2<#TAB>タイトル3
項目0
項目1
項目2
項目3

No.4894 2017/12/25(Mon) 13:30:30

Re: 下記の文字列の4つ目の<#TAB>を<#CR>に変換する方法ないでしょうか? / 森
// 元の文字列中のタブが本当のタブじゃなくて、
// UWSCの特殊文字である"<#TAB>"の場合は、"<#" + "TAB>" などとして検索してください。
t4 = pos("<#TAB>" , before , 4) // 4つ目の{タブ}の位置
s1 = copy(before, 1 , t4 - 1)  // 4つ目の{タブ}より前
s2 = copy(before, t4 + 1)    // 4つ目の{タブ}より後
after = s1 + "<#CR>" + s2
msgbox(after)

// 正規表現
reg = CreateOLEObj("VBScript.Regexp")
reg.pattern = "((\t.*){3})\t"
after = reg.Replace(before, "$1<#CR>")
msgbox(after)

// {タブ}は本当のタブ
textblock before
{タブ}タイトル1{タブ}タイトル2{タブ}タイトル3{タブ}項目0
項目1
項目2
項目3
endtextblock

No.4896 2017/12/25(Mon) 19:10:39

Re: 下記の文字列の4つ目の<#TAB>を<#CR>に変換する方法ないでしょうか? / はるか
森様、提示頂きましたコードで希望通りの処理ができました。
posの使い方分かっていたつもりですが、私は理解できていなかった事を再認識できました。
正規表現むずかしいですね、勉強が必要だと認識できました。

No.4900 2017/12/26(Tue) 12:12:43
キーワードを検索した時に表示される説明文を取得する方法 / せきしんご
IEでキーワードを検索した時に表示される1位から10位までサイト名とURLは取得できるのですが、1位から10位までのdescriptionである説明文を取得方法が見つかりません。
IE.document.body.innerTEXTで取得してもひっかかりとなるパターンがないですし、IE.document.body.innerhtmlだと
下記のようなソースにパターンになっています。これを正規表現でパターンで検出でできればいいのですが、今の私では分かりません。何か良い方法ないでしょうか?

説明文の画像は下記。
https://gyazo.com/e304b640d92044074581051cc1cf79be
---------------------
ソース抜粋
<span class="st">文字列<em>文字列</em>文字列<em>文字列</em>文字列<em>文字列</em>文字列<em>エージェント</em>文字列</span>
---------------------
uws10位まで検索

IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True

tes =""
goo ="http://www.google.co.jp/search?hl=ja&lr=lang_ja&pws=0&q="
//key = INPUT("キーワードを入力してください")

IE.Navigate(tes+goo+url) // INPUT

BusyWait(IE)
Sleep(1)                  // JavaScriptの完了待ち
body = IEGetSrc(IE, "BODY")             // BODYのソース取得
body = Copy(body, Pos("<h3 ",body), 999999)       // h3タグ以下を取得
body = Copy(body, 1, Pos("background-position", body)) // 不必要部分の削除
cnt = 1
path="C:\Users\aa.xlsm" //データ出力先

Excel = XLOPEN(path)
XLSHEET( Excel,url)
while True
 wks= BetweenStr(body,"<h3 ","</h3>", cnt)
 if wks = EMPTY then break
 wks = REPLACE(wks,"<em>", "")    // 邪魔なタグは潰す
 wks = REPLACE(wks,"</em>", "")
 wks = REPLACE(wks,"</a>", "")
 title=Copy(wks, Pos("<#DBL>",wks,-1)+2, 999)   // タイトル
 url1=BetweenStr(wks, "href=<#DBL>","<#DBL>")  // URL

XLSETDATA(Excel, title, "b"+cnt)
XLSETDATA(Excel, url1, "c"+cnt)
 cnt = cnt + 1
wend


Procedure BusyWait(ie)
 repeat
  Sleep(0.2)
 until (! ie.busy) and (ie.readyState=4)
Fend
---------------------

No.4891 2017/12/25(Mon) 11:26:50

Re: キーワードを検索した時に表示される説明文を取得する方法 / 森
HTMLからデータを取得するのは、DOMの勉強をすると良いですよ。

// google_search.uws
// ------------------------------
IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
keyword = encode(input("検索キーワード"), CODE_URL)
IE.Navigate("http://www.google.co.jp/search?hl=ja&lr=lang_ja&pws=0&q="+keyword)
repeat
 Sleep(0.2)
until (! ie.busy) and (ie.readyState=4)
sleep(1)
g = IE.document.getElementsByClassName("rc") // 個別データ
n = g.length - 1 // データ数

// 配列に格納
dim data[n][2]
for i = 0 to n
 COM_ERR_IGN
  data[i][0] = g.item[i].getElementsByTagName("a").item[0].innerText
  data[i][1] = g.item[i].getElementsByTagName("a").item[0].href
  data[i][2] = g.item[i].getElementsByClassName("st").item[0].innerText
 COM_ERR_RET
next

// CSVに出力
f = fopen("data.csv" , F_WRITE8B)
fput(f , "Title,URL,Description")
for i = 0 to n
 fput(f , mold(data[i][0]), i + 2 , 1 )
 fput(f , mold(data[i][1]), i + 2 , 2 )
 fput(f , mold(data[i][2]), i + 2 , 3 )
next
fclose(f)

function mold(s)
 // 改行を削除
 s = replace(s, "<#CR>", "")
 // ダブルクォーテーションをエスケープ
 s = replace(s, "<#DBL>", "<#DBL><#DBL>")
 // 前後にダブルクォーテーション
 result = "<#DBL>" + s + "<#DBL>"
Fend

// ------------------------------
2017/12/26 11:05
検索結果の途中で画像検索結果やショッピング等が入ると以降が取得できなかったため一部修正しました。
getElementsByClassName("g") → getElementsByClassName("rc")
TRY - ENDTRY → COM_ERR_IGN - COM_ERR_RET

No.4898 2017/12/26(Tue) 10:29:31

Re: キーワードを検索した時に表示される説明文を取得する方法 / せきしんご
森様、回答ありがとうございます。完璧に希望通りの処理です。
このような貴重なソースを提示頂き感謝です。
私ももっと学んでいこうと思います。(DOMの書籍、さっそくアマゾンで買いました)

No.4899 2017/12/26(Tue) 12:09:53
Windowsログイン後にUWSCが動き出すようにしたいです / yama
Windows10 ver1709でFirefox ver.57.0.2を使用しています。

Windowsにログインをした後、自動的にFirefoxを立ち上げてWebページにそのサイトの
ログインIDを送るという設定を試してみたいと思い、まず手始めに

SLEEP(2)
EXEC("C:\Program Files\Mozilla Firefox\firefox.exe")
ID = GETID("Firefox")

とだけ書いた .UWS をスケジュール設定で登録し、タイマーは起動時を選択しました。
そしてUWSC.exe のショートカットをスタートアップに登録しました。

ログインした状態で上記のスクリプトを実行した場合は普通にFirefoxが立ち上がります。
(こちらはSENDSTRが機能しないという別の問題が起こっていて困っています。)

ところが、電源を完全に切った(コンセントから一旦プラグを抜いた)状態から電源をいれて
PCを起動すると、ログインをする前にUWSCが動き出していて、Firefoxの画面はモニタ上に表示
されません(Firefox自体は起動していて、タスクバーのアイコンからウィンドウを閉じること
はできます。ただ次に起動したFirefoxの画面はモニタ左上に小さい状態で表示されます)。

SLEEP()を長くする方法では、電源を入れた後にPCの前で待ち構えていないといけなくなります。
なんとかしてWindowsにログインした後にUWSCが動き始めるようにすることはできないでしょうか?

どうぞよろしくお願いいたします。

No.4886 2017/12/23(Sat) 10:13:13

Re: Windowsログイン後にUWSCが動き出すようにしたいです / しろまさ
タスクに登録する方法(SchTasks スタートアップ起動)
http://siromasa.html.xdomain.jp/uwsc/u_term/41_Tasuku.html

No.4889 2017/12/25(Mon) 08:51:46

Re: Windowsログイン後にUWSCが動き出すようにしたいです / yama
しろまさ様、どうもありがとうございます。
UWSC でなんとか頑張るのではなくて Windows 側で処理をする方が適切な事柄だったのですね。
これから試してみます。
本当にありがとうございました。

P.S.
SENDSTR が動かないというのは単に時間がかかっていただけでした。
すぐに反応がなかったので間違っていると考えてスクリプトを止めていました。

No.4897 2017/12/25(Mon) 23:20:07
現在入力中か否かを取得したい。 / piz
GETIDでIDを取得しその後入力できるテキストボックスが複数ある時に
入力中のテキストボックスによって噴出しを使い入力例などを表示させたく
アクティブであるかを取得する方法はありますでしょうか?

No.4857 2017/12/18(Mon) 16:00:55

Re: 現在入力中か否かを取得したい。 / piz
???をどうすれば何番目のテキストボックスがアクティブなのかを知る方法がわかりません。

a = ???
while true
 SELECT a
  CASE 1
    FUKIDASI("一つ目の入力箇所です。")
  CASE 2
    FUKIDASI("二つ目の入力箇所です。")
  CASE 3
    FUKIDASI("三つ目の入力箇所です。")
  DEFAULT
    FUKIDASI("")
 SELEND
SLEEP(1)
wend

No.4865 2017/12/20(Wed) 10:45:07

Re: 現在入力中か否かを取得したい。 / stuncloud
GetFocus()で監視してフォーカスされてるのがEditだったら近くにbaloon()を出すという方法でいけるのではないかと思ったんですがうまくいかなかったんですよね…
AttachThreadInput()しないといけないような気がしたのでやってみたらハンドルは取れたんですけどすぐにフォーカスが対象ウィンドウから外れてしまって、そこらでわからなくなってギブアップ
(あとこれだとうまくいってもwin32なウィンドウじゃないとダメだと思う)

なにかいい案ありませんかね…? >他の方
UWSCからUIAutomation使えたらどうにかなるんじゃろか

No.4868 2017/12/20(Wed) 11:01:17

Re: 現在入力中か否かを取得したい。 / 森
> 入力中のテキストボックスによって噴出しを使い入力例などを表示させたく
ということは、自作プログラムでUWSCのCREATEFORMで生成した入力フォームなのでは?
だとしたら、以下のように表示させることが可能です。

dim now , old
form = CREATEFORM("about:blank", "sample", True)
form.Document.write(html)
while form.Visible
 Sleep(0.2)
 now = form.document.activeElement.id
 if now = old then continue
 select now
  case "Text1"
   form.document.getElementById("hint1").style.display = "inline"
   form.document.getElementById("hint2").style.display = "none"
   form.document.getElementById("hint3").style.display = "none"
  case "Text2"
   form.document.getElementById("hint1").style.display = "none"
   form.document.getElementById("hint2").style.display = "inline"
   form.document.getElementById("hint3").style.display = "none"
  case "Text3"
   form.document.getElementById("hint1").style.display = "none"
   form.document.getElementById("hint2").style.display = "none"
   form.document.getElementById("hint3").style.display = "inline"
 selend
 old = now
wend

textblock html
<html>
<style>
.hint{
 background:#F2BD03;
 display:none;
}
</style>
<body><form method="POST">
<p>Text1 <input type="text" id="Text1"><span id="hint1" class="hint">入力例1</span></p>
<p>Text2 <input type="text" id="Text2"><span id="hint2" class="hint">入力例2</span></p>
<p>Text3 <input type="text" id="Text3"><span id="hint3" class="hint">入力例3</span></p>
</form></body></html>
endtextblock

No.4879 2017/12/21(Thu) 17:56:17

Re: 現在入力中か否かを取得したい。 / piz
試行錯誤して頂きありがとうございます。

>ということは、自作プログラムでUWSCのCREATEFORMで生成した入力フォームなのでは?
使っているソフトは生成した入力フォームではありません。
業務で使っている生産管理ソフトです。お客様IDや品物品番、数量などを入力する欄が沢山あります。
GETSTRやSENDSTRなどでは指定の番号何番目まで文字を取得したり送信したりできますが
手入力中にてアクティブな入力項目を取得したいです。

No.4884 2017/12/22(Fri) 14:38:43
縛りありfizzbuzz / stuncloud
12月なのでちょっとしたお遊び投稿します

・数値、文字リテラル禁止
・組み込み定数も禁止

one = val(! length(balloon()))
two = one + one
three = one + two
four = two + two
five = one + two + two
eight = four + four
nine = three * three
hundred = five * five * four
f = hundred + two
i = hundred + five
b = hundred - two
u = hundred + five * two + five + two
z = hundred + five * four + two
fizz = chr(f) + chr(i) + chr(z) + chr(z)
buzz = chr(b) + chr(u) + chr(z) + chr(z)

for i = one to hundred
 j = i mod three
 k = i mod five
 print copy(fizz + buzz + i, nine - !j * eight - !k * four, four + !j * !k * four)
next


出力部分は以前しゅんさんが考案したものそのままです、いいですよねこの何してるのかわかんない感じ
one = 1 さえ作れてしまえばいいので最初は
one = DOWN
にしていたんですが、ここ以外定数が使われてないのでいっその事これも禁止にしました
やってることは
one = val(TRUE)
です

実際書いてみると縛りがあるというほどでもなかったのと、あまりきれいな感じでもなかったのが残念ですね
今はなんかもっとどぎつい縛りができないかなーって考えてる最中です

No.4848 2017/12/15(Fri) 18:06:07

Re: 縛りありfizzbuzz / satocha
「わりと短めでいいんじゃないだろうか」とネットで評判のプログラムを拝借しました。
FIZZBUZZなのに「15」という数値を使わないところがさすがですね。

※zeroは不要ですが、後々のため(?)出力しています。

※万一、タイムマシン等で2000年にいらっしゃることがあれば、このスクリプトは動作しない可能性があります。あらかじめ、ご承知置きください。

//mkFizzbuzz.uws
sendstr( exec("notepad"), powershell(trim(_fiz_ps1)) )

textblock _fiz_ps1
$BINARY=@(@{b0="!(!gettime())"})
for( $i=0;$i-lt7;$i++){
$BINARY+=,@{("b"+[string]($i+1))="b${i}+b${i}"}
}
#$BINARY.getEnumerator()
$ZERO="!gettime()"
function getNumber($num){
if ( $num -eq "0" ){
return $ZERO
}
$bin =[convert]::Tostring($num,2).padleft(8,"0")
$idx=7
$res=""
[char[]]$bin|%{
if ($_-eq"1"){
$res+="b${idx}+"
}
$idx--
}
return $res -replace "[+]$",""
}

$src="1..100|%{@('Fizz')[`$_%3]+@('Buzz')[`$_%5]-replace`"^$`",`$_}"
$idx=0
$fig_code=@{}
$code_val=@{}
[char[]]$src|sort|gu|%{
$code ="c"+[string]($idx++)
$fig =$_
$val =[string][text.encoding]::ascii.getbytes($_)
#"$code`t$fig`t$val"
$fig_code.$fig =$code
$code_val.$code =getnumber $val
}

$pssrc=""
[char[]]$src|%{
$pssrc+="chr(" + $code_val.($fig_code.$_)+ ")+"
}
$pssrc=$pssrc -replace "[+]$",""
"zero=$ZERO"
$BINARY|%{
foreach( $ky in $_.keys ){
"$ky="+$_.$ky
}
}
"msgbox(powershell(${pssrc}))"|write-host
endtextblock


//上記スクリプトが生成したfizzbuzz.uws
//…を貼り付けたら長大な行のせいで掲示板のレイアウトが崩れそう。
//なので、最後の行を省略しました。
//実際に生成して確かめてください。
zero=!gettime()
b0=!(!gettime())
b1=b0+b0
b2=b1+b1
b3=b2+b2
b4=b3+b3
b5=b4+b4
b6=b5+b5
b7=b6+b6
msgbox(powershell(chr(b5+b4+b0)+chr(b5+b3+b2+b1)+…+chr(b6+b5+b4+b3+b2+b0)))

No.4852 2017/12/17(Sun) 12:42:14

Re: 縛りありfizzbuzz / しゅん
一時、強烈な縛りも考えたんですけど、UWSCだと難しいんですよね、、、。
jjencodeの場合、Javascriptの特殊構文を利用して関数が実行できたり文字列の切り出しが可能なので、関数(ステートメントを除く)はEVALとCOPYのみ許して他禁止とか考えてたんですけど、、、文字、作れないんですよね。
特に、CHRを禁止したいところ。

No.4853 2017/12/18(Mon) 08:59:57

Re: 縛りありfizzbuzz / stuncloud
そうか…gettime()という手があったか…!
> 万一、タイムマシン等で2000年にいらっしゃることがあれば
なるほど2000年1月1日0時0分0秒だとまずいんですね

> 特に、CHRを禁止したいところ。
で、decode()でごまかす… (あんまり変わらない

No.4854 2017/12/18(Mon) 10:25:53

Re: 縛りありfizzbuzz / satocha
次の記号禁止
+ - * /
mod演算子禁止
=は代入のみ(比較での使用禁止)

if文禁止
while~endwhile禁止
repeat~until禁止

ってルールで書いてみました。UWSCだからできるので、他言語への移植はほぼ不可能。
Windows10非対応です。めちゃくちゃ遅いです。

https://plaza.rakuten.co.jp/satocchia/diary/201712180000/

No.4855 2017/12/18(Mon) 13:55:09

Re: 縛りありfizzbuzz / satocha
追加です。
比較演算子は=だけでなく不等号も使っていません。
組み込みの数学関数も不使用です。

定数の縛りには従っていません。No4852の方法でできそうだけど。

現状、1箇所だけ、select~selendの分岐構文を使っていますが、なんとかしたいところです。
無理かな。

あと、1から100までだと
print 1
print 2
print "Fizz"

のような自明の回答を排除しにくいため、任意の始点と終点を設定できる条件を加えたほうがいいと思います。

No.4856 2017/12/18(Mon) 14:43:05

Re: 縛りありfizzbuzz / stuncloud
電卓!一気にUWSCっぽくなりましたね!
いやぁ…こういう発想出てこないですね…
頭の柔軟性がうらやましい

> select~selendの分岐構文を使っていますが、なんとかしたいところ
out = split(replace("n Fizz Buzz FizzBuzz","n",i))[q]
これなら条件に抵触しない…ですよね?
配列の添字って文字列のままでもいけちゃうんですね (val()いらなかった

> 自明の回答を排除しにくい
ちゃんとした競技っぽくやるならたしかにそうですね
とは言え、さすがにここで遊びに付き合ってくれる方は大丈夫でしょう!

No.4858 2017/12/18(Mon) 16:42:42

Re: 縛りありfizzbuzz / satocha
>out = split(replace("n Fizz Buzz FizzBuzz","n",i))[q]
さすがですね。行数もたった1行だし。勉強になりました。

>頭の柔軟性
は、特にないです。

なんか、No.4199以下のスレッドを思い出し、これならいけると思ってスクリプトを書きました。書いてみたら、四則演算を使っていなかったりしてたんで、「できっこないだろ」感満載のルールにしました。

そういうわけで、ルールは後付です。

No.4859 2017/12/18(Mon) 19:56:42

Re: 縛りありfizzbuzz / stuncloud
> 次の記号禁止
> + - * /
> mod演算子禁止
> =は代入のみ(比較での使用禁止)
>
> if文禁止
> while~endwhile禁止
> repeat~until禁止


を満たすmod関数できました
n mod m を返します

print %(100, 3) // 1

function %(n, m)
 n = subtract(n, m)
 dim [] = n, m
 select ! subtract(calcarray([], CALC_MAX), m) and !(! subtract(calcarray([], CALC_AVR), m))
  case TRUE
   result = n
   exit
  default
   result = %(n, m)
 selend
fend

// n + m
function add(n, m)
 dim [] = n, m
 result = calcarray([], CALC_ADD)
fend

// n - m
function subtract(n, m)
 dim [] = n, add(m xor $FFFFFFFFFFFFFFFF, 1)
 result = calcarray([], CALC_ADD)
fend


なんとなくcalcarray使えばできそうな気がしたのでやってみました
再帰を抜けるのに条件分岐が必要になってしまうのでselectせざるを得なかったのが残念

※ 致命的なバグがあったので直しました、足すのにorしちゃだめだった
  ついでにきもちわるい配列変数を使った

No.4860 2017/12/19(Tue) 15:22:12

Re: 縛りありfizzbuzz / satocha
+*-/禁止にしておけば計算できまい、と思っていた私が愚かでした。
calcarrayはよく考えると、すごい機能ですね。
引き算はビット演算で補数を足すというのは、なるほどですが(そういえば昔Z80でそんなことやってたかも)、
互除法も最後の判定をそう書くのかと、驚いています。

一言、まいりました。

No.4874 2017/12/20(Wed) 16:47:38

Re: 縛りありfizzbuzz / 森
ご無沙汰しております。
分りやすいロジックだけど王道ではないものが書けたらなあと。
せめて IF文は無しにしたかったのですが、すぐには思い付かなかったです(´;ω;`)ウゥゥ
追加の縛りはありません。

2017/12/21 16:40
IF文無しでいける方法を思いついたので一部修正しました!

// fizzbuzz .uws
// ---------------------------------------
public one = getid("fizzbuzz .uws")
public flag , counter , num , fizz , buzz

thread sub_fizz()
thread sub_buzz()
thread sub_num()

while one
 repeat
  sleep(one)
 until flag = "num_ok"
 print fizz + buzz + num
 flag = ""
wend

// 3ごとに"fizz"を出力
procedure sub_fizz()
 while one
  for i = one to (one + one)
   repeat
    sleep(one)
   until flag = ""
   fizz = ""
   flag = "fizz_ok"
  next
  repeat
   sleep(one)
  until flag = ""
  fizz = "fizz"
  flag = "fizz_ok"
 wend
fend

// 5ごとに"buzz"を出力
procedure sub_buzz()
 while one
  for i = one to (one + one + one + one)
   repeat
    sleep(one)
   until flag = "fizz_ok"
   buzz = ""
   flag = "buzz_ok"
  next
  repeat
   sleep(one)
  until flag = "fizz_ok"
  buzz = "buzz"
  flag = "buzz_ok"
 wend
fend

// "fizz"でも"buzz"でもないときに数字を出力
procedure sub_num()
 while one
  repeat
   sleep(one)
  until flag = "buzz_ok"
  counter = counter + one
  num = val(fizz + buzz + counter , "")
  flag = "num_ok"
 wend
fend

No.4878 2017/12/21(Thu) 15:19:03

Re: 縛りありfizzbuzz / stuncloud
thread…!?
コードをじっくり見てみましたけどわかったようなわからないような!
しかしそうかこれで3と5が数えられるのか…なるほどなー

脱帽です!

No.4880 2017/12/21(Thu) 18:30:22

Re: 縛りありfizzbuzz / satocha
>森様
コードを眺めるだけではさっぱり分かりませんでしたが、動かしてみて分かりました。

スレッド間の同期を取るだけで、個々のスレッドの処理内容を大幅に縮約できるのですね。
オートマトン理論とか関係あるのかな。
大掛かりなスクリプトを組むときなど使えそうです。勉強になりました。

No.4881 2017/12/22(Fri) 07:05:32

Re: 縛りありfizzbuzz / しゅん
森さん、素晴らしい。
sleep sort的なものですね。

まあでも、これが有用なのは限られたケースですね。
でも素晴らしい。
計算処理を電卓に投げるのもUWSCらしくて良いアイデアですが、個人的にはSleepで解決するのはツボですね。
最小単位をGETIDの動作特性を使うというのも密かなポイントですね。

No.4882 2017/12/22(Fri) 09:18:21

Re: 縛りありfizzbuzz / 森
stuncloudさん、しゅんさん
お二人から褒めていただけるとは!
ちょっと早いけど、最高のクリスマスプレゼントになりました(*´∀`*)
ありがとうございます!

satochaさん
独学だけのなんちゃってプログラマなので、理論なんてのはさっぱり分りませんが、
このロジックを閃いたときには、思わずニンマリしちゃいました!


初回投稿を見ていなかった方のために、IFをどうやって回避したのか書いておきます。

[修正前]
if fizz + buzz = ""
 num = counter
else
 num = ""
endif

[修正後]
num = val(fizz + buzz + counter , "")

No.4883 2017/12/22(Fri) 13:30:27


 過去ログ(〜2017/08/24)・検索ツール


以下のフォームに記事No.と投稿時のパスワードを入力すれば
投稿後に記事の編集や削除が行えます。
199/200件 [ ページ : << 1 ... 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 過去ログ ]