Çok boyutlu etiketleri dizme


12

Buhar-punk çok boyutlu bir dünyada, patronumuz holdingin çok boyutlu dosya dolabındaki her çekmeceye basılı indeks etiketleri yapıştırmak istiyor.

Patron, sadece bu amaçla satın alınan bir yazı tipini kullanarak tüm etiket sayfasını tek bir form olarak ayarlamak istiyor, bu yüzden çeşitleri (metal sembol parçaları) sipariş etmeliyiz . Çeşitler çok pahalı olduğu için, siparişimiz her rakam sembolünün tam sayısı için olmalıdır.

Belirli bir boyutta (herhangi bir yolla) ≥ 0 boyut kümesi için, tüm Kartezyen koordinatları ayarlamak için gereken basamakların frekans tablosu olan siparişimizi (herhangi bir yolla) iade edin. Klavye görünüm sırasına göre düzenlenmelidir (yani 9'dan sonra 0) ve 0 çeşit sipariş içermeyebilir, bu nedenle hiç bir tür sipariş edilmeyecekse (bir boyutun uzunluğu 0 olduğu için); hiçbir şey yazdırmayın.

  • Kodunuz 0 boyutları da işleyebiliyorsa (yani hiçbir şey basamazsa) -3 çeşit bonus.
  • Son satırsonu karakterleri kabul edilebilir.
  • Standart boşluklarda yasak uygulanır.
  • Bahsedildiği gibi, türler pahalıdır, bu nedenle .

Nazik bir ruh bu zorluğu otomatik puanlamayı içerecek şekilde düzenleyebilir, bu nedenle aşağıdaki gibi bir başlık ekleyin:
# LanguageName, 123 sorts

Test senaryoları

Verilen 11, yazdırın:

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

gerekli etiketler çünkü 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ve 11.


Verilen 2 3, yazdırın:

1 5
2 5
3 2

gerekli etiketler çünkü 1 1, 1 2, 1 3, 2 1, 2 2, ve 2 3.


Verilen 2 0boş bir satır yazdırın:

veya hiçbirşey.


Verilen 1 2 3, yazdırın:

1 11
2  5
3  2

gerekli etiketler çünkü 1 1 1, 1 1 2, 1 1 3, 1 2 1, 1 2 2, ve1 2 3


Verilen 5 5 5 5, yazdırın:

1 500
2 500
3 500
4 500
5 500

Ve hayır, 625 etiketin hepsini listelemeyeceğim.


Çıktı gereksinimleri hakkında biraz belirsizim. Metinde "return (hiçbir şekilde)" yazıyor, ancak geri kalanı çok özel bir çıktı formatının gerekli olduğunu ve yazdırılması gerektiğini gösteriyor. Hangisi o? Örneğin, çıktı formatı herhangi bir şey olabilirse, sondaki yeni satırlardan bahsetmek tamamen gereksiz görünüyor.
Reto Koradi

1
@RetoKoradi biçiminin gösterildiği gibi daha fazla veya daha az görünmesi gerekir, ancak etkileşimli bir oturumda, bir dosyada, bir pop-up'da, STDOUT vb. Olabilir. ?
Adam

Yanıtlar:


6

Dyalog APL, 10 7

Kod 10 bayt uzunluğundadır ve bonusa hak kazanır.

3 bayt için user46915'e teşekkürler!

,∘≢⌸∊⍕¨∊⍳⎕

Not TryAPL üzerinde çalışmaya değil (girişi); burada işlev formunu deneyebilirsiniz .

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

Operatörü tam olarak anlamıyorum , ancak {⍺}⌸alınan benzersiz değerleri {⍵}⌸listeler ve argümandaki yerlerini listeler.

Bu doğru sıralamaya sahiptir, çünkü basamakların çok boyutlu etiket dizisinde göründüğü sıradır.


1
Evet, aklımdaki çözüm bu. Bu Ana operatörün anlaşılmasına yardımcı olabilir .
Adam

1
APL her zaman codegolf'ta kazanmaz mı?
vy32

APL en kısa genel amaçlı dil olabilir, ancak belirli bir sınırlı alanda her zaman genel amaçlı bir dilden daha iyi olan alana özgü diller olacaktır. Kod golfünün belirli alanlarında, Pyth ve CJam gibi golf dilleri genellikle kazanır. Bununla birlikte, çok büyük şirketlerin üretiminde kullanılan ticari bir dil olan APL'nin daha da yakın olması dikkat çekicidir. Ayrıca, biraz daha ayrıntılı olma fiyatı için, insanların APL okumayı golf dillerinden daha kolay öğrenmesi daha olasıdır.
Adam

Bekle, yani tüm histogramı ,∘≢⌸benzersiz ve böyle bir dış ürün olmadan basitçe yapabilir miyim ?! Dyalog kesinlikle harika. Ayrıca ,∘≢⌸daha kısadır {⍺,≢⍵}⌸.
user46915

3
@NBZ, APL'yi özlüyorum. 1982'de APL'de papatya tekerleği yazıcısı süren bir grafik paketi yazdım. Bir ay sonra ne yazdığımı anlamama rağmen, bu bir sanat eseriydi.
vy32


2

Mathematica, 111 85 bayt

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

Buradaki işlerin çoğu tarafından yapılır DigitCount.


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

2

R, 110 bayt

Alex A. sayesinde 4 kurtarıldı (teşekkürler!)

U=unlist
X=table(U(strsplit(as.character(U(expand.grid(Map(seq_len,scan())))),"")))
z=Map(cat,names(X),X,"\n")

Yalnızca kullanmak xsadece biri tekrarlamasını değiştirmek gerekir böylece bir kez xbirlikte scan(). Ayrıca neden atayın z?
Alex

Teşekkürler. Kullanmama konusunda anlaşın x. Ben çıktısını Mapbir zdeğişkene tayin ettim aksi halde Mapçıktısını stdout'a yazdıracağım. Daha iyi bir uygulama Mapiçeriye sarmak olurdu invisible()ama bu çok fazla karakter ...
flodel

1

Ruby, 92 bayt

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

Uzunlukları komut satırı argümanları olarak alır:

$ ruby foo.rb 1 2 3
1 11
2 5
3 2

0

CJam, 31 bayt

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

Çevrimiçi deneyin

Kod 34 bayttır ve boş giriş listesiyle çalışmak için 3 bayt bonus alır. Giriş, CJam biçimindeki bir listedir, örneğin:

[1 2 3]

Açıklama:

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.


0

Haskell, 125 bayt

import Data.List
l=mapM_(putStrLn.(\(h:r)->h:' ':show(length r+1))).group.sort.concatMap show.concat.sequence.map(\n->[1..n])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.