Prawdziwy festiwal kiełbasy


35

Ponieważ zbliża się pierwszy weekend października, przygotujmy swój własny Oktoberfest!

tło

Ty i niektórzy inni programiści zostali zatrudnieni przez lokalnych kiełbas w Monachium w Niemczech. Faceci z kiełbasą dostarczają Oktoberfestowi wszystkich kiełbas, których potrzebuje gigantyczny Volksfest. Udało ci się podsłuchać, jak szef rozmawia z innymi pracownikami o tym, dlaczego ty i inni zostaliście zatrudnieni bez wcześniejszego doświadczenia związanego z kiełbasą. Zdajesz sobie sprawę, że zostałeś zatrudniony za nienaganną umiejętność programowania - a twój szef najwyraźniej chce, abyś napisał kod do analizatora kiełbas.

W tym roku faceci z kiełbasami postanowili zwiększyć różnorodność kiełbas na Oktoberfest - ale nie mają pojęcia, ile zaimportowali.

Wyzwanie

Musisz pomóc swojemu szefowi dowiedzieć się, ile kiełbasy faktycznie zaimportowali. Będziesz musiał zaprogramować analizator kiełbasy, który wyświetli rodzaj i liczbę każdej kiełbasy importowanej przez facetów z kiełbasy. Twój szef kupił na tę okazję specjalną stację dyskietek, która z uwagi na kiełbasę doprowadza ją do tego stdin.

Wkład

Kilka kiełbas stdin, każda kiełbasa oddzielona jedną spacją. Kiełbasy podawane są w następującym formacie:

Prinskorv (P)

 ¤
| |
| |
| |
 ¤

Salchichón (S)

 l
| |
| |
| |
| |
 l

Landjäger (L)

\ /
| |
| |
| |
| |
/ \

Kabanos (K)

.
|
|
|
|
|
.

Cotechino Modena (C)

 ___
|   |
|   |
|   |
|___|

Rød pølse (R)

 ^
| |
| |
| |
| |
 v

Wydajność

Wystąpienia danej kiełbasy wraz z identyfikatorem rodzaju kiełbasy, oddzielone spacją. Identyfikator to pierwsza litera w nazwie kiełbasy. Porządek nie jest ważny.

Dane wyjściowe są zapisywane stdout, dozwolone są nowe znaki końcowe i spacje.

Przykłady

Wkład

 ^   ^   ^   ^  .
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
 v   v   v   v  |
                .

Wydajność

4R 1K

Wkład

\ /  ___   l   ¤   ¤
| | |   | | | | | | |
| | |   | | | | | | |
| | |   | | | | | | |
| | |___| | |  ¤   ¤
/ \        l

Wydajność

1L 1C 1S 2P

Wkład

 l   ¤   l
| | | | | |
| | | | | |
| | | | | |
| |  ¤  | |
 l       l

Wydajność

2S 1P

Programista z najkrótszym programem w bajtach otrzymuje wynagrodzenie od gości z kiełbasą (wygrywa)!

Ciekawostki o kiełbasach

Prinskorv
Prinskorv, co bezpośrednio przekłada się na „kiełbasę książęcą”, to mała szwedzka kiełbasa, często sprzedawana w ogniwach. Zwykle smażony na patelni i podawany z obfitą porcją musztardy.

Salchichón
Salchichón to hiszpańska kiełbasa letnia często przygotowywana z wieprzowiny, chociaż niektóre przepisy zawierają inne mięso, w tym wołowe, cielęce lub końskie. Mięso i tłuszcz siekamy na cienkie kawałki, doprawiamy solą, pieprzem, gałką muszkatołową, oregano i czosnkiem, a następnie wkładamy do grubych, naturalnych jelit wieprzowych.

Landjäger
Landjäger to kiełbasa częściowo suszona tradycyjnie wytwarzana w południowych Niemczech, Austrii, Szwajcarii i Alzacji. Jest popularny jako przekąska podczas aktywności takich jak wędrówki. Ma również historię żywności żołnierskiej, ponieważ utrzymuje się bez chłodzenia i jest dostarczana w porcjach z jednym posiłkiem.

Kabanos
Kabanos to polska długa cienka sucha kiełbasa z wieprzowiny lub koszernego indyka. Są dymne i mogą mieć miękką lub bardzo wytrawną konsystencję w zależności od świeżości. Kabanosy są często przyprawiane tylko pieprzem. W przeciwieństwie do innych mięs, kiełbasy te są zwykle spożywane same jako przystawka i, z wyjątkiem koszernych, często podawane z serem.

Cotechino Modena
Cotechino Modena lub Cotechino di Modena to świeża kiełbasa z wieprzowiny, tłuszczu i skórki wieprzowej, pochodząca z Modeny we Włoszech, gdzie ma status ChOG. Cotechino jest często podawane z soczewicą lub fasolą cannellini z sosem obok tłuczonych ziemniaków, szczególnie w okolicach Nowego Roku.

