Discuss Scratch

inoking
Scratcher
1000+ posts

意外と知られていないテクニック集

#4860:
これにはちょっと解説が必要です。
「このクローンを削除する」ブロックは
クローンからでなく本体から実行した場合
削除処理が実行されず、実質「何もしない」ブロックとなるため
その後の処理を続けられるという実装になっています。
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);
    }
ブロックエディターの UI 上、「このクローンを削除する」の後にはブロックを置けないため
それを回避するのがこのテクニックですね。

ただ、「このクローンを削除する」の細かい動作を把握していないと理解できず、
可読性が落ちるうえ、仕様として未定義(と思われる)のため、あまりやらないほうがいいでしょう。

実際、例示されたプロジェクト
増やした変数を減らして元に戻すといった回りくどい動作となっており、動作も理解しにくいです。

実運用では
「素直に」クローンかどうかで場合分けしてするほうがよいでしょう。
または、以下のようにコメントを付加するか。
もし<>なら
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つ下の投稿を見てください。
<<(リスト :: list) = (変数)>ではない> まで繰り返す
[変数 v] を ((2)から(20)までの乱数) にする
end
そうすると変数は(今回の場合)9~14が現れない。
リストに入れる数字を(5,6,9,10,15)とかにすると、飛ばす箇所を増やすこともできる。

Last edited by gccxnondx (Aug. 8, 2026 12:55:44)

kouryou118103
Scratcher
1000+ posts

意外と知られていないテクニック集

#4862

gccxnondx wrote:

乱数を2~8,15~20のように真ん中を飛ばして実装したい場合。
まずリストを作って飛ばしたい数字を入れる。(今回の場合9,10,11,12,13,14を入れる)
次に変数を用意する。
そしてこんなのを作る。
<<(リスト :: list) = (変数)>ではない> まで繰り返す
[変数 v] を ((2)から(20)までの乱数) にする
end
そうすると変数は(今回の場合)9~14が現れない。
リストに入れる数字を(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]に(変数)が含まれる>ではない> まで繰り返す
[変数 v] を ((2)から(20)までの乱数) にする
end
ブロックのやつはこれです。完全な凡ミスでした。#4863のおかげで気づけました。ありがとうございます。
Tanbon316
Scratcher
33 posts

意外と知られていないテクニック集

追記:「#1の」

fine316 wrote:

⑶「それは常識」「当たり前」などのコメントを他人にするのはお控えください。どんなに常識のことであっても、必ずだれかの役には立ちます。
それならば、トピック名を単に「テクニック集」や「便利なテクニック集」にすればいいと思います
意外と知られていないテクニック集」なのに「どんなに常識のことであっても、必ずだれかの役には立ちます。」はおかしいと思います。

Last edited by Tanbon316 (Aug. 22, 2026 05:25:35)

inoking
Scratcher
1000+ posts

意外と知られていないテクニック集

Tanbon316 wrote:

追記:「#1の」

fine316 wrote:

⑶「それは常識」「当たり前」などのコメントを他人にするのはお控えください。どんなに常識のことであっても、必ずだれかの役には立ちます。
それならば、トピック名を単に「テクニック集」や「便利なテクニック集」にすればいいと思います
意外と知られていないテクニック集」なのに「どんなに常識のことであっても、必ずだれかの役には立ちます。」はおかしいと思います。
ちょっと矛盾したタイトルではありますが
9年前の空気感で作られたトピックに対して
今さら指摘するようなことでもないかと思います。

「意外と知られていない」は主観により変わります。
「常識」も厳密には定義されていません。
人によっては、ここに書かれることすべて「常識」という人もいます。

あくまで、広く門戸を開こうという考えだと思います。
※重複する内容などは別です
stemon-harutoy
Scratcher
21 posts

意外と知られていないテクニック集

知ってる人も多いと多もいますが、エンターキーを判定する方法
if (join [enter] []) then

end
Yukidaruma14
Scratcher
18 posts

意外と知られていないテクニック集

stemon-harutoy wrote:

知ってる人も多いと多もいますが、エンターキーを判定する方法
if (join [enter] []) then

end
ひらがなでも出来ますよ

もし([enter]と())なら
end
Tanbon316
Scratcher
33 posts

意外と知られていないテクニック集

もし <( [enter]と[]) キーが押された> なら
end
正しくはこうです
s1nonome
Scratcher
34 posts

意外と知られていないテクニック集

そこまで根を詰めて考えることでもないと思います。
今は9年前の空気感ではないので、指摘してもいいと思います。
現行のルール等と矛盾するものは修正するのが望ましいですが、今度の件に関してはそういった実害のあるものではないでしょう。このトピック名のせいで何か問題が起こっているようには思えません。

ちなみに、「常識」は そこまで絶対的なものではありません。海外では麺をすすらなかったり、家の中でも土足だったりするのが常識です。

トピック名や#1の修正案も、今の内容と大差ないと思います。加えて、Tanbon316(追記:今気づきましたが「さん」が抜けていました)のおっしゃる通り、トピ主さんが活動している様子が見られないので編集できるかどうかもわかりません。

Last edited by s1nonome (Aug. 26, 2026 05:41:43)

eakonn705
Scratcher
19 posts

意外と知られていないテクニック集

リストに数値を入れて保存するのと、変数に数値を入れるのでは
変数に入れるほうが多く保存できます

あとリストや文字列の処理はかなり重いので、
できる限り避けるほうが、最終的なスケールアップのために良いです

アスキー文字(アルファベットや記号など)以外の漢字などは、
アスキー文字2文字分の容量を食うので、データ圧縮で使う際は注意です
inoking
Scratcher
1000+ posts

意外と知られていないテクニック集

eakonn705 wrote:

アスキー文字(アルファベットや記号など)以外の漢字などは、
アスキー文字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の表現になります。

また、漢字などのマルチバイト文字を用いた場合、むしろ効率は低下します。
battori1010
Scratcher
1 post

意外と知られていないテクニック集

ごく当たり前のことですが、リストの中の特定の1つだけを消したい場合は
「リストの(〜)の場所 番目を削除する」にするとその特定の1つだけを消すことができます。

わかりにくくてすみません。
私は初心者なので間違っている部分があるかもしれません…
Yukidaruma14
Scratcher
18 posts

意外と知られていないテクニック集

battori1010 wrote:

ごく当たり前のことですが、リストの中の特定の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の連分数展開を適当なところで止めてブロックを大きくするか、任意精度演算を実装して進数変換するとかになりそうです。
KESIPINNZUKI
Scratcher
6 posts

意外と知られていないテクニック集

エンターキーが押されたときにバニラでも作れる方法ある?
s1nonome
Scratcher
34 posts

意外と知られていないテクニック集

< ( [enter] と []) キーが押された>
で検知可能なのを確認しました。

なお、#1より
⑴質問だけなら書かないでください。(質問コーナーへお願いします)もちろん、他の人が書いたものについての質問は構いません。
ですので、次回からプログラムに関する質問は質問コーナーで行っていただけると助かります。
KESIPINNZUKI
Scratcher
6 posts

意外と知られていないテクニック集

教えていただきありがとうございます!

Powered by DjangoBB