Codegolf Rainbow: Sắp xếp màu sắc với sự phản chiếu


9

Giới thiệu:

Sau khi tôi đăng hai thử thách liên quan đến cầu vồng: Codegolf Rainbow: Fun with Integer-Arrays 1Codegolf Rainbow: Draw in Black-and-White 2 , nhận xét sau đây được đưa ra bởi @ChrisM trong ASCII ( Vẽ bằng màu đen và trắng ) thách thức :

Có thể bạn biết điều này và theo thiết kế (tôi biết rằng cầu vồng không phải là hình thoi hoặc ascii, và vị trí của các đơn hàng cao hơn trở nên phức tạp hơn), nhưng không phải màu sắc bị đảo ngược trong cầu vồng thứ 2?

Và anh ấy thực sự đúng. Khi bạn nhìn thấy cầu vồng đôi, cái thứ hai thực sự là sự phản chiếu của cái thứ nhất, vì vậy màu sắc bị đảo ngược. Với ba cầu vồng, đó là cầu vồng đôi thực sự, với cầu vồng thứ ba là hình ảnh phản chiếu của một trong hai cầu vồng kia. Và với bốn, có hai cầu vồng và hai hình ảnh phản chiếu của chúng.
nhập mô tả hình ảnh ở đây

Vì vậy, hãy thực hiện một thách thức liên quan thứ ba bằng cách sử dụng thực tế đó.

Thử thách:

Đầu vào: Một số nguyên dương n>=2và một danh sách các số nguyên có kích thước >= n+1.
Đầu ra: Danh sách tương tự được sắp xếp như sau:

  1. Đầu tiên, phân chia danh sách đầu vào trong danh sách phụ có kích thước n(trong đó danh sách phụ có thể có bất kỳ kích thước nào trong phạm vi [1,n]).
  2. Sau đó, chúng tôi thực hiện các thao tác sau dựa trên số lượng danh sách phụ m:
    • Sắp xếp m - m//2số lượng danh sách phụ đầu tiên từ thấp nhất đến cao nhất (trong đó //phân chia số nguyên). (Tức là có 6 danh sách phụ, ba danh sách đầu tiên sẽ được sắp xếp từ thấp nhất đến cao nhất; với 5 danh sách phụ, ba danh sách phụ sẽ được sắp xếp từ thấp nhất đến cao nhất.)
    • Sắp xếp m//2số lượng danh sách phụ cuối cùng từ cao nhất đến thấp nhất (trong đó //phân chia số nguyên). (Tức là có 6 danh sách phụ, ba danh sách cuối cùng sẽ được sắp xếp từ cao nhất đến thấp nhất; với 5 danh sách phụ, hai danh sách phụ sẽ được sắp xếp từ cao nhất đến thấp nhất.)
  3. Hợp nhất tất cả các danh sách phụ lại với nhau để tạo thành một danh sách một lần nữa

Ví dụ:

Đầu vào: n=7[3,2,1,-4,5,6,17,2,0,3,5,4,66,-7,7,6,-5,2,10]
Bước 1: [[3,2,1,-4,5,6,17],[2,0,3,5,4,66,-7],[7,6,-5,2,10]]
Bước 2: [[-4,1,2,3,5,6,17],[-7,0,2,3,4,5,66],[10,7,6,2,-5]]
Bước 3 / Đầu ra:[-4,1,2,3,5,6,17,-7,0,2,3,4,5,66,10,7,6,2,-5]

Đầu vào: n=4[7,4,-8,9,3,19,0,-23,-13,13]
Bước 1: [[7,4,-8,9],[3,19,0,-23],[-13,13]]
Bước 2: [[-8,4,7,9],[-23,0,3,19],[13,-13]]
Bước 3 / Đầu ra:[-8,4,7,9,-23,0,3,19,13,-13]

Quy tắc thử thách:

  • Đầu vào số nguyên nđược đảm bảo lớn hơn 1.
  • Kích thước của danh sách số nguyên được đảm bảo lớn hơn n.
  • Danh sách phụ theo dõi có thể nhỏ hơn n(như có thể thấy trong các ví dụ và trường hợp thử nghiệm).
  • Định dạng I / O là linh hoạt trong bất kỳ định dạng hợp lý. Có thể là danh sách / mảng số nguyên hoặc số thập phân, chuỗi phân cách bằng dấu phẩy / dấu cách / dòng mới, luồng số nguyên, v.v. (Đầu ra có thể không phải là danh sách 2D của danh sách như bước 2. Bước 3 để đưa nó trở lại vào một danh sách là cần thiết cho thử thách này.)

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, thêm một lời giải thích cho câu trả lời của bạn rất được khuyến khích.

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

