Skład etykiet wielowymiarowych

12

W wielowymiarowym świecie parowo-punkowym nasz szef chce przymocować drukowane etykiety indeksowe do każdej szuflady w wielowymiarowej szafce aktowej naszego konglomeratu.

Szef chce napisać cały arkusz etykiet jako pojedynczy formularz, używając czcionki kupionej tylko w tym celu, więc musimy zamówić rodzaje (metalowe symbole). Ponieważ sortowanie jest bardzo drogie, nasze zamówienie musi dotyczyć dokładnej liczby każdego symbolu cyfry.

Dla danego (w jakikolwiek sposób) zestawu długości o wymiarach ≥ 0, zwróć (w jakikolwiek sposób) nasze zamówienie, które jest tabelą częstotliwości cyfr wymaganych do wpisania wszystkich współrzędnych kartezjańskich. Musi być uporządkowany według kolejności wyświetlania na klawiaturze (tj. 0 po 9) i może nie zawierać zamówień 0 sortowań, więc jeśli sortowanie nie ma być wcale (ponieważ wymiar ma długość 0); nic nie drukuj.

  • Premia -3 sortuje, czy Twój kod nie obsługuje (tzn. Nic nie drukuje) również 0 wymiarów.
  • Końcowe znaki nowej linii są dopuszczalne.
  • Obowiązuje zakaz standardowych luk.
  • Jak wspomniano, rodzaje są drogie, dlatego jest to .

Życzliwa dusza może edytować to wyzwanie w celu włączenia automatycznej punktacji, dlatego dołącz nagłówek:
# LanguageName, 123 sorts

Przypadki testowe

Biorąc pod uwagę 11, wydrukuj:

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

ponieważ potrzebne są etykiety 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, i 11.


Biorąc pod uwagę 2 3, wydrukuj:

1 5
2 5
3 2

ponieważ potrzebne są etykiety 1 1, 1 2, 1 3, 2 1, 2 2, i 2 3.


Biorąc pod uwagę 2 0, wydrukuj pustą linię:

lub nic.


Biorąc pod uwagę 1 2 3, wydrukuj:

1 11
2  5
3  2

ponieważ potrzebne są etykiety 1 1 1, 1 1 2, 1 1 3, 1 2 1, 1 2 2, i1 2 3


Biorąc pod uwagę 5 5 5 5, wydrukuj:

1 500
2 500
3 500
4 500
5 500

I nie, nie wymienię wszystkich 625 etykiet.

Adám
źródło
Jestem trochę niejasny co do wymagań wyjściowych. W tekście jest napisane „powrót (w jakikolwiek sposób)”, ale reszta sugeruje, że wymagany jest bardzo specyficzny format wyjściowy i że należy go wydrukować. Który to? Np. Mówienie o końcowych znakach nowej linii wydaje się całkowicie zbędne, jeśli format wyjściowy może być dowolny.
Reto Koradi,
1
@RetoKoradi format musi wyglądać mniej więcej tak, jak pokazano, ale może to być sesja interaktywna, plik, wyskakujące okienko, STDOUT itp. Czy masz sugestię, jak mogę to sformułować, aby było jaśniej ?
Adám

Odpowiedzi:

6

Dyalog APL, 10 7

Kod ma długość 10 bajtów i kwalifikuje się do otrzymania premii.

Podziękowania dla user46915 za 3 bajty!

,∘≢⌸∊⍕¨∊⍳⎕

Zauważ, że (wejście) nie działa na TryAPL; możesz wypróbować tutaj formularz funkcji .

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

Nie do końca rozumiem operatora, ale {⍺}⌸wymienia przyjęte unikalne wartości i {⍵}⌸podaje ich miejsca w argumencie.

Ma to prawidłową kolejność, ponieważ jest to kolejność, w jakiej cyfry pojawiają się w wielowymiarowej tablicy etykiet.

lirtosiast
źródło
1
Tak, to było rozwiązanie, które miałem na myśli. Może to pomóc w zrozumieniu głównego operatora.
Adám
1
Czy APL nie zawsze wygrywa w codegolf?
vy32
@ vy32 Nie. APL może być najbardziej zwięzłym językiem ogólnego przeznaczenia, ale zawsze będą języki specyficzne dla domeny, które są lepsze w pewnej ograniczonej domenie niż jakikolwiek język ogólnego przeznaczenia. W specyficznej dziedzinie gry w golfa języki takie jak Pyth i CJam zwykle wygrywają. Jednak niezwykłe jest to, że APL, będący językiem komercyjnym używanym w produkcji przez bardzo duże firmy, jest jeszcze bliższy. Ponadto, ponieważ cena jest nieco bardziej szczegółowa, ludziom łatwiej jest nauczyć się czytać APL niż języki gry w golfa.
Adám
Czekaj, więc masz na myśli, że mogę zrobić cały histogram ,∘≢⌸bez żadnych produktów zewnętrznych z wyjątkowymi i takimi ?! Dyalog z pewnością jest niesamowity. ,∘≢⌸Jest także krótszy niż {⍺,≢⍵}⌸.
user46915
3
@NBZ, tęsknię za APL. W 1982 roku napisałem pakiet graficzny w APL, który napędzał drukarkę z kółkiem. Było to dzieło sztuki, chociaż nie rozumiałem, co napisałem miesiąc później.
vy32
10

Mathematica, 48 bajtów - 3 = 45

Grid@Tally@Flatten@IntegerDigits@Tuples@Range@#&
alephalpha
źródło
1
To jest piękne.
lirtosiast
2

Mathematica, 111 85 bajtów

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

Większość pracy tutaj wykonuje DigitCount.

LegionMammal978
źródło
Grid[Thread@{Range@10~Mod~10,DigitCount@Tuples@Range@#~Total~2}~DeleteCases~{_,0}]&
alephalpha
2

R, 110 bajtów

Zapisane 4 dzięki Alex A. (dzięki!)

U=unlist
X=table(U(strsplit(as.character(U(expand.grid(Map(seq_len,scan())))),"")))
z=Map(cat,names(X),X,"\n")
flodel
źródło
Użyć tylko xraz, więc należy po prostu być w stanie zastąpić jedno wystąpienie xz scan(). Również po co przypisywać z?
Alex A.,
Dzięki. Zgadzam się na nieużywanie x. Przypisałem wyjście zmiennej Mapdo, w zprzeciwnym Maprazie wydrukowałoby wyjście na standardowe wyjście. Lepszą praktyką byłoby owinięcie się w Mapśrodku, invisible()ale to dużo postaci ...
flodel
1

Rubin, 92 bajty

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

Traktuje długości jako argumenty wiersza poleceń:

$ ruby foo.rb 1 2 3
1 11
2 5
3 2
daniero
źródło
0

CJam, 31 bajtów

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

Wypróbuj online

Kod ma 34 bajty i wymaga 3 bajtów premii za pracę z pustą listą wejściową. Dane wejściowe to lista w formacie CJam, np .:

[1 2 3]

Wyjaśnienie:

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
źródło
0

Pyth, 15 bajtów

rjko%N_Ts*FSMQ8
isaacg
źródło
0

Haskell, 125 bajtów

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
źródło