Rød pølse
Rød pølse (czerwona kiełbasa) to rodzaj jaskrawo czerwonej gotowanej kiełbasy wieprzowej bardzo popularnej w Danii. Ponieważ stoiska z hot dogami są w Danii wszechobecne, niektórzy uważają røde pølser za jedną z dań narodowych.

Wszystkie informacje o kiełbasach bezwstydnie skopiowane z Wikipedii


32
Piszesz wyzwanie związane z kiełbaskami o tematyce Oktoberfest i nie obejmuje ono Weißwurst ? -1
Martin Ender

3
Obwiniam tych nikczemnych kiełbasianych facetów!
sweerpotato,

31
Dlaczego umieściłeś informacje o kiełbasach w tagu spoilera? Czy to ma powstrzymać go przed pogorszeniem?
Alex A.

10
@ MartinBüttner Wydaje mi się, że można powiedzieć ... to był najdziwniejszy pomysł na świecie!
DankMemes

2
Końcowe spacje są dozwolone. Myślę, że chciałem pisać końcowe spacje zamiast końcowych znaków nowej linii. Teraz oba są dozwolone!
sweerpotato,

Odpowiedzi:


8

Pyth, 30 bajtów

jdm+hd@"SKLCRP"%Ced45rS-czd\/8

Wypróbuj online: pakiet demonstracyjny lub testowy

Wyjaśnienie:

Jak wszyscy inni uczestnicy patrzę tylko na pierwszy wiersz danych wejściowych. Powiedzmy, że pierwszy wiersz danych wejściowych to \ / ___ l ¤ ¤ ____.

Na początku dzielę spacje, co daje mi listę

['\\', '/', '', '___', '', '', 'l', '', '', '¤', '', '', '¤', '', '___']

Teraz chcemy przejechać '/'si ''si i posortować pozostałe rzeczy.

['\\', '___', '___', 'l', '¤', '¤']

Teraz mogę go zakodować na całej długości.

[[1, '\\'], [2, '___'], [1, 'l'], [2, '¤']]

Jak się okazuje, kolejność (wartość ascii) tych znaków lub ciągu '___' można ładnie odwzorować na liczby [0, 1, 2, 3, 4, 5].

char/string |  l   .   \    ___    ^   ¤  
-------------------------------------------
value       | 108  46  92 6250335  94 164  
value%45    |  18   1   2      15   4  29    
(value%45)%6|   0   1   2       3   4   5     

Można to wykorzystać do mapowania ich bezpośrednio na litery SKLCRP.

jdm+hd@"SKLCRP"%Ced45rS-czd\/8
                        czd     split the input string at spaces
                       -   \/   remove "/"s (and also ""s)
                      S         sort
                     r       8  run-length-encode
  m                             map each pair d of ^ to:
   +hd                            d[0] + 
                Ced               convert d[1] to a number
               %   45             mod 45
      @"SKLCRP"                   take the ^th element in the string (mod 6)
jd                              join by spaces

19

Pyth, 36 34 32 30 bajtów

XjdsMrShM-czd\\8"¤_l/^.KRLSCP

Zapisany jeszcze inny 2 bajty dzięki ... zgadnij kto? :RE

Ignoruje wszystkie dane wejściowe oprócz pierwszego wiersza, usuwa wszystkie /s i spacje, tłumaczy je na identyfikatory docelowe, sortuje, używa kodowania długości przebiegu i wypisuje wynik.

Demo na żywo.

Wersja 32-bajtowa

XjdsMrS-hMfTczd\\8"¤_l/^.KRLSCP

Demo na żywo.

Zaoszczędź kolejne 2 bajty dzięki @Jakube!

Wersja 34-bajtowa

jdsMrSX-hMfTczd\\"¤_l/^.KRLSCP")8

Demo na żywo.

Zaoszczędź 2 bajty dzięki @Jakube!

Wersja 36-bajtowa

jdsMrSX-hMfTczd\/"¤_l\\^.""PCSLRK"8

Demo na żywo.


6
Dałem ci +1, ponieważ uwielbiam Kirby
Nacht - Przywróć Monikę

6
Nie dałem ci +1, ponieważ masz dokładnie 4k powtórzeń :)
ETHproductions

Dałem ci -1, abyś wrócił do dokładnie 4k: D
Beta Decay

1
Kolejne dwa bajty ;-) hM-czd\\to to samo co-hMfTczd\\
Jakube

1
@sweerpotato Zobacz tutaj . To ¤dwa bajty.
kirbyfan64sos

8

JavaScript (ES6), 105

