Fest sosis nyata

35

Karena akhir pekan pertama bulan Oktober semakin dekat, mari kita dapatkan Oktoberfest kita sendiri!

Latar Belakang

Anda dan beberapa programmer lain telah disewa oleh orang-orang sosis lokal di Munich, Jerman. Para sosis menyediakan bagi Oktoberfest semua sosis yang dibutuhkan Volksfest raksasa. Anda berhasil mendengar atasan Anda berbicara kepada karyawan lain tentang mengapa Anda dan yang lain dipekerjakan tanpa pengalaman terkait sosis sebelumnya. Anda sadar bahwa Anda direkrut karena keterampilan pemrograman Anda yang sempurna - dan bos Anda tampaknya ingin Anda membuat kode penganalisa sosis.

Tahun ini, para sosis telah memutuskan untuk menambah variasi sosis di Oktoberfest - tetapi mereka tidak tahu berapa banyak yang mereka impor.

Tantangan

Anda perlu membantu atasan Anda mencari tahu berapa banyak sosis jenis tertentu yang sebenarnya mereka impor. Anda harus memprogram alat analisis sosis yang menghasilkan jenis dan jumlah setiap sosis yang diimpor oleh sosis. Atasan Anda telah membeli sebuah floppy drive khusus untuk kesempatan ini yang, dengan sosis, siapkan stdin.

Memasukkan

Sejumlah sosis menyala stdin, masing-masing sosis dipisahkan oleh satu ruang. Sosis diberikan dalam format berikut:

Prinskorv (P)

 ¤
| |
| |
| |
 ¤

Salchichón (S)

 l
| |
| |
| |
| |
 l

Landjäger (L)

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

Kabanos (K)

.
|
|
|
|
|
.

Cotechino Modena (C)

 ___
|   |
|   |
|   |
|___|

Rød pølse (R)

 ^
| |
| |
| |
| |
 v

Keluaran

Kemunculan sosis yang diberikan bersama dengan pengidentifikasi jenis sosis itu, dipisahkan oleh spasi. Pengenal adalah huruf pertama atas nama sosis. Ketertiban tidak penting.

Keluaran harus ditulis untuk stdout, mengikuti garis dan ruang baru diizinkan.

Contohnya

Memasukkan

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

Keluaran

4R 1K

Memasukkan

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

Keluaran

1L 1C 1S 2P

Memasukkan

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

Keluaran

2S 1P

Programmer dengan program terpendek dalam byte dibayar oleh orang sosis (menang)!

Trivia sosis

Prinskorv
Prinskorv yang secara langsung diterjemahkan menjadi "pangeran-sosis" adalah sosis Swedia kecil yang sering dijual dengan tautan. Biasanya digoreng dalam wajan dan disajikan dengan mustard yang murah hati.

Salchichón
Salchichón adalah sosis musim panas Spanyol yang sering dibuat dengan daging babi, meskipun beberapa resep menggunakan daging lain termasuk sapi, sapi atau kuda. Daging dan lemak dipotong-potong tipis, dibumbui dengan garam, merica, pala, oregano, dan bawang putih dan kemudian dimasukkan ke dalam usus babi alami yang tebal.

Landjäger
Landjäger adalah sosis semi-kering yang dibuat secara tradisional di Jerman Selatan, Austria, Swiss, dan Alsace. Ini populer sebagai makanan ringan selama kegiatan seperti hiking. Ini juga memiliki sejarah sebagai makanan prajurit karena disimpan tanpa pendingin dan datang dalam porsi sekali makan.

Kabanos
Kabanos adalah sosis kering tipis panjang Polandia yang terbuat dari daging babi atau kalkun halal. Mereka berasap dalam rasa, dan bisa lunak atau sangat kering dalam tekstur tergantung pada kesegaran. Kabanosy sering dibumbui hanya dengan lada. Tidak seperti daging lainnya, sosis ini biasanya dimakan sendiri sebagai hidangan pembuka dan, kecuali saat halal, sering disajikan dengan keju.

Cotechino Modena
Cotechino Modena atau Cotechino di Modena adalah sosis segar yang terbuat dari daging babi, lemak, dan kulit babi, dan berasal dari Modena, Italia, di mana ia memiliki status PGI. Cotechino sering disajikan dengan lentil atau kacang cannellini dengan saus bersama kentang tumbuk, terutama sekitar Tahun Baru.

