多次元ラベルの組版


12

スチームパンクな多次元の世界では、上司はコングロマリットの多次元ファイルキャビネットの各引き出しに印刷されたインデックスラベルを貼り付けたいと考えています。

ボスは、この目的のためだけに購入したフォントを使用して、ラベルシート全体を単一のフォームとしてタイプセットしたいので、ソート(金属記​​号の断片)を注文する必要があります。ソートは非常に高価であるため、注文は各数字記号の正確なカウントのためでなければなりません。

与えられた(とにかく)次元≥0の長さのセットに対して、すべてのデカルト座標をタイプセットするのに必要な桁の頻度表である順序を(とにかく)返します。キーボードの出現順に並べる必要があります(つまり、9の後の0)。また、並べ替えがまったく行われない場合(次元の長さが0であるため)、並べ替え0の順序は含まれません。何も印刷しません。

  • コードが0次元も処理できる(つまり何も印刷しない)場合、-3のボーナスがソートされます。
  • 最終的な改行文字は許容されます。
  • 標準的な抜け穴の禁止が適用されます。
  • 前述のように、ソートは高価なので、これはです。

親切な魂は、この課題を編集して自動スコアリングを含めることができるため、次のようなヘッダーを含めます。
# LanguageName, 123 sorts

テストケース

与えられた11、印刷:

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

必要なラベルがあるため12345678910、と11


与えられた2 3、印刷:

1 5
2 5
3 2

必要なラベルがあるため1 11 21 32 12 2、と2 3


指定された場合2 0、空の行を出力します。

または何もありません。


与えられた1 2 3、印刷:

1 11
2  5
3  2

必要なラベルがあるため1 1 11 1 21 1 31 2 11 2 2、および1 2 3


与えられた5 5 5 5、印刷:

1 500
2 500
3 500
4 500
5 500

いいえ、625個すべてのラベルをリストするつもりはありません。


出力要件については少しわかりません。本文では、「(何らかの手段で)戻る」と書かれていますが、残りは非常に具体的な出力形式が必要であり、印刷する必要があることを示唆しています。どちらですか?たとえば、出力形式が何であっても、末尾の改行について話すことは完全に冗長のようです。
レトコラディ

1
@RetoKoradiは、表示されているように形式を多少変更する必要がありますが、対話型セッション、ファイル、ポップアップ、STDOUTなどにある可能性があります。 ?
アダム

回答:


6

Dyalog APL、10 7

コードは10バイト長で、ボーナスの資格があります。

3バイトのuser46915に感謝します!

,∘≢⌸∊⍕¨∊⍳⎕

(入力)はTryAPLでは機能しないことに注意してください。ここで関数形式を試すことができます

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

私は完全に理解していません 演算子をが{⍺}⌸、引き継がれた一意の値を{⍵}⌸リストし、引数内のそれらの場所をリストします。

これは、ラベルの多次元配列に数字が表示される順序であるため、正しい順序になっています。


1
うん、それは私が念頭に置いていたソリューションです。これは、キー演算子の理解に役立つ場合があります。
アダム

1
APLは常に codegolfで勝つとは限りませんか?
vy32

@ vy32いいえ。APLは最も簡潔な汎用言語かもしれませんが、特定の限られたドメインでは汎用言語よりも優れたドメイン固有の言語が常に存在します。コードゴルフの特定の領域内では、通常、PythやCJamなどのゴルフ言語が勝ちます。しかし、非常に大企業の生産で使用される商用言語であるAPLがさらに接近していることは注目に値します。また、やや冗長である代償として、ゴルフ言語よりも人間がAPLを読むことを学ぶ方がおそらく簡単です。
アダム

待ってください、そうすれば、私は,∘≢⌸ユニークなものなどの外部製品なしで単純にヒストグラム全体を作成できますか?!Dyalogは確かに素晴らしいです。また,∘≢⌸、よりも短いです{⍺,≢⍵}⌸
-user46915

3
@ NBZ、APLが恋しい。1982年に、APLでデイジーホイールプリンターを駆動するグラフィックパッケージを作成しました。1か月後に書いたことを理解できませんでしたが、それは芸術作品でした。
vy32


2

Mathematica、111 85バイト

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

ここでのほとんどの仕事はによって行われDigitCountます。


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

2

R、110バイト

Alex Aのおかげで4を節約しました(ありがとう!)

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

あなただけの使用xあなただけの1つの出現置き換えることができるはずですので、一度xではscan()。また、なぜ割り当てzますか?
アレックスA.

ありがとう。を使用しないことに同意しxます。私はの出力割り当てMapzそれ以外の変数をMap標準出力に出力を印刷します。より良い方法はMap内側にラップすることですinvisible()が、それは多くのキャラクターです
...-flodel

1

ルビー、92バイト

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

コマンドライン引数として長さを取ります:

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

0

CJam、31バイト

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

オンラインで試す

コードは34バイトで、空の入力リストを操作するために3バイトのボーナスが必要です。入力はCJam形式のリストです。例:

[1 2 3]

説明:

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バイト

import Data.List
l=mapM_(putStrLn.(\(h:r)->h:' ':show(length r+1))).group.sort.concatMap show.concat.sequence.map(\n->[1..n])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.