Một lễ hội xúc xích thực sự


35

Vì cuối tuần đầu tiên của tháng 10 đang đến gần, chúng ta hãy tổ chức lễ hội tháng mười của riêng mình!

Lý lịch

Bạn và một số lập trình viên khác đã được thuê bởi những người làm xúc xích địa phương ở Munich, Đức. Những người làm xúc xích cung cấp cho lễ hội tháng mười với tất cả các loại xúc xích mà Volksfest khổng lồ cần. Bạn quản lý để nghe lỏm ông chủ của bạn nói chuyện với các nhân viên khác về lý do tại sao bạn và những người khác được thuê mà không có kinh nghiệm liên quan đến xúc xích trước đó. Bạn nhận ra rằng bạn đã được thuê vì kỹ năng lập trình hoàn hảo của bạn - và ông chủ của bạn rõ ràng muốn bạn viết mã phân tích xúc xích.

Năm nay, các anh chàng xúc xích đã quyết định tăng nhiều loại xúc xích tại Lễ hội tháng mười - nhưng họ không biết họ đã nhập bao nhiêu.

Thử thách

Bạn cần phải giúp sếp của bạn tìm ra bao nhiêu xúc xích của một loại nhất định mà họ đã thực sự nhập khẩu. Bạn sẽ phải lập trình một bộ phân tích xúc xích đưa ra loại và số lượng mỗi loại xúc xích mà những người làm xúc xích đã nhập khẩu. Sếp của bạn đã mua một ổ đĩa mềm đặc biệt cho dịp này, được tặng xúc xích, đưa nó vào stdin.

Đầu vào

Một số xúc xích trên stdin, mỗi xúc xích cách nhau bởi một không gian. Xúc xích được đưa ra theo định dạng sau:

Prinskorv (P)

 ¤
| |
| |
| |
 ¤

Salchichón (S)

 l
| |
| |
| |
| |
 l

Landjäger (L)

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

Kabanos (K)

.
|
|
|
|
|
.

Cotechino Modena (C)

 ___
|   |
|   |
|   |
|___|

Rød pølse (R)

 ^
| |
| |
| |
| |
 v

Đầu ra

Sự xuất hiện của một loại xúc xích nhất định cùng với một định danh loại xúc xích đó là gì, cách nhau bởi một khoảng trống. Mã định danh là chữ cái đầu tiên trong tên của xúc xích. Thứ tự không quan trọng.

Đầu ra sẽ được ghi vào stdout, dòng mới và dấu cách được cho phép.

Ví dụ

Đầu vào

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

Đầu ra

4R 1K

Đầu vào

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

Đầu ra

1L 1C 1S 2P

Đầu vào

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

Đầu ra

2S 1P

Các lập trình viên với chương trình ngắn nhất tính bằng byte được trả tiền bởi những kẻ xúc xích (thắng)!

Xúc xích đố

Prinskorv
Prinskorv dịch trực tiếp thành "xúc xích hoàng tử" là một loại xúc xích nhỏ của Thụy Điển thường được bán trong các liên kết. Thường được chiên trong chảo rán và ăn kèm với sự giúp đỡ của mù tạt.

Salchichón
Salchichón là một loại xúc xích mùa hè của Tây Ban Nha thường được làm bằng thịt lợn, mặc dù một số công thức nấu ăn sử dụng các loại thịt khác bao gồm bò, thịt bê hoặc ngựa. Thịt và mỡ được xắt thành từng miếng mỏng, nêm muối, hạt tiêu, hạt nhục đậu khấu, lá oregano và tỏi rồi cho vào ruột heo dày tự nhiên.

Landjäger
Landjäger là một loại xúc xích bán khô truyền thống được sản xuất ở miền Nam nước Đức, Áo, Thụy Sĩ và Alsace. Nó phổ biến như một món ăn nhẹ trong các hoạt động như đi bộ đường dài. Nó cũng có một lịch sử là thực phẩm của người lính bởi vì nó giữ mà không cần làm lạnh và đi kèm với các phần ăn một lần.

Kabanos
Kabanos là một loại xúc xích khô mỏng dài của Ba Lan làm từ thịt lợn hoặc gà tây kosher. Chúng có hương vị khói, và có thể mềm hoặc rất khô trong kết cấu tùy thuộc vào độ tươi. Kabanosy thường được nêm chỉ với hạt tiêu. Không giống như các loại thịt khác, những chiếc xúc xích này thường được ăn một mình như một món khai vị và, ngoại trừ khi kosher, thường được ăn kèm với phô mai.

