Ein echtes Wurstfest

35

Da das erste Oktoberwochenende naht, lasst uns unser eigenes Oktoberfest veranstalten!

Hintergrund

Sie und einige andere Programmierer wurden von den örtlichen Wursthändlern in München engagiert. Die Wurstjungs versorgen das Oktoberfest mit allen Würsten, die das riesige Volksfest braucht. Sie können mithören, wie Ihr Chef mit den anderen Mitarbeitern darüber spricht, warum Sie und die anderen ohne Erfahrung im Zusammenhang mit Wurst eingestellt wurden. Sie stellen fest, dass Sie für Ihre tadellosen Programmierkenntnisse eingestellt wurden - und Ihr Chef möchte anscheinend, dass Sie einen Wurstanalysator codieren.

In diesem Jahr haben die Wurstbäuerinnen beschlossen, die Wurstvielfalt auf dem Oktoberfest zu erhöhen - aber sie haben keine Ahnung, wie viel sie importiert haben.

Herausforderung

Sie müssen Ihrem Chef helfen, herauszufinden, wie viel Wurst einer bestimmten Art er tatsächlich importiert hat. Sie müssen einen Wurstanalysator programmieren, der die Art und Anzahl jeder Wurst ausgibt, die die Wurstjungs importiert haben. Ihr Chef hat zu diesem Anlass ein spezielles Diskettenlaufwerk gekauft, auf das eine Wurst pfeift stdin.

Eingang

Eine Anzahl von Würsten auf stdin, wobei jede Wurst durch ein Leerzeichen getrennt ist. Würste werden in folgendem Format angeboten:

Prinskorv (P)

 ¤
| |
| |
| |
 ¤

Salchichón (S)

 l
| |
| |
| |
| |
 l

Landjäger (L)

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

Kabanos (K)

.
|
|
|
|
|
.

Cotechino Modena (C)

 ___
|   |
|   |
|   |
|___|

Rød pølse (R)

 ^
| |
| |
| |
| |
 v

Ausgabe

Das Vorkommen einer bestimmten Wurst zusammen mit einer Kennzeichnung, um welche Wurstart es sich handelt, getrennt durch ein Leerzeichen. Die Kennung ist der erste Buchstabe im Namen der Wurst. Ordnung ist nicht wichtig.

Die Ausgabe muss in stdoutZeilenumbrüche und Leerzeichen erfolgen.

Beispiele

Eingang

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

Ausgabe

4R 1K

Eingang

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

Ausgabe

1L 1C 1S 2P

Eingang

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

Ausgabe

2S 1P

Der Programmierer mit dem kürzesten Programm in Bytes wird von den Wurstleuten bezahlt (gewinnt)!

Wurst Trivia

Prinskorv
Prinskorv, was direkt mit "Prinzwurst" übersetzt wird, ist eine kleine schwedische Wurst, die oft in Gliedern verkauft wird. Normalerweise in einer Pfanne gebraten und mit einer großzügigen Portion Senf serviert.

Salchichón
Salchichón ist eine spanische Sommerwurst, die oft mit Schweinefleisch zubereitet wird. Einige Rezepte verwenden jedoch auch anderes Fleisch wie Ochsen, Kalb oder Pferd. Das Fleisch und das Fett werden in dünne Stücke geschnitten, mit Salz, Pfeffer, Muskat, Oregano und Knoblauch gewürzt und dann in dicken natürlichen Schweinefleischdarm eingelegt.

Landjäger
Landjäger ist eine halbgetrocknete Wurst, die traditionell in Süddeutschland, Österreich, der Schweiz und dem Elsass hergestellt wird. Es ist beliebt als Snack bei Aktivitäten wie Wandern. Es hat auch eine Geschichte als Soldatennahrung, weil es ohne Abkühlung hält und in einzelnen Mahlzeitportionen kommt.

Kabanos
Kabanos ist eine lange dünne polnische Trockenwurst aus Schweinefleisch oder koscherer Pute. Sie haben einen rauchigen Geschmack und können je nach Frische weich oder sehr trocken sein. Kabanosy werden oft nur mit Pfeffer gewürzt. Im Gegensatz zu anderen Fleischsorten werden diese Würste normalerweise als Vorspeise allein verzehrt und, außer wenn sie koscher sind, häufig mit Käse serviert.

Cotechino Modena
Cotechino Modena oder Cotechino di Modena ist eine frische Wurst aus Schweinefleisch, Backfett und Schwarte und stammt aus Modena, Italien, wo sie den Status einer ggA hat. Cotechino wird oft mit Linsen oder Cannellinibohnen mit einer Sauce neben Kartoffelpüree serviert, besonders zu Neujahr.

