Справжній ковбасний фест


35

Оскільки перший вихідний жовтня наближається, давайте мати свій Октоберфест!

Фон

Вас та деяких інших програмістів найняли місцеві хлопці з ковбасних виробів у Мюнхені, Німеччина. Хлопці з ковбасою забезпечують Октоберфест усіма ковбасками, яким потрібен гігантський Volksfest. Вам вдається підслухати свого начальника, розмовляючи з іншими працівниками про те, чому ви та інші були найняті без будь-якого попереднього досвіду, пов’язаного з ковбасою. Ви розумієте, що вас найняли за бездоганну майстерність програмування - і ваш начальник, мабуть, хоче, щоб ви кодували аналізатор ковбаси.

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

Виклик

Вам потрібно допомогти своєму начальникові розібратися, скільки ковбаси певного виду вони насправді імпортували. Вам доведеться запрограмувати аналізатор ковбас, який видає вид та кількість кожної ковбаси, яку імпортували хлопці ковбаси. З цього приводу ваш начальник придбав спеціальний дискети, який, даючи ковбасу, подає її stdin.

Вхідні дані

Кілька ковбасок stdin, кожна ковбаса розділена одним пробілом. Ковбаски подаються у такому форматі:

Прінскорв (P)

 ¤
| |
| |
| |
 ¤

Salchichón (S)

 l
| |
| |
| |
| |
 l

Landjäger (L)

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

Кабанос (К)

.
|
|
|
|
|
.

Котехіно Модена (С)

 ___
|   |
|   |
|   |
|___|

Rød pølse (R)

 ^
| |
| |
| |
| |
 v

Вихідні дані

Події даної ковбаси разом з ідентифікатором, для якого виду ковбаси вона розділена пробілом. Ідентифікатор - перша літера в назві ковбаси. Порядок не важливий.

Вихідні дані повинні бути записані stdout, дозволені нові рядки та пробіли.

Приклади

Вхідні дані

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

Вихідні дані

4R 1K

Вхідні дані

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

Вихідні дані

1L 1C 1S 2P

Вхідні дані

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

Вихідні дані

2S 1P

Програміст з найкоротшою програмою в байтах отримує зарплату від ковбасних хлопців (виграє)!

Ковбасні дрібниці

Prinskorv
Prinskorv, що безпосередньо перекладається як "принц-ковбаса" - це невелика шведська ковбаса, яка часто продається посиланнями. Зазвичай смажать на сковороді і подають із щедрою допомогою гірчиці.

Salchichón
Salchichón - це іспанська літня ковбаса, яку часто готують зі свинини, хоча в деяких рецептах використовується інше м'ясо, зокрема вол, телятина або кінь. М’ясо і сало нарізати тонкими шматочками, приправити сіллю, перцем, мускатним горіхом, орегано і часником, а потім вставити в товсту натуральну свинячу кишку.

Landjäger
Landjäger - напівсушена ковбаса, традиційно виготовлена ​​в Південній Німеччині, Австрії, Швейцарії та Ельзасі. Він популярний як закуска під час таких заходів, як походи. Він також має історію, як солдатська їжа, оскільки він зберігається без охолодження і постачається порціями одноразового харчування.

Kabanos
Kabanos - це польська довга тонка суха ковбаса зі свинини або кошерної індички. Вони задимлені на смак і можуть бути м'якими або дуже сухими за фактурою залежно від свіжості. Кабанози часто приправляють тільки перцем. На відміну від інших м'ясних страв, ці ковбаси зазвичай їдять самостійно як закуску і, за винятком випадків, коли кошерні, часто подають із сиром.

Cotechino Modena
Cotechino Modena або Cotechino di Modena - це свіжа ковбаса, виготовлена ​​зі свинини, жирної та свинячої шкірки, а походить з Модени, Італія, де вона має статус PGI. Котехіно часто подають з сочевицею або квасолею каннеліні з соусом поряд з картопляним пюре, особливо навколо Нового року.

Rød pølse
Rød pølse (червона ковбаса) - тип яскраво-червоної, вареної свинячої ковбаси, дуже поширений у Данії. Оскільки стенди хот-догів є поширеними в Данії, деякі люди вважають røde pølser однією з національних страв.

Вся інформація про ковбасу безсоромно копіюється з Вікіпедії


32
Ви пишете виклик на тему «Октоберфест» про ковбаси, а це не включає Weißwurst ? -1
Мартін Ендер

3
Я звинувачую цих зухвало коханих хлопців!
коктейль

31
Чому ви помістили інформацію про ковбасу в тег-спойлер? Це не дозволяє погано?
Олексій А.

10
@ MartinBüttner Ну, я думаю, ви могли б сказати ... це була найвдаліша ідея коли-небудь!
DankMemes

2
Додаткові місця доступні. Я думаю, я мав на увазі написати пробіли замість того, щоб пропускати нові рядки.
коктейль

Відповіді:


8

Pyth, 30 байт

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

Спробуйте в Інтернеті: Демонстрація або Тестовий набір

Пояснення:

Як і всі інші учасники, я дивлюся лише перший рядок вступу. Скажімо, перший рядок вводу є \ / ___ l ¤ ¤ ____.

Спочатку я розділився на пробіли, що дає мені список

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

Тепер ми хочемо позбутися '/'s і ''s і розсортувати решту.

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

Тепер я можу запустити-кодувати його довжиною.

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

