Codegolf Rainbow: Menyortir Warna dengan Refleksi

9

Pengantar:

Setelah saya memposting dua tantangan terkait pelangi: Codegolf Rainbow: Fun with Integer-Arrays 1 dan Codegolf Rainbow: Draw in Black-and-White 2 , komentar berikut dibuat oleh @ChrisM di ASCII ( Draw in Black-and-White ) tantangan :

Mungkin Anda tahu ini dan itu dengan desain (saya tahu bahwa pelangi juga bukan rhombus atau ascii, dan posisi pesanan yang lebih tinggi menjadi lebih rumit), tetapi bukankah warnanya terbalik dalam pelangi ke-2?

Dan dia memang benar. Ketika Anda melihat pelangi ganda, yang kedua sebenarnya merupakan cerminan yang pertama, sehingga warnanya terbalik. Dengan tiga pelangi, ini adalah pelangi ganda yang sebenarnya, dengan pelangi ketiga merupakan cerminan dari salah satu dari dua pelangi lainnya. Dan dengan empat, ada dua pelangi, dan dua refleksi dari mereka.
masukkan deskripsi gambar di sini

Jadi, mari kita membuat tantangan terkait ketiga menggunakan fakta itu.

Tantangan:

Input: Sebuah bilangan bulat positif nyang >=2, dan daftar bilangan bulat ukuran >= n+1.
Output: Daftar yang sama dipesan sebagai berikut:

  1. Pertama-tama pisahkan daftar input dalam sub-daftar ukuran n(di mana sub-daftar trailing bisa berapapun dalam kisaran [1,n]).
  2. Kemudian kami melakukan hal berikut berdasarkan jumlah sub-daftar m:
    • Urutkan m - m//2jumlah sub-daftar pertama dari terendah ke tertinggi (di mana //adalah bilangan bulat). (Yaitu dengan 6 sub-daftar, tiga yang pertama akan disortir dari yang terendah ke yang tertinggi; dengan 5 sub-daftar yang ketiga akan disortir dari yang terendah ke yang tertinggi.)
    • Urutkan m//2jumlah sub-daftar terakhir dari tertinggi ke terendah (di mana //integer-bagi). (Yaitu dengan 6 sub-daftar, tiga terakhir akan disortir dari tertinggi ke terendah; dengan 5 sub-daftar, dua terakhir akan diurutkan dari tertinggi ke terendah.)
  3. Gabungkan semua sub-daftar bersama untuk membentuk satu daftar lagi

Contoh:

Input: n=7dan [3,2,1,-4,5,6,17,2,0,3,5,4,66,-7,7,6,-5,2,10]
Langkah 1: [[3,2,1,-4,5,6,17],[2,0,3,5,4,66,-7],[7,6,-5,2,10]]
Langkah 2: [[-4,1,2,3,5,6,17],[-7,0,2,3,4,5,66],[10,7,6,2,-5]]
Langkah 3 / Output:[-4,1,2,3,5,6,17,-7,0,2,3,4,5,66,10,7,6,2,-5]

Input: n=4dan [7,4,-8,9,3,19,0,-23,-13,13]
Langkah 1: [[7,4,-8,9],[3,19,0,-23],[-13,13]]
Langkah 2: [[-8,4,7,9],[-23,0,3,19],[13,-13]]
Langkah 3 / Output:[-8,4,7,9,-23,0,3,19,13,-13]

Aturan tantangan:

  • Input integer ndijamin lebih besar dari 1.
  • Ukuran bilangan bulat daftar dijamin lebih besar dari n.
  • Sub-daftar tambahan dapat lebih kecil dari n(seperti yang dapat dilihat pada contoh dan kasus uji).
  • Format I / O fleksibel dalam format apa pun yang wajar. Dapat berupa daftar / larik bilangan bulat atau desimal, string yang dibatasi koma / spasi / baris baru, aliran bilangan bulat, dll. (Output mungkin bukan daftar daftar 2D seperti langkah 2. Langkah 3 untuk meratakan kembali ke dalam satu daftar diperlukan untuk tantangan ini.)

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.

Kasus uji:

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]
Kevin Cruijssen
sumber

Jawaban:

5

Brachylog , 18 17 16 byte

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

Cobalah online!

-1 byte terima kasih kepada @sundar

Diharapkan input sebagai [<integer list>, n]. Perhatikan bahwa bilangan bulat negatif diwakili dengan _, "minus rendah" dari Brachylog. Variabel output adalah R.

Pertama kali mencoba Brachylog, jadi saya bayangkan itu kurang optimal dan matang untuk mengurangi dalam byte.

Penjelasan

Partisi, bifurcate, sortir berdasarkan indeks (0: asc, 1: desc), ratakan.

ġ₎               | 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
redundansi
sumber
Tweak kecil untuk solusi kedua Anda, untuk mendapatkan 17 byte: Cobalah online!
sundar - Reinstate Monica
@sundar Saya curiga bahwa saya terlalu banyak memetakan, terima kasih!
redundansi
Untuk apa bahasa ini?
Sam Orozco
@SamOrozco Terse pemrograman logika deklaratif. Coba klik pada nama bahasa!
Adám
3

Jelly , 9 byte

sṢ€ŒHUÐeF

Cobalah online!

Tuan Xcoder
sumber
1
Saya tidak mengerti mengapa bahasa pemrograman ini ada.
Sam Orozco
@SamOrozco Tujuan utamanya adalah untuk menyelesaikan masalah dengan kode sesingkat mungkin.
Adám
Oh benarkah. Itu keren.
Sam Orozco
2

Japt , 10 byte

òV ®nÃÇwÃc

Also 10 bytes
òV mn ow c

Cobalah online!

Luis felipe De jesus Munoz
sumber
2

05AB1E (warisan) , 9 byte

ô€{2ä`í«˜

Cobalah online!

Cobalah online! di 05AB1E (Elixir menulis ulang) - mengharapkan input berada di stack, metode I / O default.

Kevin datang dengan 11-byter-nya sendiri yang dulu saya dapatkan sampai 10. Lalu saya datang dengan sesuatu yang lain untuk 9 byte.

Tuan Xcoder
sumber
Bagus Berikut adalah solusi awal saya sebagai 11-byte alternatif: ô€{2äRć€R)˜.
Kevin Cruijssen
1
@KevinCruijssen Mendapat 10 menggunakan pendekatan Anda haha. Sunting : 9 sekarang!
Tn. Xcoder
Ah bagus. Benar-benar lupa í. Dan golf tambahan yang bagus.
Kevin Cruijssen
2

JavaScript (ES6), 82 81 byte

Disimpan 1 byte berkat @redundancy

Mengambil input sebagai (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)

Cobalah online!

Arnauld
sumber
Karena asatu dimensi, saya yakin Anda bisa mengganti a>[]dengan a+auntuk memeriksa kasing kosong dan menghemat 1 byte. Strategi rekursif yang sangat pintar untuk mempartisi dan menentukan kapan harus membalikkan hal semacam itu, juga!
redundansi
@ redundansi Itu memang seharusnya aman. Terima kasih!
Arnauld