Rød pølse
Rød pølse (rote Wurst) ist eine in Dänemark sehr verbreitete Art hellroter, gekochter Schweinewurst. Da Hot-Dog-Stände in Dänemark allgegenwärtig sind, betrachten manche Leute Røde Pølser als eines der Nationalgerichte.

Alle Wurstinformationen schamlos aus Wikipedia kopiert

Süßkartoffel
quelle
32
Sie schreiben eine Oktoberfest-Challenge zum Thema Wurst, die keine Weißwurst enthält ? -1
Martin Ender
3
Ich beschuldige diese düsteren Würstchen!
Sweerpotato
31
Warum haben Sie die Wurstinformationen in ein Spoiler-Tag eingefügt? Soll das verhindern, dass es schlecht wird?
Alex A.
10
@ Martinbüttner naja ich denke man könnte sagen ... das war die wurst idee überhaupt!
DankMemes
2
Nachgestellte Leerzeichen sind erlaubt. Ich denke, ich wollte Leerzeichen schreiben, anstatt Zeilenumbrüche zu setzen. Jetzt sind beide erlaubt!
Sweerpotato

Antworten:

8

Pyth, 30 Bytes

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

Probieren Sie es online aus: Demo oder Test Suite

Erläuterung:

Wie alle anderen Teilnehmer schaue ich nur auf die erste Zeile der Eingabe. Angenommen, die erste Zeile der Eingabe ist \ / ___ l ¤ ¤ ____.

Zuerst habe ich mich nach Leerzeichen aufgeteilt, was mir die Liste gibt

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

Jetzt wollen wir '/'s und ''s reiten und den Rest sortieren.

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

Jetzt kann ich es in voller Länge codieren.

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

Wie sich herausstellt, kann die Reihenfolge (ASCII-Wert) dieser Zeichen oder der Zeichenfolge '___' den Zahlen gut zugeordnet werden [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     

Und dies kann verwendet werden, um sie direkt den Buchstaben zuzuordnen 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
Jakube
quelle
19

Pyth, 36 34 32 30 Bytes

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

Gespeichert noch eine weitere 2 Bytes dank ... guess who? : D

Ignoriert alle Eingaben mit Ausnahme der ersten Zeile, entfernt alle /s und Leerzeichen, übersetzt sie in die Ziel-IDs, sortiert sie, verwendet die Lauflängencodierung und druckt das Ergebnis.

Live-Demo.

32-Byte-Version

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

Live-Demo.

2 weitere Bytes dank @Jakube gespart!

34-Byte-Version

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

Live-Demo.

2 Bytes gespart dank @Jakube!

36-Byte-Version

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

Live-Demo.

kirbyfan64sos
quelle
6
Ich habe dir +1 gegeben, weil ich Kirby
Nacht - Reinstate Monica
6
Ich habe dir keine +1 gegeben, weil du genau 4k rep bist :)
ETHproductions
Ich habe dir eine -1 gegeben, um dich wieder auf genau 4k zu bringen: D
Beta Decay
1
Weitere zwei Bytes ;-) hM-czd\\sind dasselbe wie-hMfTczd\\
Jakube
1
@sweerpotato Siehe hier . Das ¤sind zwei Bytes.
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` `

Es ist ziemlich einfach, aber hier ist trotzdem eine Erklärung:

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` `
DankMemes
quelle
3
Sehr schlau! Unter Verwendung des Array-Verständnisses von ES7 zum Golfspielen dieser Version erhielt ich 91: a=>(h=-1,[for(g of'¤l/._^')if(f=(a.split(g).length-1)/'222261'[++h])f+'PSLKCR'[h]].join` `)Wenn ich nur die Deklaration von h...
ETHproductions 02.10.15
@ETHproductions cool! Ich sollte ES7 lernen
DankMemes
8

CJam, 38 35 33 Bytes

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

Teste es hier.

Erläuterung

Die erste Zeile jeder Wurstsorte ist ein Unikat. Da die Würste oben ausgerichtet sind, ist es ausreichend, die relevanten Zeichen in dieser ersten Zeile zu zählen. Zwei Arten erfordern eine besondere Behandlung:

  • Landjäger (L) haben beide \und /. Wir wollen einen von ihnen loswerden, dann können wir den anderen wie alle anderen Charaktere zählen.
  • Cotechino Modena (C) hat drei Unterstriche, daher müssen wir die Unterstriche durch 3 teilen. Es ist jedoch tatsächlich kürzer, Unterstriche einzeln zu behandeln, indem Sie einfach Serien von ihnen in der Eingabe (die immer nur zu einer Wurst gehören) durch die ersetzen Zielcharakter Csofort.

