Squared Off (vừa với hình vuông nhỏ nhất có thể)


8

Giới thiệu

Phức tạp hơn Một hình vuông văn bản vì điều này đòi hỏi phải có phần đệm và đầu vào có kiểu dữ liệu không xác định.

Hàng năm, Dyalog Ltd. tổ chức một cuộc thi sinh viên. Thách thức ở đây là viết mã APL tốt . Đây là một phiên bản bất khả tri ngôn ngữ của vấn đề thứ mười năm nay.

Tôi có sự cho phép rõ ràng để đăng thử thách này ở đây từ tác giả ban đầu của cuộc thi. Vui lòng xác minh bằng cách theo liên kết được cung cấp và liên hệ với tác giả.

Vấn đề

Viết chương trình / hàm sẽ định hình lại một chuỗi hoặc danh sách số đã cho vào ô vuông nhỏ nhất sẽ chứa tất cả các phần tử của đầu vào, đệm với các phần tử bổ sung nếu cần. Phần tử pad phải là phần tử điền mặc định cho kiểu dữ liệu đã cho hoặc bất kỳ phần tử nào bạn chọn. Các phần tử của hình vuông phải theo thứ tự làm phẳng nó sẽ đưa ra thứ tự ban đầu của dữ liệu đầu vào (với các phần tử đệm theo sau, nếu có).

Các trường hợp thử nghiệm

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

[]

ngôn ngữ của bạn gần nhất với ma trận trống, ví dụ []hoặc[[]]



Chúng ta có phải xử lý cả chuỗi và mảng làm đầu vào hay chỉ một? Đầu ra có thể là một chuỗi chứa dòng mới? Đầu ra cho [100] không phải là [[1,0], [0,0]]? Nếu không, [[100,1], [2,0]] là đầu ra dự kiến ​​cho đầu vào [100,1,2]?
Xù xì

@Shaggy Có, danh sách số và chuỗi / danh sách các ký tự (bất cứ ngôn ngữ nào bạn sử dụng). Đầu ra cho mỗi quy tắc mặc định. "100" cho [["1", 0 "], [" 0 "," "]] (hoặc bất kể phần tử điền là gì. Có, [100,1,2] → [[100,1], [2 , 0]].
Adám

Xin chào Adám, tôi có ba câu hỏi ... 1. "Phần tử pad nên là phần tử điền mặc định cho kiểu dữ liệu đã cho hoặc bất kỳ phần tử nào bạn chọn." có nghĩa là - nó bị hạn chế hoặc miễn phí (có vẻ mâu thuẫn hoặc dư thừa)? 2. Đầu ra phải như thế nào cho một đầu vào như thế nào [1,2,3,4,'O'], hoặc nó được đảm bảo không xảy ra? 3. Là thứ tự được yêu cầu sau khi làm phẳng yêu cầu bỏ qua các phần tử pad (ví dụ: đầu vào của [1,2,3,4,5]năng suất [[0,0,0],[0,1,2],[3,4,5]]hoặc thậm chí [[0,1,0],[2,0,3],[0,4,5]])?
Jonathan Allan

1
@Jonathan ALLan 1. Một số ngôn ngữ sẽ tự động đệm. Bất cứ điều gì họ pad với là tốt. Nếu bạn không, hãy chọn một yếu tố. 2. danh sách chuỗi hoặc số . 3. Các yếu tố đệm phải được theo dõi.
Adám

Câu trả lời:


4

MATL , 12 9 byte

Lưu ba byte nhờ Luis. hethay vì UGwewe, nhưng thêm một ttrong đầu.

tnX^Xkthe

Hãy thử trực tuyến!

Điều này trả về kết quả, nhưng được chuyển đổi so với kết quả trong bài OP (không sao).

Giải trình:

Điều này hoạt động theo cùng một cách cho cả đầu vào số và chuỗi, vì MATL xử lý chúng theo cùng một cách.

Giả sử đầu vào là '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  

Đầu ra này không có gì cho đầu vào trống, điều này xảy ra theo cách MATL xuất ra ma trận / chuỗi trống.


Nó làm gì cho đầu vào trống?
Adám

Đầu ra này không có gì cho đầu vào trống, điều này xảy ra theo cách MATL xuất ra ma trận / chuỗi trống.
Stewie Griffin

1
Tôi nghĩ tnX^Xkt3$ecũng làm công việc đó
Luis Mendo

1
Hoặc, tốt hơn,tnX^Xkthe
Luis Mendo

1
@LuisMendo Tôi đã tìm cách chuyển ba đầu vào reshapevà không nhận thấy điều rất rõ ràng : $: Specified inputs. Và tôi không biết bạn có thể vượt qua các kích thước như một vector. Tôi biết rằng phải có một cách mà không phải trải qua hai lần định hình lại. Cảm ơn! :)
Stewie Griffin

3

JavaScript (ES7), 70 byte

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

Trả về []cho một mảng / chuỗi trống. Sử dụng undefinedlàm giá trị điền. Đối với ES6 thay thế (...)**.5bằng Math.sqrt(...)(+5 byte).


2

Brachylog , 10 byte

;Ac~c.\l~l

Hãy thử trực tuyến!

Lấy chuỗi là danh sách các ký tự (người hỏi đã xác nhận rằng điều này là OK).

Điều này rất không hiệu quả đối với các đầu vào dài hơn, bởi vì nó vũ phu tất cả các sự thay đổi có thể có của đầu vào, cố gắng tăng dần phần đệm, cho đến khi nó tìm thấy một hình vuông.

Giải trình

;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

Các phần tử đệm được sử dụng là giá trị "bất kỳ giá trị" nào của Prolog _, thường được hiển thị dưới dạng _Gcộng với một số chữ số ngẫu nhiên trên đầu ra (để công cụ Prolog có thể biểu thị mối quan hệ giữa các giá trị mục đích chung đó).

Ngẫu nhiên, đã có một sửa lỗi cho SWI-Prolog chỉ một vài ngày trước đó làm cho chương trình này có thể (mặc dù nó vẫn xuất hiện để hoạt động trên các phiên bản lỗi cũ hơn); ràng buộc "hình chữ nhật" ngụ ý \trước đây đã bị phá vỡ, nhưng nó đã được khắc phục kịp thời cho thử thách.



1

PHP, 139 byte

Chuỗi đầu ra dưới dạng mảng 2D char

làm việc với []mảng trống

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

Hãy thử trực tuyến!

PHP, 143 byte

cần [[]]mảng trống

Chuỗi đầu ra dưới dạng mảng chuỗi 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));

