バックグラウンド
Adaは、その簡潔さで正確に知られているわけではないプログラミング言語です。
ただし、その配列リテラル構文では、理論的にはかなり簡潔な配列指定が可能です。以下は、配列リテラル 構文の簡単なEBNF記述です(bottlecaps.deに渡すことができます:
array ::= positional_array | named_array
positional_array ::= expression ',' expression (',' expression)*
| expression (',' expression)* ',' 'others' '=>' expression
named_array ::= component_association (',' component_association)*
component_association ::= discrete_choice_list '=>' expression
discrete_choice_list ::= discrete_choice ('|' discrete_choice)*
discrete_choice ::= expression ('..' expression)? | 'others'
簡単にするために、整数の1次元配列に限定します。つまり、式の値には整数のみを使用します。おそらく、将来の課題で、より高度なもの(変数や多次元配列の宣言など)を試すことができます。整数リテラルを使用する必要はありません。
わかりやすくするために、Ada配列リテラルとpython-esqueの同等の表現の例をいくつか示します。
(1, 2, 3) = [1, 2, 3]
(1, others => 2) = [1, 2, 2, ..., 2]
(others => 1) = [1, 1, ..., 1]
(1 => 1, 2 => 3) = [1, 3]
(1|2 => 1, 3 => 2) = [1, 1, 2]
(1 => 1, 3 => 2, others => 3) = [1, 3, 2, 3, 3, ..., 3]
チャレンジ
この課題の目標は、指定された入力配列の最短バイト数のAda配列リテラルを出力することです。Ada配列は任意のインデックスから開始できるため、各値がシーケンシャルである限り、開始インデックスを希望するものから選択できます。この例では、Adaの慣用句である1から開始することを選択していますが、他の整数から開始することもできます。
入力
入力は、都合のよい形式の整数のリストで構成されます。
出力
出力は、入力整数のリストを表す最短の有効なAda配列リテラルを表すテキスト文字列になります。この配列で任意の開始インデックスを使用できますが、選択内容(それが何であれ)を回答で指定する必要があります(開始インデックスも動的である場合があります)。
整数は、例のように、符号付き10進数として表されます。この課題は、整数値のゴルフをカバーしていません。
例
ここではいくつかの例を示します。
Simple: [1, 2, 3] -> (1,2,3)
Range: [1, 1, 1, 1, 1, 1, 1,] -> (1..7=>1)
Others: [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1] -> (6=>2,others=>1)
Multiple Ranges: [1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1] -> (6..10|16..20=>2,others=>1)
Tiny Ranges: [1,1,2,2,1,1,1,1,1] -> (3|4=>2,others=>1)
Far Range: [[1]*5, [2]*100, [3]*5] -> (1..5=>1,6..105=>2,others=>3)
Alternation: [1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2] -> (1|3|5|7|9|11|13|15|17=>1,others=>2)
Big Number: [1234567890,1,1234567890] -> (2=>1,1|3=>1234567890)
Big-ish Number: [1234567,1,1234567] -> (1234567,1,1234567)
Solo: [-1] -> (1=>-1)
Huge Input: [[0],[1]*1000000000] -> (0,others=>1)
Positional Others: [1, 2, 3, 3, 3, 3, 3, 3] -> (1,2,others=>3)
Range and Choice, no Others: [1,1,1,12,12,3,3,3,3,3,3,3,3,3,3,4] -> (1..3=>1,4|5=>12,6..15=>3,16=>4)
最小要件
少なくとも100個の数字と、長さが256個以上の数字の入力をサポートします。
そのようなすべての入力に対して正しい結果を生成する
- 最後に「その他」を置くことを含む
- 単一の項目配列のインデックスを配置することを含みます
上記の各入力を(できればTIOで)1分以内に終了します。
バイト単位の最短のソリューションが勝ちます!
リファレンス実装
この実装では、入力を配列として使用し、各文字を数値にします。大文字は大きな値のための特別な定数です。プログラム引数は、使用する「開始インデックス」です。
TIOリンクの「コード」セクションは問題の正しい解決策ですが、「ヘッダー」と「フッター」はテスト構造を実装しています。
106..110=>3,others=>2
長くなります)文法では単一要素の位置配列(positional_array ::= expression ',' expression (',' expression)*
)が許可されていないため、最後のケースにはインデックスが必要です
(1|3=>1234567,2=>1)
別の有効な出力であることを確認してください[1234567,1,1234567]
。
(-1)
か?