Squaring Off (cocok untuk kotak terkecil yang mungkin)

8

Intro

Lebih kompleks daripada Sekotak teks karena ini membutuhkan padding dan input memiliki tipe data yang tidak diketahui.

Setiap tahun, Dyalog Ltd. mengadakan kompetisi siswa. Tantangannya adalah untuk menulis kode APL yang baik . Ini adalah edisi bahasa agnostik dari masalah kesepuluh tahun ini.

Saya memiliki izin eksplisit untuk mengirimkan tantangan ini di sini dari penulis asli kompetisi. Jangan ragu untuk memverifikasi dengan mengikuti tautan yang disediakan dan menghubungi penulis.

Masalah

Tulis program / fungsi yang akan membentuk kembali string atau daftar numerik yang diberikan ke dalam kotak terkecil yang akan berisi semua elemen input, padding dengan elemen tambahan jika perlu. Elemen pad harus elemen isi default untuk tipe data yang diberikan, atau salah satu elemen pilihan Anda. Elemen-elemen bujur sangkar harus dalam urutan sedemikian rupa sehingga meratakannya akan memberikan urutan asli dari data input (dengan elemen bantalan tambahan, jika ada).

Uji kasus

[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]]

[]

setara dengan bahasa Anda yang terdekat dengan matriks kosong, misalnya []atau[[]]


Adm
sumber
Apakah kita harus mampu menangani kedua string dan array sebagai masukan atau hanya satu? Bisakah output menjadi string yang berisi baris baru? Haruskah output untuk [100] tidak menjadi [[1,0], [0,0]]? Jika tidak, apakah [[100,1], [2,0]] output yang diharapkan untuk input [100,1,2]?
Shaggy
@Shaggy Ya, daftar angka dan string / daftar karakter (apa pun yang digunakan bahasa Anda). Output per aturan default. "100" memberi [["1", 0 "], [" 0 "," "]] (atau apa pun elemen isiannya. Ya, [100,1,2] → [[100,1], [2 , 0]].
Adám
Halo Adm, saya punya tiga pertanyaan ... 1. Apa yang dimaksud "Elemen pad harus menjadi elemen isian default untuk tipe data yang diberikan, atau salah satu elemen pilihan Anda." maksudnya, - apakah dibatasi atau gratis (tampaknya kontradiktif atau berlebihan)? 2. Seperti apa seharusnya output untuk input [1,2,3,4,'O'], atau apakah dijamin tidak terjadi? 3. Apakah pesanan yang diperlukan setelah persyaratan perataan mengabaikan elemen pad (mis. Dapatkah input [1,2,3,4,5]hasil [[0,0,0],[0,1,2],[3,4,5]]atau bahkan [[0,1,0],[2,0,3],[0,4,5]])?
Jonathan Allan
1
@ JonathanAllan 1. Beberapa bahasa akan otomatis pad. Apa pun yang mereka pad dengan baik-baik saja. Jika tidak, pilih elemen. 2. string atau daftar angka . 3. Elemen padding harus mengikuti.
Adám

Jawaban:

4

MATL , 12 9 byte

Disimpan tiga byte berkat Luis. hebukannya UGwewe, tetapi menambahkan tdi awal.

tnX^Xkthe

Cobalah online!

Ini mengembalikan hasil, tetapi ditransposisikan dibandingkan dengan hasil di pos OPs (yang OK).

Penjelasan:

Ini bekerja dengan cara yang sama untuk input numerik dan string, karena MATL memperlakukannya dengan cara yang sama.

Asumsikan inputnya adalah '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  

Ini tidak menghasilkan apa-apa untuk input kosong, yang kebetulan merupakan cara MATL mengeluarkan matriks / string kosong.

Stewie Griffin
sumber
Apa yang dihasilkannya untuk input kosong?
Adám
Ini tidak menghasilkan apa-apa untuk input kosong, yang kebetulan merupakan cara MATL mengeluarkan matriks / string kosong.
Stewie Griffin
1
Saya pikir tnX^Xkt3$eitu juga berhasil
Luis Mendo
1
Atau, lebih baik,tnX^Xkthe
Luis Mendo
1
@LuisMendo saya mencari cara untuk lulus tiga input untuk reshapedan tidak melihat sangat jelas: $: Specified inputs. Dan saya tidak tahu Anda bisa melewatkan dimensi sebagai vektor. Saya tahu harus ada jalan tanpa harus melalui dua bentuk ulang. Terima kasih! :)
Stewie Griffin
3

JavaScript (ES7), 70 byte

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

Mengembalikan []untuk array / string kosong. Digunakan undefinedsebagai nilai isi. Untuk ES6 ganti (...)**.5dengan Math.sqrt(...)(+5 byte).

Neil
sumber
2

Brachylog , 10 byte

;Ac~c.\l~l

Cobalah online!

Mengambil string sebagai daftar karakter (penanya telah mengkonfirmasi bahwa ini OK).

Ini sangat tidak efisien pada input yang lebih lama, karena brute-force semua kemungkinan pembentukan kembali input, mencoba semakin banyak padding, sampai menemukan yang kebetulan persegi.

Penjelasan

;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

Elemen padding yang digunakan adalah nilai "nilai apa pun" Prolog _, yang biasanya ditampilkan sebagai _Gditambah beberapa digit acak pada output (untuk memungkinkan mesin Prolog mengekspresikan hubungan antara nilai-nilai tujuan umum).

Kebetulan, ada perbaikan bug untuk SWI-Prolog hanya beberapa hari yang lalu yang membuat program ini mungkin (meskipun tampaknya masih berfungsi pada versi yang lebih tua, kereta); kendala "itu persegi panjang" yang tersirat \sebelumnya rusak, tetapi telah diperbaiki pada waktunya untuk tantangan.


sumber
1

Python 2 , 105 byte

def f(a):b=len(a)and int((len(a)-1)**.5)+1;return[(a+[[0],' ']["'"in`a`]*b*b)[b*i:][:b]for i in range(b)]

Cobalah online!

Biarawati Bocor
sumber
Apa yang dihasilkannya untuk input kosong?
Adám
4
@ Adám Jawaban yang benar.
Leaky Nun
Anda sekarang dapat menyederhanakan dengan menggunakan hanya satu elemen isian.
Adám
1

PHP, 139 Bytes

Output string sebagai array char 2D

bekerja dengan []array kosong

$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);