Як виявляється, порядок (значення ascii) цих символів або рядка '___' можна чітко відобразити на числа [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     

І це можна використовувати для відображення їх безпосередньо на букви 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 байт

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

Збережено ще інші 2 байта завдяки ... Вгадай , хто? : D

Ігнорує весь вхід, крім першого рядка, видаляє всі /s та пробіли, переводить його на цільові ідентифікатори, сортує, використовує кодування довжини пробігу та друкує результат.

Демонстраційна демонстрація.

32-байтна версія

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

Демонстраційна демонстрація.

Збережено ще 2 байти завдяки @Jakube!

34-байтна версія

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

Демонстраційна демонстрація.

Збережено 2 байти завдяки @Jakube!

36-байтна версія

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

Демонстраційна демонстрація.


6
Я дав вам +1, тому що я люблю Кірбі
Нахт - Відновити Моніку

6
Я не давав вам +1, тому що ви рівно в 4
кп

Я дав вам -1, щоб повернути вас точно до 4 к: D
бета-розпад

1
Ще два байти ;-) hM-czd\\те саме, що-hMfTczd\\
Jakube

1
@sweerpotato Дивіться тут . Це ¤два байти.
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` `

Це досить просто, але ось все-таки пояснення:

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
Дуже розумний! Використовуючи розуміння масиву ES7 для гольфу в цій версії, я отримав 91: a=>(h=-1,[for(g of'¤l/._^')if(f=(a.split(g).length-1)/'222261'[++h])f+'PSLKCR'[h]].join` `)Якби тільки я міг спростити декларацію про h...
ETHproductions

@ETHproductions круто! Я повинен вивчити ES7
DankMemes

8

CJam, 38 35 33 байт

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

Перевірте це тут.

Пояснення

Перший рядок кожного виду ковбаси є унікальним, а оскільки ковбаси вирівняні вгорі, достатньо порахувати відповідних символів у цьому першому рядку. Два типи потребують спеціального лікування:

  • Landjäger (L) мають і те, \і /. Ми хочемо позбутися однієї з них, тоді ми можемо порахувати іншу, як і всі інші персонажі.
  • Котехіно Модена (С) є три підкреслення, тому нам потрібно розділити підкреслення на 3. Однак, насправді коротше розглянути підкреслення, просто замінивши пробіги з них на вході (який завжди буде належати лише одній ковбасі) на цільовий персонаж Cодразу.

Тепер про фактичний код:

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.

Що б ви не робили, не забувайте Сплурк.
Тейлор Лопес

6

Математика 116

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

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

ImportString[#,"Table"][[1]]повертає список розділених пробілом рядків, що з’являються у верхньому рядку вводу. Рядок може містити будь-який із елементів списку,{"¤","l","/","___",".","^"} , включаючи повтори. Кожен елемент асоціюється з унікальним видом ковбаси.

Tally підраховує кількість разів, коли кожен такий рядок з'являється.

/.{"¤"->"P","l"->"S",...замінює ¤на P, lнаS тощо.

Reverse розміщує кожен підрахунок перед елементом, з яким він пов’язаний.

Два Rowформатування формату вихід.


6

МАТЛАБ, 113

Якщо припустити, що пробіли дозволені (так, вони є), ось анонімна функція MATLAB:

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

І пояснення:

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

Здається, що працює правильно. Все ще є простір, але тепер всі ковбасні вироби правильно.


3

Perl, 84 77 байт

Хтось, мабуть, міг би трохи відголитись від цього ...

84 байти

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

77 байт

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

Зламатися:

Візьміть перший рядок STDIN, транслітеруйте значення в літерні коди, видаліть зайве сміття. dМодифікатор не повинен бути дійсно необхідно, але я зіткнувся дивні питання , Юнікод¤ характер без нього.

Використовуйте символьне посилання для створення та / або збільшення змінної для кожного знайденого символу.

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

Розділіть змінну С на 3 через трикратне підкреслення

$C /= 3;

Проведіть цикл через алфавіт та друкуйте однобуквені величини великої літери разом з літерою, якщо вони мають значення, що перевищує нуль

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

Результат тесту: http://ideone.com/alpUlI

Редагувати : Розбийте 7 байт, транслітерація передає анонімне значення повернення безпосередньо в split.


2

Perl, 172 байти

Сміливіші ще можна відрізати цю ковбасу, але ось стартовий на десять.

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

Безгольова версія

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

Результати тесту

$ 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 байт

Я впевнений, що ви можете скоротити це, але рішення Python ще не було, ось що:

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

Пояснення

Це досить просто, дехто може сказати читабельним, але ось коротке пояснення все одно:

Спочатку читається один рядок введення, оскільки кожну ковбасу можна визначити лише з першого рядка.

Тепер a={z:x.count(y)for y,z in zip('¤l/.^_','PSLKRC')}- розуміння словника, яке відображає ідентифікатор кожного типу ковбаси ( z) на кількість кожного виду ковбаси ( x.count(y)деy символ ковбаси визначає).

Потім ділимо кількість ковбас Cotechino Modena (C) на 3 через потрійне підкреслення.

Нарешті , ми роздрукувати результат: print(' '.join(str(a[x])+x for x in a if a[x])). Це створює кількість результатів кожної ковбаси одна по одній, але лише якщо цю ковбасу бачили хоча б раз ( a[x]не дорівнює нулю => Truthy). Кожен рядок підрахунку з'єднується пробілом і роздруковується.


print 'a [x]' + '' + a [x] для ... Має працювати (не перевірено) і економить 5 байт. Із тим, що є бетоном.
agtoever
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.