Rød pølse
Rød pølse (sosis merah) adalah jenis sosis babi merah yang direbus, sangat umum di Denmark. Karena gerai hot dog ada di mana-mana di Denmark, beberapa orang menganggap røde pølser sebagai salah satu hidangan nasional.

Semua informasi sosis tanpa malu-malu disalin dari Wikipedia

sweerpotato
sumber
32
Anda menulis tantangan bertema Oktoberfest tentang sosis, dan itu tidak termasuk Weißwurst ? -1
Martin Ender
3
Saya menyalahkan orang-orang sosis pengecut itu!
sweerpotato
31
Mengapa Anda memasukkan informasi sosis ke tag spoiler? Apakah itu untuk mencegahnya menjadi buruk?
Alex A.
10
@ MartinBüttner Yah saya kira Anda bisa mengatakan ... itu adalah ide wurst !
DankMemes
2
Ruang tambahan diizinkan. Saya pikir saya bermaksud menulis spasi tambahan alih-alih mengikuti baris baru .. Sekarang keduanya diizinkan!
sweerpotato

Jawaban:

8

Pyth, 30 byte

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

Cobalah online: Demonstrasi atau Test Suite

Penjelasan:

Seperti semua peserta lainnya, saya hanya melihat pada baris pertama dari input. Katakanlah baris input pertama adalah \ / ___ l ¤ ¤ ____.

Pada awalnya saya membaginya dengan spasi, yang memberi saya daftar

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

Sekarang kita ingin mendapatkan tumpangan dari '/'dan ''dan semacam hal yang tersisa.

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

Sekarang saya bisa menjalankan-panjang-menyandikannya.

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

Ternyata, urutan (nilai ascii) dari karakter ini atau string '___' dapat dipetakan dengan baik ke angka [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     

Dan ini dapat digunakan untuk memetakannya langsung ke huruf 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
sumber
19

Pyth, 36 34 32 30 byte

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

Disimpan belum lagi 2 byte berkat ... tebak siapa? : D

Abaikan semua input kecuali untuk baris pertama, hapus semua / s dan spasi, terjemahkan ke pengidentifikasi target, sortir, gunakan pengkodean run-length, dan cetak hasilnya.

Demo langsung.

Versi 32 byte

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

Demo langsung.

Disimpan 2 byte lagi berkat @Jakube!

Versi 34 byte

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

Demo langsung.

Disimpan 2 byte berkat @Jakube!

Versi 36 byte

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

Demo langsung.

kirbyfan64sos
sumber
6
Saya memberi Anda +1 karena saya suka Kirby
Nacht - Reinstate Monica
6
Saya tidak memberi Anda +1 karena Anda berada pada rep 4k yang tepat :)
ETHproduksi
Saya memberi Anda -1 untuk mengembalikan Anda ke tepat 4k: D
Beta Decay
1
Dua byte lainnya ;-) hM-czd\\sama dengan-hMfTczd\\
Jakube
1
@sweerpotato Lihat di sini . Ini ¤adalah dua 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` `

Ini cukup sederhana tapi ini penjelasannya:

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
sumber
3
Sangat pintar! Menggunakan pemahaman array ES7 untuk bermain golf versi ini, saya mendapat 91: a=>(h=-1,[for(g of'¤l/._^')if(f=(a.split(g).length-1)/'222261'[++h])f+'PSLKCR'[h]].join` `)Kalau saja saya bisa menyederhanakan deklarasi h...
ETHproduksi
@ EHProduk keren! Saya harus belajar ES7
DankMemes
8

CJam, 38 35 33 byte

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

Uji di sini.

Penjelasan

Baris pertama dari setiap jenis sosis unik, dan karena sosis disejajarkan di atas, itu cukup untuk menghitung karakter yang relevan di baris pertama. Dua jenis memerlukan perawatan khusus:

  • Landjäger (L) memiliki keduanya \dan /. Kami ingin menyingkirkan salah satu dari mereka, maka kami dapat menghitung yang lain seperti semua karakter lainnya.
  • Cotechino Modena (C) memiliki tiga garis bawah, jadi kita perlu membagi jumlah garis bawah dengan 3. Namun, sebenarnya lebih pendek untuk memperlakukan garis bawah secara individual dengan hanya mengganti rangkaiannya dalam input (yang akan selalu hanya dimiliki oleh satu sosis) dengan karakter target Csegera.

