เทศกาลไส้กรอกที่แท้จริง


35

ตั้งแต่สุดสัปดาห์แรกของเดือนตุลาคมใกล้เข้ามาเรามี Oktoberfest ของเราเอง!

พื้นหลัง

คุณและโปรแกรมเมอร์คนอื่น ๆ ได้รับการว่าจ้างจากพวกไส้กรอกท้องถิ่นในมิวนิคประเทศเยอรมนี พวกไส้กรอกให้ Oktoberfest กับไส้กรอกทั้งหมดที่ Volksfest ต้องการ คุณสามารถได้ยินเจ้านายของคุณพูดกับพนักงานคนอื่นว่าทำไมคุณและคนอื่น ๆ ถึงได้รับการว่าจ้างโดยไม่มีประสบการณ์เกี่ยวกับไส้กรอกมาก่อน คุณรู้ว่าคุณได้รับการว่าจ้างจากทักษะการเขียนโปรแกรมที่ไร้ที่ติ - และหัวหน้าของคุณต้องการให้คุณเขียนรหัสเครื่องวิเคราะห์ไส้กรอก

ปีนี้พวกไส้กรอกได้ตัดสินใจที่จะเพิ่มความหลากหลายของไส้กรอกที่ Oktoberfest - แต่พวกเขาไม่รู้ว่าพวกเขานำเข้ามามากแค่ไหน

ท้าทาย

คุณต้องช่วยหัวหน้างานของคุณให้ทราบว่าไส้กรอกประเภทใดที่พวกเขานำเข้ามาจริง คุณจะต้องตั้งโปรแกรมเครื่องวิเคราะห์ไส้กรอกซึ่งจะแสดงชนิดและจำนวนของไส้กรอกทุกชนิดที่ไส้กรอกนำเข้า stdinเจ้านายของคุณได้ซื้อไดรฟ์ฟลอปปี้พิเศษสำหรับโอกาสนี้ซึ่งได้รับไส้กรอกท่อมัน

อินพุต

จำนวนของไส้กรอกบนstdinแต่ละไส้กรอกคั่นด้วยช่องว่างหนึ่ง ไส้กรอกมีให้ในรูปแบบต่อไปนี้:

ปริญคอร์ (P)

 ¤
| |
| |
| |
 ¤

Salchichón (S)

 l
| |
| |
| |
| |
 l

Landjäger (L)

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

คาบาโนส (K)

.
|
|
|
|
|
.

Cotechino Modena (C)

 ___
|   |
|   |
|   |
|___|

Rødpø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ónSalchichón
เป็นไส้กรอกฤดูร้อนของสเปนที่มักทำด้วยหมูแม้ว่าบางสูตรจะใช้เนื้อสัตว์อื่นรวมถึงวัวเนื้อลูกวัวหรือม้า เนื้อสัตว์และไขมันสับเป็นชิ้นบาง ๆ ปรุงรสด้วยเกลือพริกไทยลูกจันทน์เทศออริกาโน่และกระเทียมจากนั้นแทรกเข้าไปในลำไส้หมูตามธรรมชาติ

LandjägerLandjäger
เป็นไส้กรอกกึ่งแห้งซึ่งผลิตในภาคใต้ของเยอรมนีออสเตรียสวิตเซอร์แลนด์และอัลซาซ เป็นที่นิยมในฐานะของทานเล่นระหว่างทำกิจกรรมเช่นเดินป่า นอกจากนี้ยังมีประวัติว่าเป็นอาหารของทหารเพราะมันเก็บได้โดยไม่ต้องแช่เย็นและมาเป็นอาหารมื้อเดียว

Kabanos
Kabanos เป็นไส้กรอกแห้งบางยาวที่ทำจากหมูหรือไก่งวงเพียว พวกเขามีควันในรสชาติและสามารถนุ่มหรือแห้งมากในเนื้อขึ้นอยู่กับความสด Kabanosy มักปรุงด้วยพริกไทยเท่านั้น ซึ่งแตกต่างจากเนื้อสัตว์อื่น ๆ ไส้กรอกเหล่านี้มักจะกินคนเดียวเป็นอาหารจานและยกเว้นเมื่อเพียว ๆ เสิร์ฟกับชีส

Cotechino Modena
Cotechino Modena หรือ Cotechino di Modena เป็นไส้กรอกสดที่ทำจากเนื้อหมู, เนื้อวัว, เนื้อหมูและเปลือกหมูและมาจากเมืองโมเดนาประเทศอิตาลีที่มีสถานะ PGI Cotechino มักจะเสิร์ฟพร้อมกับถั่วเลนทิลหรือถั่ว cannellini กับซอสข้างมันฝรั่งบดโดยเฉพาะในช่วงปีใหม่

Rødpølse
Rødpølse (ไส้กรอกแดง) เป็นไส้กรอกหมูต้มแดงที่พบได้ทั่วไปในเดนมาร์ก เนื่องจากร้านขายฮอทดอกเป็นที่แพร่หลายในเดนมาร์กบางคนมองว่าrødepølserเป็นหนึ่งในอาหารประจำชาติ

ข้อมูลไส้กรอกทั้งหมดคัดลอกมาจาก Wikipedia


32
คุณกำลังเขียนความท้าทายในธีม Oktoberfest เกี่ยวกับไส้กรอกและไม่รวมWeißwurst ? -1
Martin Ender

3
ฉันโทษพวกไส้กรอกที่ขี้ขลาดตาขาวเหล่านั้น!
sweerpotato

31
ทำไมคุณถึงใส่ข้อมูลไส้กรอกลงในแท็กสปอยเลอร์ นั่นคือการป้องกันไม่ให้มันแย่?
Alex A.

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     

และนี้สามารถใช้ในการ map 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 เพราะคุณอยู่ที่ตัวแทน 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 อันดังนั้นเราจำเป็นต้องหารขีดล่างด้วย 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
Taylor Lopez

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 วางแต่ละครั้งก่อนรายการที่เชื่อมโยง

ทั้งสองRowรูปแบบการส่งออก


6

MATLAB, 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ปรับปรุงไม่ควรจริงๆจะจำเป็น แต่ฉันวิ่งเข้าไปในปัญหา Unicode แปลกใน¤ตัวละครโดยไม่ได้

ใช้การอ้างอิงเชิงสัญลักษณ์เพื่อสร้างและ / หรือเพิ่มตัวแปรสำหรับอักขระแต่ละตัวที่พบ

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

หารตัวแปร C ด้วย 3 เนื่องจากขีดเส้นใต้สามจุด

$C /= 3;

วนรอบตัวอักษรและพิมพ์ตัวพิมพ์ใหญ่แบบตัวพิมพ์เล็กพร้อมกับตัวอักษรหากมีค่ามากกว่าศูนย์

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

ผลการทดสอบ: http://ideone.com/alpUlI

แก้ไข : Chop 7 splitไบต์โดยมีการแปลผ่านค่าตอบแทนที่ไม่ระบุชื่อโดยตรงใน


2

Perl, 172 ไบต์

Daresay ยังสามารถหั่นไส้กรอกนี้ได้อีกต่อไป แต่นี่เป็นการเริ่มต้นสำหรับสิบ

$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 ไบต์ ด้วย 'เป็น backtick
agtoever
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.