Open11

Uiuaで色々やる

ksakaiksakai

まとめ

公式

https://www.uiua.org/
だいたい大事なことは全部ここに書いてある

みんな大好きFizzBuzz

処理の思考イメージ

MatchEmpty ← ≍ ""
ModThree ← = 0 ◿ 3
ModFive ← = 0 ◿ 5

FizzStr ← (""|"fizz")ModThree
BuzzStr ← (""|"buzz")ModFive
FizzBuzzStr ← ⊂⊃FizzStr BuzzStr

FizzBuzz ← (;:|;)MatchEmpty.FizzBuzzStr.

;⍥(+1:FizzBuzz.)15 1

各種ワンライナー化

スタックに貯めるだけ(&pを知らなんだ)

;⍥(+1:(;:|;)≍"".⊂⊃((""|"fizz")=◿3:0)((""|"buzz")=◿5:0)..)15 1

標準出力①

;⍥(+1;&p(∘|:)≍"".⊂⊃((""|"fizz")=◿3:0)((""|"buzz")=◿5:0)..)15 1

標準出力②(↑で似た表現多いなーとおもったのでまとめれないか試したやつ)

;⍥(+1;&p(∘|:)≍"".♭▽:["fizz""buzz"]⊟∩(=⊙◿0)⊙,3 5..)15 1

Associative Array ぽいやつ

⌕がO(n)の香りあるので早くはない。

[KeyのBox配列 ValyeのBox配列]でデータ構造を持って、Key探してindex取ってきて、対応するValue配列に当てにいくイメージでとりあえず素朴に?実装。

AssociativeArray ← [
  {"key" "hoge" "fuga" "piyo"}

  {"value" 1 [{}{}] []}
]
PushAttr ← ⊔⊡:⊢⇌,⊙⍤:"KeyError"⊙≠.⊙⧻⊗1.⌕□:⊙:⊢.:

PushAttr "fuga" AssociativeArray
PushAttr "NotFound" AssociativeArray

JSON Parserの残骸

残骸、エラーメッセージ地味に頑張ってるの我ながら草。
そもそもObjectLikeなデータモデルがねえとなって一旦休憩中なのである。
⊙.⊙:⊙⊙:⊙⊙⊙:ここらへん地獄なのでなんとかしたい。

EatError ← $"Got unexpected value.\nActual: _\nExpected: _"
ParseKeywordError ← $"Got unexpected Keyword.\nActual: _\nExpected: _"

AbstractEat ← ↘1⍤EatError ⊙⊙=,,⊢,
AbstractParseKeyword ← :↘:⍤ParseKeywordError⊙⊙≍,,⊙:⊙⊙:↙⊙.⊙:⊙⊙:⊙⊙⊙:.⧻.

SkipWhiteSpace ← ⍢((∘|↘1)=@ ⊢.)(=@ ⊢)

EatComma ← AbstractEat @,
EatColon ← AbstractEat @:

ParseTrue ← AbstractParseKeyword "true" 1
ParseFalse ← AbstractParseKeyword "false" 0
ParseNull ← AbstractParseKeyword "null" 0 # ホンマか?

Tutorials回答案

Page No. Answer 所感
basic 1 ++
basic 2 ÷,, , が2項演算の元データを残すのに地味に便利だと教えてくれる
basic 3 ×.-
math 1 ×+
math 2 √+×.:×. flipで2乗を適用する
math 2 √+∩(×.) 未来の知識を使うとbothで1つの演算を2つに与えられるのでスッキリする
arrays 1 +⇌. 配列の2項演算は各indexで行われる
arrays 2 ↯:0⊟ ここ地味に即答できない
arrays 3 ¤ 定義通り
arrays 4 ⊂⊢
arrays 5 ⊢:↘1. 一回コピーして、取るのと落とすので分けて処理
arrays 5 ⊃⊢(↘1) 未来の知識 fork で1つの値に2つの関数を当てられる、便利
arrays 6 ⊟∩□ 想定解じゃない気がする
types 1 --@A@a いくつか覚えていないので計算で出す人、ちなみに32。
types 1 ⊂:↘1:+1⊢. Flipで素朴に
types 2 ⊂⊃(+1⊢)(↘1) Fork Join は良い文明かも、FizzBuzzでも使った
functions 1 /×+1⇡ それっぽい
functions 2 ≡/+ rowsが出てこなくて結構悩んだ。
functions 3 $"[_]"
advancedstack 1 :⊙:⊙⊙: 素朴?な実装、ホンマか???
advancedstack 2 ÷⊙+ 素直に便利
advancedstack 3 ⊃(++)(××) 直近2つじゃなくてもforkは便利
advancedstack 4 ×⊃(+⊙⋅⊙;)(+⋅⊙⋅∘) Planet Notationの練習、末尾のid <-> popがぱっとでてこなかった。
controlflow 1 (("large"pipe"medium")pipe"small")⊃(<10)(<100) pipeは読み替えてください、テーブル壊れる
controlflow 2 ⍢(×⇌.)(/↥<1000) 上手めなきがする
ksakaiksakai
ParseKeywordError ← $"Got unexpected Keyword.\nActual: _\nExpected: _"
AbstractParseKeyword ← :↘:⍤ParseKeywordError⊙⊙≍,,⊙:⊙⊙:↙⊙.⊙:⊙⊙:⊙⊙⊙:.⧻.
ParseKeyword ← AbstractParseKeyword "true" 1


ParseKeyword "truefalse"
ParseKeyword "falsetrue"

"truefalse"
"true" 1
.⧻.
⊙:⊙⊙:⊙⊙⊙:
↙⊙.
⊙:⊙⊙:
:↘:⍤"unexpected keyword" ≍
ksakaiksakai

KeyError追加

AssociativeArray ← [
  {"key" "hoge" "fuga" "piyo"}

  {"value" 1 [{}{}] []}
]
PushAttr ← ⊔⊏:⊢⇌,⊙⍤:"Err"⊙≠.⊙⧻⊗1.⌕□:⊙:⊢.:
ksakaiksakai

⊙.⊙:⊙⊙:⊙⊙⊙:ここらへん地獄なのでなんとかしたい。

処理中の変数はBoxArrayにでも入れとけばunbox pickで取れて楽だったりするか?

ksakaiksakai

Trim leading whitespace

▽\↥≠@ . "   ← remove these"

これめっちゃおもろいな。一旦全部舐めちゃって、Keepで落とす。
ワイのと比べて「ひとつずつ見ていく」処理じゃない文スッキリ度が高い

ksakaiksakai

そういやせっかく解いたし、Tutorialの回答もメモっとくか、成長したらきれいになるかもしれない