a=>[...'¤l/._^'].map((g,h)=>(f=(a.split(g).length-1)/'222261'[h],f?f+'PSLKCR'[h]:0)).filter(b=>b).join` `

To dość proste, ale i tak oto wyjaśnienie:

input=>
  // list of all unique characters of the sausages
  [...'¤l/._^'].map((sausage_char, index)=>(
    // find all occurrences of the character in the string
    occurrences = (input.split(sausage_char).length - 1)
      / '222261'[index], // divide by the number of that character in its sausage
      // when dividing and multiplying by numbers in strings, JS automatically casts them
    occurrences ? // is there anything for this sausage?
      occurrences + 'PSLKCR'[index] : // add the sausage's letter and count
      0 // return 0 so it can be filtered out
  ))
  // filter out the 0s
  .filter(b=>b)
  // return a space-separated string
  .join` `

3
Bardzo mądry! Używając tablic ES7 do gry w golfa w tej wersji, otrzymałem 91: a=>(h=-1,[for(g of'¤l/._^')if(f=(a.split(g).length-1)/'222261'[++h])f+'PSLKCR'[h]].join` `)Gdybym tylko mógł uprościć deklarację h...
ETHproductions

@ETHproductions cool! Powinienem nauczyć się
ES7

8

CJam, 38 35 33 bajtów

l'_%'C*"l¤\^./""SPLRK "erS-$e`S*

Sprawdź to tutaj.

Wyjaśnienie

Pierwszy wiersz każdego rodzaju kiełbasy jest unikalny, a ponieważ kiełbasy są wyrównane u góry, wystarczy policzyć odpowiednie znaki w tym pierwszym wierszu. Dwa rodzaje wymagają specjalnego traktowania:

  • Landjäger (L) ma zarówno \i /. Chcemy pozbyć się jednego z nich, a następnie policzyć drugiego tak jak wszystkie pozostałe postacie.
  • Cotechino Modena (C) ma trzy podkreślenia, więc musimy podzielić liczbę podkreśleń przez 3. Jednak w rzeczywistości krótsze jest potraktowanie podkreślników indywidualnie, po prostu zastępując ich serie na wejściu (które zawsze będą należeć tylko do jednej kiełbasy) docelowa postać Cod razu.

Teraz rzeczywisty kod:

l         e# Read one line from STDIN.
'_%       e# Split on runs of underscores.
'C*       e# Join back together by C's.
"l¤\^./"  e# Push a string with characters corresponding to each type, and a slash.
"SPLRK "  e# Push a string with the corresponding letters and a space.
er        e# Transliterate, turning each identifying character into the correct
          e# letter and all slashes into spaces.
S-        e# Remove spaces (which also gets rid of what used to be slashes).
$         e# Sort the string to group each letter.
e`        e# Run-length encode.
S*        e# Join by spaces.

Cokolwiek robisz, nie zapomnij o Splurk.
Taylor Lopez

6

Mathematica 116

Niektóre bajty prawdopodobnie mogłyby się zgolić, ale nic nie zbliżało się do języków golfowych.

