Настоящий колбасный праздник


35

Поскольку приближаются первые выходные октября, давайте проведем собственный Октоберфест!

Задний план

Вы и некоторые другие программисты были наняты местными парнями из колбасы в Мюнхене, Германия. Колбасные ребята обеспечивают Октоберфест всеми колбасами, в которых нуждается гигантский Фольксфест. Вам удается услышать, как ваш начальник разговаривает с другими сотрудниками о том, почему вы и другие были наняты без какого-либо предыдущего опыта, связанного с колбасой. Вы понимаете, что были наняты для ваших безупречных навыков программирования - и ваш босс, очевидно, хочет, чтобы вы кодировали анализатор колбасы.

В этом году ребята из колбасы решили увеличить ассортимент колбас на Октоберфесте - но они понятия не имеют, сколько они импортировали.

Вызов

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

вход

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

Принскорв (П)

 ¤
| |
| |
| |
 ¤

Салчичон (С)

 l
| |
| |
| |
| |
 l

Landjäger (L)

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

Кабанос (К)

.
|
|
|
|
|
.

Котечино Модена (C)

 ___
|   |
|   |
|   |
|___|

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 - полусухая колбаса, традиционно производимая в Южной Германии, Австрии, Швейцарии и Эльзасе. Он популярен в качестве закуски во время таких мероприятий, как походы. Он также имеет свою историю как солдатская еда, потому что он хранится без охлаждения и состоит из порций одного приема пищи.

Кабанос
Кабанос - это польская длинная тонкая сухая колбаса из свинины или кошерной индейки. Они имеют дымный вкус и могут быть мягкими или очень сухими по текстуре в зависимости от свежести. Кабаносы часто приправляют только перцем. В отличие от других видов мяса, эти колбасы, как правило, едят в одиночку в качестве закуски и, за исключением кошерных блюд, часто подают с сыром.

Cotechino Modena
Cotechino Modena или Cotechino di Modena - это свежая колбаса, приготовленная из свинины, жира и кожуры свинины, родом из Модены, Италия, где она имеет статус ЗГУ. Котечино часто подают с чечевицей или бобами каннеллини с соусом вместе с картофельным пюре, особенно в новогодние праздники.

Rød Pølse
Rød pølse (красная колбаса) - разновидность ярко-красной, вареной свиной колбасы, очень распространенная в Дании. Поскольку стойки для хот-догов широко распространены в Дании, некоторые люди считают роде пёльзера одним из национальных блюд.

Вся колбасная информация беззастенчиво скопирована из Википедии


32
Вы пишете на тему Октоберфест о колбасах, и это не включает в себя Weißwurst ? -1
Мартин Эндер

3
Я обвиняю этих паршивых колбасников!
sweerpotato

31
Почему вы поместили информацию о колбасе в тег спойлера? Это чтобы не испортиться?
Алекс А.

10
@ MartinBüttner Ну, я думаю, можно сказать ... это была самая крутая идея!
DankMemes

2
Промежуточные пробелы разрешены. Я думаю, что я хотел написать конечные пробелы вместо конечных строк .. Теперь оба разрешены!
Sweerpotato

Ответы:


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, потому что я люблю Кирби
Nacht - Восстановить Монику

6
Я не дал вам +1, потому что вы на 4k повторении :)
ETHproductions

Я дал тебе -1, чтобы вернуть тебя точно на 4k: D
Beta Decay

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) есть оба \и /. Мы хотим избавиться от одного из них, затем мы можем считать другого, как все остальные персонажи.
  • В Cotechino Modena (C) есть три подчеркивания, поэтому нам нужно разделить число подчеркиваний на 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.

Что бы вы ни делали, не забудьте Splurk.
Тейлор Лопес

6

Mathematica 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 помещает каждый счет перед элементом, с которым он связан.

Два Rows форматируют вывод.


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;

Разделите переменную C на 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]не ноль => Истина). Каждая строка подсчета соединяется пробелом и распечатывается.


выведите 'a [x]' + '' + a [x] для ... Должно работать (не проверено) и сохраняет 5 байтов. С тем, чтобы быть отступником.
agtoever
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.