Cobalah online!

PHP, 143 Bytes

perlu [[]]sebagai array kosong

Output string sebagai array string 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));

Cobalah online!

Jörg Hülsermann
sumber
1

Jelly , 13 byte

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

Tautan monadik yang mengambil daftar datar dan mengembalikan daftar daftar.

Test suite di Coba online!

Bagaimana?

Menambahkan sebanyak nol (elemen padding) karena ada elemen dalam input dan kemudian membentuk kembali menjadi persegi, menjatuhkan setiap nol kelebihan untuk persyaratan dalam proses.

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
Jonathan Allan
sumber
1

R, 91 byte

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

Secara default, R bantalan matriks oleh elemen daur ulang vektor input dan mengkodekan matriks dalam urutan kolom-utama. Akan mengembalikan 0x0matriks untuk input double(0)(array ganda kosong) atau ''.

Baris pertama ( ifpernyataan) membagi string menjadi vektor karakter penyusunnya; jika saya dapat mengambil vektor itu sebagai gantinya, garis itu dapat dihapus.

Cobalah online!

Giuseppe
sumber
@ Jonathanathan Allan terima kasih, sudah diperbaiki.
Giuseppe
0

Bash , 91 77 69 67 byte

L=`dc -e${#1}\ 1-v1+p`
[ -z "$1"]||printf %-$[$L*$L]s "$1"|fold -$L

Cobalah online!

Memformat teks, bantalan dengan spasi. Output tidak ada yang stdout pada input kosong.

Pembaruan : mencuri beberapa trik dari jawaban di sini .

eush77
sumber
0

Haskell, 87 byte

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

Cobalah online!

Elemen isi adalah error[], nilai terpendek yang dari jenis apa pun ( undefinedsedikit lebih lama).

Catatan pada tautan TIO:

  • Anda tidak dapat mencetak error, jadi saya menggabungkan matriks dengan elemen isi kembali ke daftar dan mencetak panjangnya

  • TIO tidak punya Data.Lists, hanya saja Data.List.Splititu menunjukkan 5 byte lebih.

Cara kerjanya: hitung panjang cmatriks c-by-c. Ambil celemen pertama dari daftar potongan panjang cdari daftar input diikuti oleh daftar elemen pengisian yang memiliki panjang yang sama dengan daftar input. Misalnya:

[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
nimi
sumber
0

Dyalog APL, 20 19 byte

{(,⍨⍴⍵↑⍨×⍨)⌈.5*⍨≢⍵}

-1 Byte berkat @ Adám!

Cobalah online!

Zacharý
sumber
Ini adalah jawaban saya untuk kompetisi siswa, itu tentu saja golf jadi saya taruh di sini, dan terima kasih untuk byte!
Zacharý