Row[Row/@Reverse/@Tally@ImportString[#,"Table"][[1]]/.{"¤"->"P","l"->"S","/"->"L","___"->"C","."->"K","^"->"R"}," "] &

ImportString[#,"Table"][[1]]zwraca listę rozdzielonych spacjami ciągów pojawiających się w górnym wierszu wejścia. Ciąg może zawierać dowolny element na liście, {"¤","l","/","___",".","^"}w tym powtórzenia. Każdy element związany jest z unikalnym rodzajem kiełbasy.

Tally zlicza liczbę wyświetleń każdego takiego ciągu.

/.{"¤"->"P","l"->"S",...zastępuje ¤się P, lze Si tak dalej.

Reverse umieszcza każdą sumę przed elementem, z którym jest powiązana.

Dwa Rows formatują wyjście.


6

MATLAB, 113

Zakładając, że końcowe spacje są dozwolone (tak są), oto anonimowa funkcja MATLAB:

@(a)arrayfun(@(p,m)fprintf([(m>32&&p)*'%d%c ' ''],p,m),histc(strtok(strrep(a,'___','_'),10),'./\^_l¤'),'K LRCSP')

I wyjaśnienie:

@(a) %Anonymous function, with an input a
    arrayfun(@(p,m) %Loop through the two input arrays (see later)
                   fprintf( %Print to console
                           [(m>32&&p)*'%d%c ' ''] %Essentially this means if p>0 and m>' ', print an integer followed by a char, then a space
                                                 ,p,m) %The values from the array input is what is getting printed
                                                      ,histc( %Make an array of how many times 
                                                                       strtok(strrep(a,'___','_'),10), %Keep only the first line (as that is where the interesting bit is) and also replace ___ with _ for the 'C'
                                                             './\^_l¤'), %these inputs appear (which will be passed in turn as the 'p' variable to cellfun)
                                                                        'K LRCSP' %These are the characters to be printed with the count representing each sausage (it will be placed in the 'm' input of arrayfun)
             )

Wydaje się działać poprawnie. Nadal ma miejsce na końcu, ale teraz poprawnie obsługuje wszystkie kiełbasy.


3

Perl, 84 77 bajtów

Ktoś prawdopodobnie mógłby się trochę zgolić ...

84 bajtów

($s=<>)=~y|_^\.l\\¤|CRKSLP|d;$$_++for split//,$s;$C/=3;for(A..Z){print"$$_$_ "if$$_}

77 bajtów

$$_++for split//,<>=~y|_^\.l\\¤|CRKSLP|dr;$C/=3;for(A..Z){print"$$_$_ "if$$_}

Awaria:

Weź pierwszy wiersz STDIN, transliteruj wartości na kody literowe, usuń dodatkowe śmieci. dModyfikator nie powinno być naprawdę konieczne, ale wpadłem na dziwnych problemów na unicode¤ charakter bez niego.

Użyj odwołania symbolicznego, aby utworzyć i / lub zwiększyć wartość zmiennej dla każdego znalezionego znaku.

$$_++ for split //, <> =~ y|_^\.l\\¤|CRKSLP|dr;

Podziel zmienną C przez 3, z powodu potrójnego podkreślenia

$C /= 3;

Zapętlaj alfabet i drukuj jednolite litery zmiennych wraz z literą, jeśli mają wartość większą niż zero

for (A..Z) {
    print "$$_$_ " if $$_;
}

Wynik testu: http://ideone.com/alpUlI

Edycja : Posiekaj 7 bajtów, przesyłając anonimową wartość zwrotną bezpośrednio do split.


2

Perl, 172 bajty

Jeszcze więcej można odciąć od tej kiełbasy, ale oto przystawka na dziesięć.

$a=<>;$a=~s/¤/h/g;$a=~s/_+/_/g;$a=~s/(\/| |\n)//g;$a=~s/\\/x/g;$h{$_}++ for split(//,$a);foreach (sort keys %h){print $h{$_};$_=~tr/^.hlx_/RKPSLC/;print "$_ ";}print "\n"

Wersja bez golfa

$a=<>;              # get 1st line
$a=~s/¤/h/g;        # convert ¤ to h, avoid unicode hassles
$a=~s/_+/_/g;       # multiple consecutive _ to single _
$a=~s/(\/| |\n)//g; # strip / and spaces
$a=~s/\\/x/g;       # convert \\ to x to avoid regexp hassles

# build hash that counts occurences of character
$h{$_}++ for split(//,$a);

# print the answers
foreach (sort keys %h) {
 print $h{$_};
 $_=~tr/^.hlx_/RKPSLC/;
 print "$_ ";
}
print "\n";

Wyniki testów

$ perl meaty.pl <test1.txt
1K 4R
$ perl meaty.pl <test2.txt
1C 2P 1S 1L
$ perl meaty.pl <test3.txt
1P 2S
$

2

Python 3, 120 bajtów

Jestem pewien, że możesz to skrócić, ale nie było jeszcze rozwiązania w języku Python, więc zaczynamy:

x=input()
a={z:x.count(y)for y,z in zip('¤l/.^_','PSLKRC')}
a['C']//=3
print(' '.join(str(a[x])+x for x in a if a[x]))

Wyjaśnienie

To dość proste, niektórzy mogą nawet powiedzieć, że są czytelne, ale i tak krótkie wyjaśnienie:

Odczytywany jest pierwszy wiersz wprowadzania, ponieważ każdą kiełbasę można określić na podstawie pierwszego wiersza.

Teraz a={z:x.count(y)for y,z in zip('¤l/.^_','PSLKRC')}jest słownikowe zrozumienie, które mapuje identyfikator każdego rodzaju kiełbasy ( z) na liczbę każdego rodzaju kiełbasy ( x.count(y)gdziey jest znak definiujący kiełbasę).

Następnie dzielimy liczbę kiełbas Cotechino Modena (C) przez 3 z powodu potrójnego podkreślenia.

Wreszcie możemy wydrukować wynik: print(' '.join(str(a[x])+x for x in a if a[x])). Tworzy to liczbę wyjściową każdej kiełbasy pojedynczo, ale tylko wtedy, gdy ta kiełbasa była widoczna co najmniej raz ( a[x]nie jest równa zero => Prawda). Każdy ciąg zliczania jest połączony spacją i drukowany.


wypisz „a [x]” + „” + a [x] dla ... Powinny działać (nie testowane) i oszczędzają 5 bajtów. Z „byciem wstecznym”.
przed
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.