Cotechino Modena
Cotechino Modena hoặc Cotechino di Modena là một loại xúc xích tươi làm từ thịt lợn, mỡ, và thịt lợn, và đến từ Modena, Ý, nơi có tình trạng PGI. Cotechino thường được ăn kèm với đậu lăng hoặc đậu cannellini với nước sốt cùng với khoai tây nghiền, đặc biệt là vào dịp năm mới.

Rôd
Rød pølse (xúc xích đỏ) là một loại xúc xích thịt lợn đỏ rực, rất phổ biến ở Đan Mạch. Vì quầy bán xúc xích có mặt ở khắp mọi nơi ở Đan Mạch, một số người coi røde pølser là một trong những món ăn quốc gia.

Tất cả thông tin xúc xích được sao chép một cách đáng xấu hổ từ Wikipedia


32
Bạn đang viết một thử thách theo chủ đề Ok / 10fest về xúc xích, và nó không bao gồm Weißwurst ? -1
Martin Ender

3
Tôi đổ lỗi cho những kẻ xúc xích đê tiện!
sweerpotato

31
Tại sao bạn lại đưa thông tin xúc xích vào thẻ spoiler? Đó có phải là để giữ cho nó khỏi xấu đi?
Alex A.

10
@ MartinBüttner Vâng tôi đoán bạn có thể nói ... đó là ý tưởng wurst bao giờ hết!
DankMeme

2
Không gian lưu trữ được cho phép. Tôi nghĩ rằng tôi có ý định viết dấu cách thay vì dấu dòng mới .. Bây giờ cả hai đều được phép!
sweerpotato

Câu trả lời:


8

Bình thường, 30 byte

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

Dùng thử trực tuyến: Trình diễn hoặc Test Suite

Giải trình:

Như tất cả những người tham gia khác, tôi chỉ nhìn vào dòng đầu tiên của đầu vào. Giả sử dòng đầu tiên là \ / ___ l ¤ ¤ ____.

Lúc đầu, tôi chia theo khoảng trắng, cho tôi danh sách

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

Bây giờ chúng tôi muốn có được chuyến đi của '/'s và ''s và sắp xếp những thứ còn lại.

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

Bây giờ tôi có thể chạy mã hóa chiều dài.

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

Khi nó bật ra, thứ tự (giá trị ascii) của các ký tự này hoặc của chuỗi '___' có thể được ánh xạ độc đáo đến các số [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     

Và điều này có thể được sử dụng để ánh xạ chúng trực tiếp đến các chữ cái 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 byte

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

Đã lưu thêm 2 byte nhờ ... đoán xem ai? : D

Bỏ qua tất cả các đầu vào ngoại trừ dòng đầu tiên, loại bỏ tất cả các /s và khoảng trắng, dịch nó sang các định danh đích, sắp xếp nó, sử dụng mã hóa độ dài chạy và in kết quả.

Bản thử trực tiếp.

Phiên bản 32 byte

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

Bản thử trực tiếp.

Đã lưu thêm 2 byte nhờ @Jakube!

Phiên bản 34 byte

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

Bản thử trực tiếp.

Đã lưu 2 byte nhờ @Jakube!

Phiên bản 36 byte

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

Bản thử trực tiếp.


6
Tôi đã cho bạn +1 vì tôi yêu Kirby
Nacht - Tái lập Monica

6
Tôi đã không cho bạn +1 vì bạn ở chính xác 4k rep :)
Sản phẩm ETH

Tôi đã cho bạn -1 để giúp bạn quay lại chính xác 4k: D
Beta Decay

1
Hai byte khác ;-) hM-czd\\giống như-hMfTczd\\
Jakube

1
@sweerpotato Xem tại đây . Đây ¤là hai byte.
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` `

Nó khá đơn giản nhưng dù sao đây cũng là một lời giải thích:

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
Rất thông minh! Sử dụng khả năng hiểu mảng của ES7 để chơi golf phiên bản này, tôi đã nhận được 91: Giá a=>(h=-1,[for(g of'¤l/._^')if(f=(a.split(g).length-1)/'222261'[++h])f+'PSLKCR'[h]].join` `)như tôi có thể đơn giản hóa việc khai báo h...
ETHproductions 2/10/2015

@ETHproductions mát mẻ! Tôi nên học ES7
DankMeme

8

CJam, 38 35 33 byte

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

Kiểm tra nó ở đây.

Giải trình

