Label multidimensi penyusunan huruf

12

Dalam dunia multidimensi steam-punk, bos kami ingin menambahkan label indeks yang dicetak ke setiap laci di lemari arsip multidimensi konglomerat kami.

Bos ingin mengeset seluruh lembar label sebagai bentuk tunggal, menggunakan font yang dibeli hanya untuk tujuan ini, jadi kita harus memesan jenisnya (potongan simbol logam). Karena jenisnya sangat mahal, pesanan kami harus sesuai dengan jumlah persis dari setiap simbol angka.

Untuk satuan dimensi tertentu yang diberikan (dengan cara apa pun) ≥ 0, kembalikan (dengan cara apa pun) pesanan kami, yang merupakan tabel frekuensi digit yang diperlukan untuk mengeset semua koordinat Cartesius. Itu harus diatur oleh urutan tampilan keyboard (yaitu 0 setelah 9), dan mungkin tidak termasuk urutan 0 macam, jadi jika tidak ada jenis yang harus dipesan sama sekali (karena dimensi memiliki panjang 0); cetak apa-apa.

  • Bonus -3 macam jika kode Anda dapat menangani (yaitu mencetak apa-apa) 0 dimensi juga.
  • Karakter baris baru dapat diterima.
  • Larangan pada celah standar berlaku.
  • Seperti disebutkan, jenis mahal, ini karena itu .

Jiwa yang baik hati dapat mengedit tantangan ini untuk memasukkan penilaian otomatis, jadi sertakan tajuk seperti:
# LanguageName, 123 sorts

Uji kasus

Diberikan 11, cetak:

1 4
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 1
0 1

karena label dibutuhkan adalah 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, dan 11.


Diberikan 2 3, cetak:

1 5
2 5
3 2

karena label dibutuhkan adalah 1 1, 1 2, 1 3, 2 1, 2 2, dan 2 3.


Diberikan 2 0, cetak baris kosong:

atau tidak sama sekali.


Diberikan 1 2 3, cetak:

1 11
2  5
3  2

karena label dibutuhkan adalah 1 1 1, 1 1 2, 1 1 3, 1 2 1, 1 2 2, dan1 2 3


Diberikan 5 5 5 5, cetak:

1 500
2 500
3 500
4 500
5 500

Dan tidak, saya tidak akan mencantumkan semua 625 label.

Adm
sumber
Saya sedikit tidak jelas tentang persyaratan output. Dalam teks, dikatakan "kembali (dengan cara apa pun)", tetapi sisanya menyarankan bahwa format output yang sangat spesifik diperlukan, dan perlu dicetak. Yang mana? Misalnya berbicara tentang mengekor baris baru tampaknya sepenuhnya berlebihan jika format output bisa apa saja.
Reto Koradi
1
@RetoKoradi formatnya harus terlihat kurang lebih seperti yang diperlihatkan, tetapi mungkin dalam sesi interaktif, file, pop-up, STDOUT, dll. ?
Adám

Jawaban:

6

Dyalog APL, 10 7

Panjang kode 10 byte dan memenuhi syarat untuk bonus.

Terima kasih kepada user46915 selama 3 byte!

,∘≢⌸∊⍕¨∊⍳⎕

Perhatikan bahwa (input) tidak berfungsi di TryAPL; Anda dapat mencoba formulir fungsi di sini .

            ⎕      Get input
           ⍳       Index vector
       ∊⍕¨∊        Flatten, stringify, flatten again
      ⌸            From the key, display the
{⍺,  }             elements concatenated with the
   ≢⍵              number of times they occur

Saya tidak sepenuhnya memahami operator, tetapi {⍺}⌸mencantumkan nilai unik yang diambil, dan {⍵}⌸mencantumkan tempat mereka dalam argumen.

Ini memiliki urutan yang benar karena ini adalah urutan di mana angka muncul dalam array label multidimensi.