Nun zum eigentlichen Code:

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.
Martin Ender
quelle
Was auch immer Sie tun, vergessen Sie nicht, Splurk.
Taylor Lopez
6

Mathematica 116

Einige Bytes könnten sich wahrscheinlich abschneiden, aber nichts, was sich den Golfsprachen nähern könnte.

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

ImportString[#,"Table"][[1]]Gibt eine Liste von durch Leerzeichen getrennten Zeichenfolgen zurück, die in der oberen Zeile der Eingabe angezeigt werden. Die Zeichenfolge kann ein beliebiges Element in der Liste enthalten {"¤","l","/","___",".","^"}, einschließlich Wiederholungen. Jedes Element ist mit einer einzigartigen Wurstsorte verbunden.

Tally Zählt die Häufigkeit, mit der eine solche Zeichenfolge angezeigt wird.

/.{"¤"->"P","l"->"S",...ersetzt ¤mit P, lmit Sund so weiter.

Reverse Platziert jede Zählung vor dem Element, dem sie zugeordnet ist.

Die beiden Rows formatieren die Ausgabe.

DavidC
quelle
6

MATLAB, 113

Unter der Annahme, dass nachfolgende Leerzeichen zulässig sind (ja, das sind sie), ist hier eine anonyme MATLAB-Funktion:

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

Und eine Erklärung:

@(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)
             )

Scheint richtig zu funktionieren. Hat noch den nachgestellten Platz, behandelt aber jetzt alle Würste richtig.

Tom Carpenter
quelle
3

Perl, 84 77 Bytes

Jemand könnte sich wahrscheinlich ein bisschen davon rasieren ...

84 Bytes

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

77 Bytes

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

Nervenzusammenbruch:

Nehmen Sie die erste Zeile von STDIN, übersetzen Sie die Werte in Buchstabencodes und löschen Sie zusätzlichen Müll. Der dModifikator sollte eigentlich nicht nötig sein, aber ich bin auf seltsame Unicode-Probleme gestoßen¤ Charakter ohne ihn.

Verwenden Sie eine symbolische Referenz, um für jedes gefundene Zeichen eine Variable zu erstellen und / oder zu erhöhen.

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

Teilen Sie die C-Variable durch 3, da der Unterstrich dreifach ist

$C /= 3;

Durchlaufen Sie das Alphabet und drucken Sie Großbuchstaben zusammen mit Buchstaben, wenn der Wert größer als Null ist

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

Testergebnis: http://ideone.com/alpUlI

Bearbeiten : Hacken Sie 7 Bytes, indem Sie den anonymen Rückgabewert direkt an den Transkriptor übergeben split.

ChicagoRedSox
quelle
2

Perl, 172 Bytes

Daresay mehr kann noch von dieser Wurst geschnitten werden, aber hier ist eine Vorspeise für zehn.

$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"

Ungolfed-Version

$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";

Testergebnisse

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

Python 3, 120 Bytes

Ich bin mir ziemlich sicher, dass Sie dies verkürzen können, aber es gab noch keine Python-Lösung.

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]))

Erläuterung

Es ist ziemlich einfach, manche sagen vielleicht sogar lesbar, aber hier ist trotzdem eine kurze Erklärung:

Zuerst wird eine Eingabezeile gelesen, da jede Wurst nur aus der ersten Zeile bestimmt werden kann.

Jetzt a={z:x.count(y)for y,z in zip('¤l/.^_','PSLKRC')}gibt es ein Wörterbuchverständnis, das die Kennung jeder Wurstsorte ( z) der Zählung jeder Wurstsorte ( x.count(y), woy das die Wurst definierende Zeichen ist) .

Wir dividieren dann die Anzahl der Cotechino Modena (C) Würste durch 3, da der dreifache Unterstrich vorliegt.

Schließlich drucken wir das Ergebnis aus: print(' '.join(str(a[x])+x for x in a if a[x])). Dadurch wird die Ausgabezählung für jede Wurst a[x]einzeln erstellt , jedoch nur, wenn diese Wurst mindestens einmal gesehen wurde ( ungleich Null => Wahrheit). Jede Zählzeichenfolge wird durch ein Leerzeichen verbunden und ausgedruckt.

IceDingo
quelle
print 'a [x]' + '' + a [x] für ... Sollte funktionieren (nicht getestet) und spart 5 Bytes. Mit einem Backtick.
Am