Hãy thử trực tuyến!


1

Thạch , 13 byte

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

Một liên kết đơn âm lấy một danh sách phẳng và trả về một danh sách các danh sách.

Bộ thử nghiệm tại Dùng thử trực tuyến!

Làm sao?

Nối càng nhiều số không (phần tử đệm) khi có các phần tử trong đầu vào và sau đó định hình lại thành hình vuông, thả bất kỳ số 0 nào vượt quá yêu cầu trong quy trình.

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 byte

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

Theo mặc định, R đệm ma trận bằng cách tái chế các phần tử của vectơ đầu vào và mã hóa ma trận theo thứ tự chính của cột. Sẽ trả về một 0x0ma trận cho một đầu vào của double(0)(một mảng kép trống) hoặc ''.

Dòng đầu tiên ( ifcâu lệnh) chia một chuỗi thành một vectơ của các ký tự cấu thành của nó; nếu tôi có thể lấy vectơ đó thay vào đó, dòng đó có thể được loại bỏ.

Hãy thử trực tuyến!


@Jonathan ALLan cảm ơn bạn, đã sửa.
Giuseppe

0

Bash , 91 77 69 67 byte

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

Hãy thử trực tuyến!

Định dạng văn bản, miếng đệm với không gian. Đầu ra không có gì để xuất chuẩn trên đầu vào trống.

Cập nhật : lấy trộm một số thủ thuật từ câu trả lời ở đây .


0

Haskell, 87 byte

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

Hãy thử trực tuyến!

Phần tử điền là error[], giá trị ngắn nhất thuộc bất kỳ loại nào ( undefineddài hơn một chút).

Ghi chú về liên kết TIO:

  • bạn không thể in error, vì vậy tôi ghép các ma trận với các phần tử điền vào danh sách và in độ dài của nó

  • TIO không có Data.Lists, chỉ có Data.List.Splitvậy nó hiển thị thêm 5 byte.

Cách thức hoạt động: tính độ dài ccủa ma trận c-by-c. Lấy các cphần tử đầu tiên của danh sách các đoạn có độ dài ccủa danh sách đầu vào, theo sau là danh sách các phần tử điền có cùng độ dài với danh sách đầu vào. Ví dụ :

[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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.