二乗オフ(可能な限り最小の四角に合わせる)


8

はじめに

これはパディングを必要とし、入力のデータタイプが不明であるため、Aのテキストよりも複雑です。

Dyalog Ltd.は毎年学生コンテストを開催しています。そこの課題は、優れた APLコードを作成することです。これは、今年の10番目の問題の言語に依存しない版です。

コンテストの元の作成者から、ここにこのチャレンジを投稿する明示的な許可があります。提供されたリンクをたどり、作者に連絡して確認してください

問題

与えられた文字列または数値リストを、入力のすべての要素を含む最小の正方形に再形成するプログラム/関数を記述し、必要に応じて追加の要素でパディングします。pad要素は、特定のデータ型のデフォルトのfill要素、または任意の1つの要素にする必要があります。正方形の要素は、それを平坦化すると入力データの元の順序が与えられるような順序でなければなりません(後続のパディング要素がある場合は、それも含みます)。

テストケース

[1,2,3,4]

[[1,2],
 [3,4]]

[1,2,3,4,5]

[[1,2,3],
 [4,5,0],
 [0,0,0]]

"Dyalog APL"

[["Dyal"],       [["D","y","a","l"],
 ["og A"],   or   ["o","g"," ","A"],
 ["PL  "],        ["P","L"," "," "],
 ["    "]]        [" "," "," "," "]]

[100]

[[100]]

[]

あなたの言語が空の行列に最も近いもの、例えば[]または[[]]



文字列と配列の両方を入力として処理できる必要がありますか?出力は改行を含む文字列にすることができますか?[100]の出力を[[1,0]、[0,0]]にしないでください。そうでない場合、[[100,1]、[2,0]]は入力[100,1,2]の予想される出力ですか?
Shaggy