Sekarang untuk kode aktual:

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
sumber
Apa pun yang Anda lakukan, jangan lupa untuk Splurk.
Taylor Lopez
6

Mathematica 116

Beberapa byte mungkin bisa dicukur habis, tetapi tidak ada yang mendekati bahasa golf.

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

ImportString[#,"Table"][[1]]mengembalikan daftar string yang dipisahkan ruang yang muncul di baris atas input. String dapat menyertakan salah satu elemen dalam daftar {"¤","l","/","___",".","^"}, termasuk pengulangan. Setiap elemen dikaitkan dengan jenis sosis yang unik.

Tally menghitung berapa kali setiap string tersebut muncul.

/.{"¤"->"P","l"->"S",...menggantikan ¤dengan P, ldengan Sdan seterusnya.

Reverse menempatkan setiap penghitungan sebelum item yang dikaitkan dengannya.

Keduanya Rowmemformat output.

DavidC
sumber
6

MATLAB, 113

Dengan asumsi bahwa spasi tambahan diperbolehkan (ya itu), berikut adalah fungsi anonim MATLAB:

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

Dan sebuah penjelasan:

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

Tampaknya berfungsi dengan benar. Masih memiliki ruang trailing, tetapi sekarang menangani semua sosis dengan benar.

Tom Carpenter
sumber
3

Perl, 84 77 byte

Seseorang mungkin bisa mencukur sedikit dari ini ...

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$$_}

Kerusakan:

Ambil baris pertama STDIN, nilai transliterasi ke dalam kode surat, hapus sampah tambahan. Itud pengubah harus benar-benar diperlukan, tapi aku berlari ke masalah unicode aneh pada ¤karakter tanpa itu.

Gunakan referensi simbolis untuk membuat dan / atau menambah variabel untuk setiap karakter yang ditemukan.

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

Bagilah variabel C dengan 3, karena triple-underscore

$C /= 3;

Lingkari alfabet dan cetak variabel huruf kapital bersama huruf jika mereka memiliki nilai lebih besar dari nol

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

Hasil tes: http://ideone.com/alpUlI

Sunting : Memotong 7 byte dengan memiliki transliterasi meneruskan nilai pengembalian anonim langsung ke split.

ChicagoRedSox
sumber
2

Perl, 172 byte

Daresay masih dapat dipotong sosis ini, tapi ini adalah starter untuk sepuluh.

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

Versi tidak disatukan

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

Hasil tes

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

Python 3, 120 byte

Saya cukup yakin Anda dapat mempersingkat ini, tetapi belum ada solusi Python jadi di sini kita mulai:

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

Penjelasan

Ini cukup sederhana, beberapa orang bahkan mengatakan dapat dibaca, tetapi inilah penjelasan singkatnya:

Satu baris input pertama dibaca, karena setiap sosis dapat ditentukan hanya dari baris pertama.

Sekarang a={z:x.count(y)for y,z in zip('¤l/.^_','PSLKRC')}adalah pemahaman kamus yang memetakan pengidentifikasi setiap jenis sosis ( z) ke jumlah masing-masing jenis sosis ( x.count(y), di manay karakter mendefinisikan sosis).

Kami kemudian membagi jumlah sosis Cotechino Modena (C) dengan 3 karena tiga garis bawah.

Akhirnya kami mencetak hasilnya: print(' '.join(str(a[x])+x for x in a if a[x])). Ini menciptakan jumlah output masing-masing sosis satu per satu, tetapi hanya jika sosis itu dilihat setidaknya satu kali ( a[x]bukan nol => Sejati). Setiap string hitung digabungkan dengan spasi dan dicetak.

IceDingo
sumber
cetak 'a [x]' + '' + a [x] untuk ... Harus berfungsi (tidak diuji) dan menyimpan 5 byte. Dengan menjadi backtick.
agtoever