Inputs: n=7 and [3,2,1,-4,5,6,17,2,0,3,5,4,66,-7,7,6,-5,2,10]
Output: [-4,1,2,3,5,6,17,-7,0,2,3,4,5,66,10,7,6,2,-5]

Inputs: n=4 and [7,4,-8,9,3,19,0,-23,-13,13]
Output: [-8,4,7,9,-23,0,3,19,13,-13]

Inputs: n=2 and [7,-3,1]
Output: [-3,7,1]

Inputs: n=3 and [1,6,99,4,2]
Output: [1,6,99,4,2]

Inputs: n=2 and [5,2,9,3,-5,-5,11,-5,4,12,9,-2,0,4,1,10,11]
Output: [2,5,3,9,-5,-5,-5,11,4,12,9,-2,4,0,10,1,11]

Inputs: n=3 and [5,2,9,3,-5,-5,11,-5,4,12,9,-2,0,4,1,10,11]
Output: [2,5,9,-5,-5,3,-5,4,11,12,9,-2,4,1,0,11,10]

Câu trả lời:


5

Brachylog , 18 17 16 byte

ġ₎↔ḍ↔{izo₎ᵐ↔}ᶠcc

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

-1 byte nhờ @sundar

Mong đợi đầu vào là [<integer list>, n]. Lưu ý rằng các số nguyên âm được biểu thị bằng _"điểm trừ thấp" của Brachylog. Biến đầu ra là R.

Lần đầu tiên thử Brachylog, vì vậy tôi tưởng tượng nó không tối ưu và chín muồi để giảm byte.

Giải trình

Phân vùng, bifurcate, sắp xếp dựa trên chỉ mục (0: asc, 1: desc), flatten.

ġ₎               | split head of input into groups of length n (last of list)
  ↔              | reverse so that...
   ḍ             | dichotomize splits in two, attaching any additional element to the second list
    ↔            | reverse so first half of partitions corresponds to the 0 index
     {      }    | apply
      i          | : append index
       z         | : zip each sublist with the index of its parent
        o₎ᵐ      | : map over sublists, ordering by the zipped index
           ↔     | : undo earlier reverse
             ᶠ   | find all outputs
              cc | flatten two levels

Một điều chỉnh nhỏ cho giải pháp thứ hai của bạn, để có được 17 byte: Hãy thử trực tuyến!
- Phục hồi Monica

@sundar Tôi đã có một nghi ngờ lén lút Tôi đã lập bản đồ quá nhiều, cảm ơn!
dự phòng

Ngôn ngữ này để làm gì?
Sam Orozco

@SamOrozco Terse lập trình logic khai báo. Hãy thử nhấp vào tên ngôn ngữ!
Adám




2

05AB1E (di sản) , 9 byte

ô€{2ä`í«˜

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

Hãy thử trực tuyến! trong 05AB1E (Viết lại Elixir) - dự kiến ​​đầu vào sẽ nằm trên ngăn xếp, một phương thức I / O mặc định.

Kevin đã đưa ra 11-byter của riêng mình mà tôi đã sử dụng để lên 10. Sau đó, tôi đã nghĩ ra một thứ khác với 9 byte.


Đẹp một. Đây là giải pháp ban đầu của tôi dưới dạng thay thế 11 byte : ô€{2äRć€R)˜.
Kevin Cruijssen

1
@KevinCruijssen Đã lên 10 bằng cách sử dụng phương pháp của bạn haha. EDIT : 9 ngay bây giờ!
Ông Xcoder

À, tốt quá. Hoàn toàn quên mất í. Và golf bổ sung tốt đẹp.
Kevin Cruijssen

2

JavaScript (ES6), 82 81 byte

Đã lưu 1 byte nhờ @redundancy

Đưa đầu vào là (list)(n).

a=>n=>(g=z=>a+a?[...a.splice(0,n).sort((x,y)=>1/z?x-y:y-x),...g(a[i+=n])]:a)(i=0)

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


Kể từ khi alà một chiều, tôi tin rằng bạn có thể thay thế a>[]với a+akiểm tra các trường hợp không rỗng và tiết kiệm 1 byte. Chiến lược hồi quy thực sự thông minh để phân vùng và xác định khi nào nên đảo ngược sắp xếp!
dự phòng

@redundancy Điều đó thực sự an toàn. Cảm ơn!
Arnauld
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.