Набір багатовимірних міток


12

У багатовимірному світі парових панків наш начальник хоче прикріпити надруковані етикетки до кожного ящика в багатовимірному шафі файлів нашого конгломерату.

Бос хоче набрати весь аркуш етикетки як єдину форму, використовуючи шрифт, куплений лише для цієї мети, тому нам доведеться замовити сорти (металеві шматочки символів). Оскільки сорти є дуже дорогими, наше замовлення повинно бути точним для підрахунку кожної цифри-символу.

Для заданого (будь-яким способом) набору довжин розмірів ≥ 0 поверніть (будь-якими способами) наш порядок, який є таблицею частот цифр, необхідних для набору всіх декартових координат. Він повинен бути розташований за порядком появи клавіатури (тобто 0 після 9), і не може включати порядки 0 сортів, тому якщо сорти не потрібно замовляти взагалі (оскільки розмір має довжину 0); нічого не друкувати.

  • Бонус -3 сорти, якщо ваш код може обробляти (тобто нічого не друкувати) 0 розмірів.
  • Остаточні символи нового рядка прийнятні.
  • Заборона на стандартні лазівки діє.
  • Як згадувалося, сорти коштують дорого, тому це .

Добре душа може відредагувати цей виклик, щоб включити автоматизований бал, тому включіть заголовок, наприклад:
# LanguageName, 123 sorts

Тестові справи

Дано 11, надрукуйте:

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

тому що необхідні ярлики 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, і 11.


Дано 2 3, надрукуйте:

1 5
2 5
3 2

тому що необхідні ярлики 1 1, 1 2, 1 3, 2 1, 2 2, і 2 3.


Дано 2 0, надрукуйте порожній рядок:

або нічого.


Дано 1 2 3, надрукуйте:

1 11
2  5
3  2

тому що необхідні ярлики 1 1 1, 1 1 2, 1 1 3, 1 2 1, 1 2 2, і1 2 3


Дано 5 5 5 5, надрукуйте:

1 500
2 500
3 500
4 500
5 500

І ні, я не збираюся перераховувати всі 625 етикетки.


Мені трохи незрозуміло вимоги до виходу. У тексті написано "повернутись (будь-якими способами)", але решта говорить про те, що потрібен дуже специфічний вихідний формат і що його потрібно надрукувати. Який це? Наприклад, якщо говорити про відключення нових рядків, то видається абсолютно зайвим, якщо вихідний формат може бути будь-яким.
Рето Кораді

1
@RetoKoradi формат повинен виглядати більш-менш, як показано, але це може бути в інтерактивному сеансі, файлі, спливаючих вікнах, STDOUT тощо. Чи є у вас пропозиція, як я міг би сформулювати це, щоб зробити його зрозумілішим ?
Adám

Відповіді:


6

Діялог АПЛ, 10 7

Код завдовжки 10 байтів і відповідає критерію премії.

Дякуємо user46915 за 3 байти!

,∘≢⌸∊⍕¨∊⍳⎕

Зауважте, що (введення) не працює на TryAPL; ви можете спробувати форму функції тут .

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

Я не повністю розумію оператора, але {⍺}⌸перераховує унікальні значення, взяті на себе, і {⍵}⌸перераховує їх місця в аргументі.

Це правильне впорядкування, оскільки це порядок, в якому цифри з'являються у багатовимірному масиві міток.


1
Так, це рішення, яке я мав на увазі. Це може допомогти зрозуміти оператора ключа.
Adám

1
Чи APL не завжди виграє в codegolf?
vy32

@ vy32 №. APL може бути найбільш стислою загальною мовою, але завжди знайдуться доменні мови, які кращі для певного обмеженого домену, ніж будь-яка мова загального призначення. У межах конкретного домену кодового гольфу зазвичай виграють мови для гольфу, такі як Pyth та CJam. Однак, примітно, що APL, будучи комерційною мовою, яку використовують у виробництві дуже великі компанії, навіть підходить. Крім того, якщо ціна є дещо більш багатослівною, людям, мабуть, простіше навчитися читати APL, ніж мови для гри в гольф.
Adám

Зачекайте, ви маєте на увазі, що я можу зробити всю гістограму просто ,∘≢⌸без будь-яких зовнішніх продуктів з унікальними та такими ?! Діалог впевнений, що це дивовижно. Також ,∘≢⌸коротше, ніж {⍺,≢⍵}⌸.
user46915

3
@NBZ, я сумую за APL. Ще в 1982 році я написав графічний пакет в APL, який керував принтерним колесом принтера. Це був витвір мистецтва, хоча я не зрозумів, що написав через місяць.
vy32


2

Математика, 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}]&
алефальфа

2

R, 110 байт

Збережено 4 подяки Алексу А. (спасибі!)

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

Ви можете використовувати тільки xодин раз , так що ви просто повинні бути в змозі замінити одне входження xз scan(). Також навіщо призначати z?
Олексій А.

Дякую. Погодьтесь, що не використовувати x. Я призначив вихід Mapдо zзмінної інакше 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.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.