Discuss Scratch
- inoking
-
Scratcher
1000+ posts
意外と知られていないテクニック集
#4860:
これにはちょっと解説が必要です。
「このクローンを削除する」ブロックは
クローンからでなく本体から実行した場合は
削除処理が実行されず、実質「何もしない」ブロックとなるため
その後の処理を続けられるという実装になっています。
https://github.com/scratchfoundation/scratch-vm/blob/develop/src/blocks/scratch3_control.js#L177
ブロックエディターの UI 上、「このクローンを削除する」の後にはブロックを置けないため
それを回避するのがこのテクニックですね。
ただ、「このクローンを削除する」の細かい動作を把握していないと理解できず、
可読性が落ちるうえ、仕様として未定義(と思われる)のため、あまりやらないほうがいいでしょう。
実際、例示されたプロジェクトは
増やした変数を減らして元に戻すといった回りくどい動作となっており、動作も理解しにくいです。
実運用では
「素直に」クローンかどうかで場合分けしてするほうがよいでしょう。
または、以下のようにコメントを付加するか。
これにはちょっと解説が必要です。
「このクローンを削除する」ブロックは
クローンからでなく本体から実行した場合は
削除処理が実行されず、実質「何もしない」ブロックとなるため
その後の処理を続けられるという実装になっています。
https://github.com/scratchfoundation/scratch-vm/blob/develop/src/blocks/scratch3_control.js#L177
deleteClone (args, util) { if (util.target.isOriginal) return; this.runtime.disposeTarget(util.target); this.runtime.stopForTarget(util.target); }
それを回避するのがこのテクニックですね。
ただ、「このクローンを削除する」の細かい動作を把握していないと理解できず、
可読性が落ちるうえ、仕様として未定義(と思われる)のため、あまりやらないほうがいいでしょう。
実際、例示されたプロジェクトは
増やした変数を減らして元に戻すといった回りくどい動作となっており、動作も理解しにくいです。
実運用では
「素直に」クローンかどうかで場合分けしてするほうがよいでしょう。
または、以下のようにコメントを付加するか。
もし<>なら
else
...
このクローンを削除する//本体の場合は何もしない
end
Last edited by inoking (Aug. 6, 2026 03:19:57)
- gccxnondx
-
Scratcher
100+ posts
意外と知られていないテクニック集
乱数を2~8,15~20のように真ん中を飛ばして実装したい場合。
まずリストを作って飛ばしたい数字を入れる。(今回の場合9,10,11,12,13,14を入れる)
次に変数を用意する。
そしてこんなのを作る。
↓大嘘です。ブロックのとこだけ2つ下の投稿を見てください。
リストに入れる数字を(5,6,9,10,15)とかにすると、飛ばす箇所を増やすこともできる。
まずリストを作って飛ばしたい数字を入れる。(今回の場合9,10,11,12,13,14を入れる)
次に変数を用意する。
そしてこんなのを作る。
↓大嘘です。ブロックのとこだけ2つ下の投稿を見てください。
<<(リスト :: list) = (変数)>ではない> まで繰り返すそうすると変数は(今回の場合)9~14が現れない。
[変数 v] を ((2)から(20)までの乱数) にする
end
リストに入れる数字を(5,6,9,10,15)とかにすると、飛ばす箇所を増やすこともできる。
Last edited by gccxnondx (Aug. 8, 2026 12:55:44)
- kouryou118103
-
Scratcher
1000+ posts
意外と知られていないテクニック集
#4862
リストに出したい数字を入れて
意図を取り違えていたらすみません。
乱数を2~8,15~20のように真ん中を飛ばして実装したい場合。
まずリストを作って飛ばしたい数字を入れる。(今回の場合9,10,11,12,13,14を入れる)
次に変数を用意する。
そしてこんなのを作る。<<(リスト :: list) = (変数)>ではない> まで繰り返すそうすると変数は(今回の場合)9~14が現れない。
[変数 v] を ((2)から(20)までの乱数) にする
end
リストに入れる数字を(5,6,9,10,15)とかにすると、飛ばす箇所を増やすこともできる。
(リスト::list)は“5 6 9 10 15”になっていて変数と一致することがなく書かれている通りに動かないように感じます。
リストに出したい数字を入れて
([リスト v]の((1)から([リスト v]の長さ::list)までの乱数)番目)と組むと良いと思います。
意図を取り違えていたらすみません。
Last edited by kouryou118103 (Aug. 8, 2026 12:26:36)
- gccxnondx
-
Scratcher
100+ posts
意外と知られていないテクニック集
あ、間違えてました。#4862の情報の修正をします。というか何で一番肝心なとこミスってんだ自分
<<[リスト v]に(変数)が含まれる>ではない> まで繰り返すブロックのやつはこれです。完全な凡ミスでした。#4863のおかげで気づけました。ありがとうございます。
[変数 v] を ((2)から(20)までの乱数) にする
end
- Tanbon316
-
Scratcher
33 posts
意外と知られていないテクニック集
追記:「#1の」
「意外と知られていないテクニック集」なのに「どんなに常識のことであっても、必ずだれかの役には立ちます。」はおかしいと思います。
⑶「それは常識」「当たり前」などのコメントを他人にするのはお控えください。どんなに常識のことであっても、必ずだれかの役には立ちます。それならば、トピック名を単に「テクニック集」や「便利なテクニック集」にすればいいと思います
「意外と知られていないテクニック集」なのに「どんなに常識のことであっても、必ずだれかの役には立ちます。」はおかしいと思います。
Last edited by Tanbon316 (Aug. 22, 2026 05:25:35)
- inoking
-
Scratcher
1000+ posts
意外と知られていないテクニック集
追記:「#1の」ちょっと矛盾したタイトルではありますが⑶「それは常識」「当たり前」などのコメントを他人にするのはお控えください。どんなに常識のことであっても、必ずだれかの役には立ちます。それならば、トピック名を単に「テクニック集」や「便利なテクニック集」にすればいいと思います
「意外と知られていないテクニック集」なのに「どんなに常識のことであっても、必ずだれかの役には立ちます。」はおかしいと思います。
9年前の空気感で作られたトピックに対して
今さら指摘するようなことでもないかと思います。
「意外と知られていない」は主観により変わります。
「常識」も厳密には定義されていません。
人によっては、ここに書かれることすべて「常識」という人もいます。
あくまで、広く門戸を開こうという考えだと思います。
※重複する内容などは別です
- stemon-harutoy
-
Scratcher
21 posts
意外と知られていないテクニック集
知ってる人も多いと多もいますが、エンターキーを判定する方法
if (join [enter] []) then
end
- Yukidaruma14
-
Scratcher
18 posts
意外と知られていないテクニック集
知ってる人も多いと多もいますが、エンターキーを判定する方法ひらがなでも出来ますよif (join [enter] []) then
end
もし([enter]と())なら
end
- s1nonome
-
Scratcher
34 posts
意外と知られていないテクニック集
そこまで根を詰めて考えることでもないと思います。
ちなみに、「常識」は そこまで絶対的なものではありません。海外では麺をすすらなかったり、家の中でも土足だったりするのが常識です。
トピック名や#1の修正案も、今の内容と大差ないと思います。加えて、Tanbon316(追記:今気づきましたが「さん」が抜けていました)のおっしゃる通り、トピ主さんが活動している様子が見られないので編集できるかどうかもわかりません。
今は9年前の空気感ではないので、指摘してもいいと思います。現行のルール等と矛盾するものは修正するのが望ましいですが、今度の件に関してはそういった実害のあるものではないでしょう。このトピック名のせいで何か問題が起こっているようには思えません。
ちなみに、「常識」は そこまで絶対的なものではありません。海外では麺をすすらなかったり、家の中でも土足だったりするのが常識です。
トピック名や#1の修正案も、今の内容と大差ないと思います。加えて、Tanbon316(追記:今気づきましたが「さん」が抜けていました)のおっしゃる通り、トピ主さんが活動している様子が見られないので編集できるかどうかもわかりません。
Last edited by s1nonome (Aug. 26, 2026 05:41:43)
- eakonn705
-
Scratcher
19 posts
意外と知られていないテクニック集
リストに数値を入れて保存するのと、変数に数値を入れるのでは
変数に入れるほうが多く保存できます
あとリストや文字列の処理はかなり重いので、
できる限り避けるほうが、最終的なスケールアップのために良いです
アスキー文字(アルファベットや記号など)以外の漢字などは、
アスキー文字2文字分の容量を食うので、データ圧縮で使う際は注意です
変数に入れるほうが多く保存できます
あとリストや文字列の処理はかなり重いので、
できる限り避けるほうが、最終的なスケールアップのために良いです
アスキー文字(アルファベットや記号など)以外の漢字などは、
アスキー文字2文字分の容量を食うので、データ圧縮で使う際は注意です
- inoking
-
Scratcher
1000+ posts
意外と知られていないテクニック集
アスキー文字(アルファベットや記号など)以外の漢字などは、細かいですが、、
アスキー文字2文字分の容量を食うので、データ圧縮で使う際は注意です
漢字は UTF‑8 で3バイト以上です。
つまり、アスキー文字3か4文字分です。
- newmomizi_txt
-
Scratcher
1000+ posts
意外と知られていないテクニック集
データを文字に置き換える圧縮については、qntm氏の資料が参考になります。
https://github.com/qntm/base2048
容量あたり表現量が最大になるのは、UTF-8の場合、Base85のようです。
Base85とは、基本Asciiコードのうち、印字可能な文字85種類のみを用いたデータ表記です。必ず1文字1バイトであるため、文字列1バイトあたり6.41bitの表現になります。
また、漢字などのマルチバイト文字を用いた場合、むしろ効率は低下します。
https://github.com/qntm/base2048
容量あたり表現量が最大になるのは、UTF-8の場合、Base85のようです。
Base85とは、基本Asciiコードのうち、印字可能な文字85種類のみを用いたデータ表記です。必ず1文字1バイトであるため、文字列1バイトあたり6.41bitの表現になります。
また、漢字などのマルチバイト文字を用いた場合、むしろ効率は低下します。
- battori1010
-
Scratcher
1 post
意外と知られていないテクニック集
ごく当たり前のことですが、リストの中の特定の1つだけを消したい場合は
「リストの(〜)の場所 番目を削除する」にするとその特定の1つだけを消すことができます。
わかりにくくてすみません。
私は初心者なので間違っている部分があるかもしれません…
「リストの(〜)の場所 番目を削除する」にするとその特定の1つだけを消すことができます。
わかりにくくてすみません。
私は初心者なので間違っている部分があるかもしれません…
- Yukidaruma14
-
Scratcher
18 posts
意外と知られていないテクニック集
ごく当たり前のことですが、リストの中の特定の1つだけを消したい場合は
「リストの(〜)の場所 番目を削除する」にするとその特定の1つだけを消すことができます。
わかりにくくてすみません。
私は初心者なので間違っている部分があるかもしれません…
[リスト v]の([リスト v]中の[〜]の場所)番目を削除するということだと思います。
- ie_523
-
Scratcher
100+ posts
意外と知られていないテクニック集
#4874、#4875
それだと、リストの一番上のものしか削除できないので、
それだと、リストの一番上のものしか削除できないので、
<<[リスト v]に[~]が含まれる>ではない>まで繰り返すとすればいいと思います。
[リスト v]の([リスト v] 中の[~]の場所)番目を削除する
end
Last edited by ie_523 (Aug. 31, 2026 07:13:19)
- Catapult-
-
Scratcher
100+ posts
意外と知られていないテクニック集
#4873
エスケープとかをもっと考慮してみました。
UTF-8で1バイトにエンコードされるU+0000~U+007Fまでの128文字のうち、JSON中でエスケープが必須なU+0000~U+001F、ダブルクォーテーション中でエスケープが必須なU+0022(")、U+005C(\)を除けば94文字ある(U+007Fは制御文字だがエスケープ不要)ので、理論的には文字列1バイト当たりlog₂94≈6.55bitを記録できそうですね。Base64のように適当なブロックで切るなら例えば2¹³<94²を利用して文字列1バイト当たり6.5bitを記録できます。もっと理論値に近づけたければlog₂94の連分数展開を適当なところで止めてブロックを大きくするか、任意精度演算を実装して進数変換するとかになりそうです。
エスケープとかをもっと考慮してみました。
UTF-8で1バイトにエンコードされるU+0000~U+007Fまでの128文字のうち、JSON中でエスケープが必須なU+0000~U+001F、ダブルクォーテーション中でエスケープが必須なU+0022(")、U+005C(\)を除けば94文字ある(U+007Fは制御文字だがエスケープ不要)ので、理論的には文字列1バイト当たりlog₂94≈6.55bitを記録できそうですね。Base64のように適当なブロックで切るなら例えば2¹³<94²を利用して文字列1バイト当たり6.5bitを記録できます。もっと理論値に近づけたければlog₂94の連分数展開を適当なところで止めてブロックを大きくするか、任意精度演算を実装して進数変換するとかになりそうです。