@Shaggyはい、数値リストと文字列/文字リスト(言語が使用するものは何でも)。デフォルトのルールごとに出力します。"100"は[["1"、0 "]、[" 0 "、" "]](または、fill要素が何であれ。はい、[100,1,2]→[[100,1]、[2 、0]]。
アダム

こんにちは、私は3つの質問があります... 1.「パッド要素は、指定されたデータ型または選択した任意の1つの要素のデフォルトのフィル要素であるべきです」とは何ですか。つまり、それは制限されているのか、それとも無料なのか(矛盾または冗長に見える)?2.のような入力の場合[1,2,3,4,'O']、出力はどうなるか、または発生しないことが保証されますか?3.要件を平坦化した後の必要な順序は、パッド要素を無視していますか(例:[1,2,3,4,5]歩留まりの入力[[0,0,0],[0,1,2],[3,4,5]]または[[0,1,0],[2,0,3],[0,4,5]]
ジョナサン・アラン

1
@JonathanAllan 1.一部の言語は自動的にパディングします。彼らが詰めるものは何でも結構です。そうでない場合は、要素を選択します。2. 文字列または数値リスト。3.パディング要素は末尾でなければなりません。
アダム

回答:


4

MATL12 9バイト

Luisのおかげで3バイト節約されました。heの代わりにUGwewet最初にa を追加します。

tnX^Xkthe

オンラインでお試しください!

これは結果を返しますが、OPポストの結果と比較して転置されています(これは問題ありません)。

説明:

MATLがそれらを同じ方法で処理するため、これは数値入力と文字列入力の両方で同じ方法で機能します。

入力が 'Dyalog APL'

                % Implicit: Take string or numeric array as input
                % Stack: 'Dyalog APL'
t               % Duplicate
                % Stack: 'Dyalog APL'
                %        'Dyalog APL'
 n              % Number of elements in last element. 
                % Stack: 'Dyalog APL'
                %        10
  X^            % Take the square root of the number of elements
                % Stack: 'Dyalog APL'
                % Stack: 3.16...
    Xk          % Ceil last number
                % Stack: 'Dyalog APL'
                %        4
      t         % Duplicate element
                % Stack: 'Dyalog APL'
                %        4
                %        4
       h        % Concatenate the last to elements horizontally
                % Stack: 'Dyalog APL'
                %        4  4
        e       % reshape into 4 rows, and 4 columns. Pads the input with zeros or spaces
                % if necessary.
                % Stack: (Note that there's a trailing column not shown below)
                %        DoP 
                %        ygL 
                %        a   
                %        lA  

これは空の入力に対しては何も出力しません。これはたまたまMATLが空の行列/文字列を出力する方法です。


空の入力に対して何を出力しますか?
アダム

これは空の入力に対しては何も出力しません。これはたまたまMATLが空の行列/文字列を出力する方法です。
Stewie Griffin

1
私が思うにtnX^Xkt3$e、あまりにも仕事をしていません
ルイス・Mendo

1
または、より良い方法tnX^Xkthe
Luis Mendo 2017年

1
@LuisMendo 3つの入力を渡す方法を探しましたがreshape、非常に明白なことに気づきませんでした$: Specified inputs。また、次元をベクトルとして渡すことができることを知りませんでした。2つの形を変える必要がない方法が必要だと私は知っていました。ありがとう!:)
Stewie Griffin

3

JavaScript(ES7)、70バイト

a=>[...Array((a.length-1)**.5+1|0)].map((_,$,b)=>b.map(_=>a[i++]),i=0)

[]空の配列/文字列を返します。undefined塗りつぶし値として使用します。ES6の場合(...)**.5Math.sqrt(...)(+ 5バイト)に置き換えます。


2

Brachylog、10バイト

;Ac~c.\l~l

オンラインでお試しください!

文字列を文字のリストとして受け取ります(質問者はこれが問題ないことを確認しています)。

これは、長い入力では非常に非効率的です。これは、入力が可能なすべての再形成をブルートフォースし、たまたま正方形になるものが見つかるまで、段階的に多くのパディングを試行するためです。

説明

;Ac~c.\l~l
;Ac         Append {the shortest list possible}.
   ~c       Split into a list of lists
      \l    such that it's rectangular, and the number of columns
     .  ~l  equals the number of rows

使用されるパディング要素は、Prologの「任意の値」の値_であり、通常は_G出力にいくつかのランダムな数字を加えてレンダリングされます(Prologエンジンがこれらの汎用値間の関係を表現できるようにするため)。

ちなみに、数日前にSWI-Prologにバグ修正があったため、このプログラムが可能になりました(ただし、古いバグのあるバージョンでは動作するようです)。によって暗示された「それは長方形である」制約\は以前は破られていましたが、課題に間に合うように修正されました。



1

PHP、139バイト

2D char配列としての文字列の出力

[]空の配列として機能します

$r=[];for($z=ceil(sqrt($n=(($b=is_array($g=$_GET[0]))?count:strlen)($g)));$c<$z*$z;$c++)$r[$c/$z^0][]=$c<$n?$g[+$c]:($b?0:" ");print_r($r);

オンラインでお試しください!

PHP、143バイト

[[]]空の配列として必要

文字列を1D文字列配列として出力

$z=ceil(sqrt((($b=is_array($g=$_GET[0]))?count:strlen)($g)));print_r($b?array_chunk(array_pad($g,$z**2,0),$z):str_split(str_pad($g,$z**2),$z));

オンラインでお試しください!


1

ゼリー、13 バイト

L½Ċẋ€`
0ṁ;@ṁÇ

フラットリストを取り、リストのリストを返すモナディックリンク。

オンラインでお試しください!

どうやって?

入力内の要素と同じ数のゼロ(パディング要素)を追加し、正方形に再形成して、プロセスの要件を超えるゼロを削除します。

L½Ċẋ€` - Link 1, create a square list of lists of the required size: list a
L      - length of a
 ½     - square root
  Ċ    - ceiling (the required side length, S)
     ` - repeat argument (S) for the dyadic operation:
   ẋ€  -   repeat list for €ach (implicit range [1,2,...,S] on both its left and right)
       -   note: if the input list has no length then an empty list is yielded here

0ṁ;@ṁÇ - Main link: list a (strings are lists of characters in Jelly)
0      - literal zero
 ṁ     - mould like a (makes a list of zeros of the same length as the flat list a)
  ;@   - concatenate a with that
     Ç - call the last link (1) as a monad with argument a
    ṁ  - mould the (possibly oversized) flat array with extra zeros like the square array

1

R、91バイト

function(x){if(!is.double(x))x=strsplit(x,'')[[1]];matrix(x,r<-ceiling(sqrt(length(x))),r)}

既定では、Rは入力ベクトルの要素をリサイクルすることによって行列をパディングし、行列を列優先でエンコードします。(空のdouble配列)またはの0x0入力に対して行列を返します。double(0)''

最初の行(ifステートメント)は、文字列をその構成文字のベクトルに分割します。代わりにそのベクトルを使用できる場合は、その行を削除できます。

オンラインでお試しください!


@JonathanAllanありがとう、修正しました。
ジュゼッペ


0

Haskell、87バイト

import Data.Lists
f x|c:_<-[n|n<-[1..],n^2>=length x]=take c$chunksOf c$x++(error[]<$x)

オンラインでお試しください!

fill要素はerror[]で、あらゆるタイプの中で最も短い値です(undefined少し長くなります)。

TIOリンクに関する注記:

  • あなたは印刷できないerrorので、私は行列をフィル要素と連結してリストに戻し、その長さを印刷します

  • TIOにはがないためData.ListsData.List.Splitさらに5バイトが表示されます。

仕組み:cc行c列の行列の長さを計算します。入力リストのc長さのチャンクのリストの最初の要素を取り、c次に入力リストと同じ長さのフィル要素のリストを取ります。例:

[1,2,3,4,5]                                        -- Input 
[1,2,3,4,5,error,error,error,error,error]          -- fill elements appended
[[1,2,3],[4,5,error],[error,error,error],[error]]  -- chunks of length 3
[[1,2,3],[4,5,error],[error,error,error]]          -- take 3

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.