lirtosiast
sumber
1
Yup, itulah solusi yang ada dalam pikiran saya. Ini dapat membantu memahami operator utama.
Adám
1
Bukankah APL selalu menang di codegolf?
vy32
@ vy32 No. APL mungkin bahasa tujuan umum yang paling ringkas, tetapi akan selalu ada bahasa khusus domain yang lebih baik pada domain terbatas tertentu daripada bahasa tujuan umum. Dalam domain spesifik kode-golf, bahasa golf seperti Pyth dan CJam biasanya menang. Namun, sangat luar biasa bahwa APL, yang menjadi bahasa komersial yang digunakan dalam produksi oleh perusahaan yang sangat besar, semakin mendekati. Juga, untuk harga yang sedikit lebih bertele-tele, mungkin lebih mudah bagi manusia untuk belajar membaca APL daripada bahasa golf.
Adám
Tunggu, jadi maksudmu aku bisa membuat histogram lengkap hanya dengan ,∘≢⌸tanpa produk luar dengan yang unik dan semacam itu ?! Dyalog sungguh luar biasa. Juga ,∘≢⌸lebih pendek dari {⍺,≢⍵}⌸.
user46915
3
@NBZ, saya rindu APL. Kembali pada tahun 1982 saya menulis paket grafis di APL yang mengendarai printer roda daisy. Itu adalah karya seni, meskipun saya tidak mengerti apa yang saya tulis sebulan kemudian.
vy32
10

Mathematica, 48 byte - 3 = 45

Grid@Tally@Flatten@IntegerDigits@Tuples@Range@#&
alephalpha
sumber
1
Itu indah.
lirtosiast
2

Mathematica, 111 85 byte

Grid[Thread@{Range@10~Mod~10,DigitCount@Tuples@Range@#~Total~2}~DeleteCases~{_,‌​0}]&

Sebagian besar pekerjaan di sini dilakukan oleh DigitCount.

LegionMammal978
sumber
Grid[Thread@{Range@10~Mod~10,DigitCount@Tuples@Range@#~Total~2}~DeleteCases~{_,0}]&
alephalpha
2

R, 110 byte

Disimpan 4 berkat Alex A. (terima kasih!)

U=unlist
X=table(U(strsplit(as.character(U(expand.grid(Map(seq_len,scan())))),"")))
z=Map(cat,names(X),X,"\n")
flodel
sumber
Anda hanya menggunakan xsekali sehingga Anda hanya bisa mengganti satu kejadian xdengan scan(). Juga mengapa menetapkan z?
Alex A.
Terima kasih. Setuju tentang tidak menggunakan x. Saya menetapkan output Mapke zvariabel jika tidak Mapakan mencetak output ke stdout. Praktik yang lebih baik adalah membungkus Mapdi dalam invisible()tapi itu banyak karakter ...
flodel
1

Ruby, 92 byte

f,*r=$*.map{|n|[*1..n.to_i]}
a=f.product(*r)*''
puts a.chars.uniq.map{|c|[c,a.count(c)]*" "}

Mengambil panjang sebagai argumen baris perintah:

$ ruby foo.rb 1 2 3
1 11
2 5
3 2
daniero
sumber
0

CJam, 31 byte

Laq~{,m*}/e_:)s{_'0=A*+}$e`{(S\N}%

Cobalah online

Kode adalah 34 byte, dan membutuhkan 3 byte bonus untuk bekerja dengan daftar input kosong. Input adalah daftar dalam format CJam, misalnya:

[1 2 3]

Penjelasan:

La    Push list containing empty list to seed Cartesian products.
q~    Get and interpret input.
{     Loop over values in input list.
  ,     Built range from 0 to value-1.
  m*    Form Cartesian product with the list we already have.
}/    End loop over values in input list.
e_    Resulting list has extra nesting. Flatten it.
:)    Increment all values in list, since it is 0-based, and we need 1-based.
s     Convert it to string, so we can operate on digits.
{     Block to calculate source key, needed to get 0 to the end.
  _     Copy the digit.
  '0=   Compare with '0.
  A*    Multiply comparison result by 10...
  +     ... and add it to digit.
}$    End of sort key block.
e`    RLE.
{     Start of loop over RLE entries, for generating output in specified format.
  (     Pop off the first value, which is the count.
  S     Push a space...
  \     ... and swap it with the count.
  N     Push a newline.
}%    End of loop over RLE entries.
Reto Koradi
sumber
0

Pyth, 15 byte

rjko%N_Ts*FSMQ8
isaacg
sumber
0

Haskell, 125 byte

import Data.List
l=mapM_(putStrLn.(\(h:r)->h:' ':show(length r+1))).group.sort.concatMap show.concat.sequence.map(\n->[1..n])
Leif Willerts
sumber