Dòng đầu tiên của mỗi loại xúc xích là duy nhất và vì xúc xích được căn chỉnh ở trên cùng, nên đủ để đếm các ký tự có liên quan trong dòng đầu tiên đó. Hai loại yêu cầu điều trị đặc biệt:

  • Landjäger (L) có cả \/. Chúng tôi muốn loại bỏ một trong số họ, sau đó chúng tôi có thể đếm người khác giống như tất cả các nhân vật khác.
  • Cotechino Modena (C) có ba dấu gạch dưới, vì vậy chúng ta cần chia số lượng gạch dưới cho 3. Tuy nhiên, thực sự ngắn hơn để xử lý riêng lẻ dấu gạch dưới bằng cách thay thế các bước chạy của chúng trong đầu vào (sẽ luôn chỉ thuộc về một xúc xích) nhân vật mục tiêu Cngay lập tức.

Bây giờ cho mã thực tế:

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.

Dù bạn làm gì, đừng quên Splurk.
Taylor Lopez

6

Toán học 116

Một số byte có thể có thể bị loại bỏ, nhưng không có gì để tiếp cận các ngôn ngữ chơi gôn.

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

ImportString[#,"Table"][[1]]trả về một danh sách các chuỗi được phân tách bằng dấu cách xuất hiện ở dòng trên cùng của đầu vào. Chuỗi có thể bao gồm bất kỳ thành phần nào trong danh sách {"¤","l","/","___",".","^"}, bao gồm cả lặp lại. Mỗi yếu tố được liên kết với một loại xúc xích độc đáo.

Tally đếm số lần mỗi chuỗi như vậy xuất hiện.

/.{"¤"->"P","l"->"S",...thay thế ¤bằng P, lvới Svà như vậy.

Reverse đặt từng kiểm đếm trước mục được liên kết với nó.

Hai Rowđịnh dạng đầu ra.


6

MATLAB, 113

Giả sử rằng các dấu cách được cho phép (vâng chúng là), đây là một hàm ẩn danh MATLAB:

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

Và một lời giải thích:

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

Xuất hiện để hoạt động chính xác. Vẫn có không gian dấu, nhưng bây giờ xử lý tất cả xúc xích một cách chính xác.


3

Perl, 84 77 byte

Ai đó có lẽ có thể cạo sạch một chút về điều này ...

84 byte

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

77 byte

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

Phá vỡ:

Lấy dòng đầu tiên của STDIN, chuyển các giá trị thành mã chữ cái, xóa thêm rác. Công cụ dsửa đổi không thực sự cần thiết, nhưng tôi gặp phải các vấn đề unicode kỳ lạ trên ¤nhân vật mà không có nó.

Sử dụng tham chiếu tượng trưng để tạo và / hoặc biến tăng cho mỗi ký tự được tìm thấy.

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

Chia biến C cho 3, do ba dấu gạch dưới

$C /= 3;

Lặp lại bảng chữ cái và in các biến viết hoa một chữ cái cùng với chữ cái nếu chúng có giá trị lớn hơn 0

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

Kết quả kiểm tra: http://ideone.com/alpUlI

Chỉnh sửa : Cắt 7 byte bằng cách chuyển đổi giá trị trả về ẩn danh trực tiếp vào split.


2

Perl, 172 byte

Daresay nhiều hơn có thể được cắt ra khỏi xúc xích này, nhưng đây là một khởi đầu cho mười.

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

Phiên bản ung dung

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

Kết quả kiểm tra

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

Tôi khá chắc chắn rằng bạn có thể rút ngắn điều này, nhưng đã không có giải pháp Python nên chúng tôi sẽ thực hiện:

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

Giải trình

Nó khá đơn giản, một số thậm chí có thể nói có thể đọc được, nhưng dù sao đây cũng là một lời giải thích ngắn:

Một dòng đầu tiên được đọc, vì mỗi xúc xích có thể được xác định từ chỉ dòng đầu tiên.

Bây giờ a={z:x.count(y)for y,z in zip('¤l/.^_','PSLKRC')}là một cách hiểu từ điển ánh xạ định danh của từng loại xúc xích ( z) đến số lượng của từng loại xúc xích ( x.count(y), trong đóy ký tự xác định xúc xích).

Sau đó chúng tôi chia số lượng Cotechino Modena (C) xúc xích cho 3 vì ba dấu gạch dưới.

Cuối cùng chúng tôi in ra kết quả : print(' '.join(str(a[x])+x for x in a if a[x])). Điều này tạo ra số lượng đầu ra của từng loại xúc xích một lần, nhưng chỉ khi xúc xích đó được nhìn thấy ít nhất một lần ( a[x]không phải là không => Sự thật). Mỗi chuỗi đếm được nối bởi một khoảng trắng và được in ra.


in 'a [x]' + '' + a [x] cho ... Nên hoạt động (không được kiểm tra) và tiết kiệm 5 byte. Với 'là một backtick.
bất cứ lúc nào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.