Gerçek bir sosis festivali


35

Ekim ayının ilk hafta sonu yaklaştığı için, kendi Oktoberfest'imize bakalım!

Arka fon

Siz ve diğer bazı programcılar, Almanya'nın Münih kentindeki yerel sosisli insanlar tarafından işe alınmış. Sosisli çocuklar Oktoberfest'e dev Volksfest'in ihtiyaç duyduğu tüm sosisleri sağlıyor. Patronunuzun diğer çalışanlarla, siz ve diğerlerinin daha önce sosisle ilgili herhangi bir deneyim olmadan neden işe alındığı hakkında konuştuğunu söylediklerini duymayı başarıyorsunuz. Kusursuz programlama becerileriniz için işe alındığınızı fark ettiniz - ve patronunuz görünüşe göre bir sosis analizcisi kodlamanızı istiyor.

Bu yıl civarında, sosisçiler Oktoberfest'teki sosis çeşitlerini artırmaya karar verdiler - ancak ne kadar ithal ettikleri hakkında hiçbir fikirleri yok.

Meydan okuma

Patronunuza, belli bir türden sosisin ne kadar ithal ettiklerini anlamalarında yardım etmeniz gerekiyor. Sosis adamlarının ithal ettiği her bir sosisin türünü ve sayısını gösteren bir sosis analizörü programlamanız gerekecek. Patronunuz, bu durum için bir sosis verilmiş ve onu sıkıştıran özel bir disket sürücü satın aldı stdin.

Giriş

Sosis bir sayı ile stdin, her bir sosis bir boşluk ile birbirlerinden ayrılmıştır. Sosis aşağıdaki biçimde verilir:

Prinskorv (P)

 ¤
| |
| |
| |
 ¤

Salchichón (S)

 l
| |
| |
| |
| |
 l

Landjäger (L)

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

Kabanos (K)

.
|
|
|
|
|
.

Cotechino Modena (C)

 ___
|   |
|   |
|   |
|___|

Rød pølse (R)

 ^
| |
| |
| |
| |
 v

Çıktı

Belirli bir sosisin, hangi tür sosisin bir tanımlayıcıyla birlikte bir boşlukla ayrılmış olduğu durumları. Tanımlayıcı, sosis adındaki ilk harftir. Sipariş önemli değil.

Çıktı yazılacak stdout, takip edilen yeni satırlara ve alanlara izin verilecektir.

Örnekler

Giriş

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

Çıktı

4R 1K

Giriş

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

Çıktı

1L 1C 1S 2P

Giriş

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

Çıktı

2S 1P

Bayt cinsinden en kısa programa sahip olan programcı sosis adamlar tarafından ödenir!

Sosis ıvır zıvır şeyler

Prinskorv
Doğrudan "Prens-sosis" anlamına gelen Prinskorv, genellikle bağlantılarla satılan küçük bir İsveç sosisidir. Genellikle bir tavada kızartılır ve cömert hardal yardımı ile servis edilir.

Salchichón
Salchichón, bazı tariflerde öküz, dana eti veya atı da dahil olmak üzere diğer etleri kullanmasına rağmen, genellikle domuz eti ile yapılan bir İspanyol yaz sosisidir. Et ve yağlar ince bitlerde kıyılır, tuz, karabiber, hindistan cevizi, kekik ve sarımsak ile baharatlandırılır ve daha sonra kalın doğal domuz bağırsaklarına yerleştirilir.

Landjäger
Landjäger, Güney Almanya, Avusturya, İsviçre ve Alsace'de geleneksel olarak yapılan yarı kurutulmuş bir sosisdir. Yürüyüş gibi aktiviteler sırasında atıştırmalık yiyecek olarak popülerdir. Aynı zamanda askerin yemeği olarak da bir geçmişi var çünkü buzdolabında kalmıyor ve tek öğün porsiyonlarında geliyor.

Kabanos
Kabanos, domuz veya kaşer hindiden yapılmış, Polonya uzun ince bir kuru sosisdir. Lezzeti dumanlıdır ve tazeliğe bağlı olarak dokuda yumuşak veya çok kuru olabilirler. Kabanozy genellikle sadece biber ile baharatlanır. Diğer etlerin aksine, bu sosisler tipik olarak iştah açıcı olarak tek başlarına yenir ve kaşerler genellikle peynirle servis edilmedikçe.

Cotechino Modena
Cotechino Modena veya Cotechino di Modena, domuz eti, yağsız ve domuz kabuğundan yapılan taze bir sosisdir ve PGI statüsüne sahip olduğu İtalya, Modena'dan gelmektedir. Cotechino, özellikle Yeni Yıl civarında, patates püresinin yanında soslu mercimek veya cannellini fasulyesi ile birlikte servis edilir.

Rød pølse
Rød pølse (kırmızı sosis), Danimarka'da çok yaygın görülen parlak kırmızı, haşlanmış domuz sosisi türüdür. Sosisli sandviç standları Danimarka'da her yerde olduğu için, bazı insanlar røde pølser'ı ulusal yemeklerden biri olarak görüyorlar.

Bütün sosis bilgileri utanmadan Vikipedi'den kopyalandı.


32
Sosis konusunda Oktoberfest temalı bir meydan okuma yazıyorsunuz ve Weißwurst'u içermiyor mu? -1
Martin Ender

3
O korkak sosis adamlarını suçluyorum!
sweerpotato

31
Neden sosis bilgilerini bir spoiler etiketine koydun? Kötüleşmemesi için mi?
Alex A.

10
MartinBüttner Well @ ben ... diyebilirsin Mierswa hiç bir fikir!
DankMemes

2
Sondaki boşluklara izin verilir. Sanırım takip eden yeni hatlar yerine takip eden boşluklar yazmak istedim .. Şimdi ikisine de izin veriliyor!
sweerpotato

Yanıtlar:


8

Pyth, 30 bayt

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

Çevrimiçi deneyin: Gösteri veya Test Paketi

Açıklama:

Diğer tüm katılımcılar gibi ben sadece girişin ilk satırına bakıyorum. Diyelim ki girişin ilk satırı \ / ___ l ¤ ¤ ____.

İlk başta boşluklara böldüm, bu da bana listesini veriyor.

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

Şimdi '/'s ve ''s'den binip geriye kalan şeyi sıralamak istiyoruz .

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

Şimdi koşabilirim-kodlayabilirim.

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

Anlaşıldığı üzere, bu karakterlerin veya dizginin sırası (ascii-value) '___' sayılarla güzel bir şekilde eşlenebilir [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     

Ve bu onları doğrudan harflerle eşleştirmek için kullanılabilir 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 bayt

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

Başka bir 2 byte daha kaydedilmiş ... sayesinde kim tahmin? : D

İlk satır hariç tüm girişi yok sayar, tüm /s ve boşlukları kaldırır , hedef tanımlayıcılara çevirir, sıralar, çalışma uzunluğu kodlamasını kullanır ve sonucu yazdırır.

Canlı demo.

32 bayt sürümü

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

Canlı demo.

@Jakube sayesinde 2 bayt daha kaydedildi!

34 bayt sürümü

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

Canlı demo.

@Jakube sayesinde 2 bayt kaydedildi!

36 bayt sürümü

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

Canlı demo.


6
Sana +1 verdim çünkü Kirby
Nacht - Reinstate Monica'yı

6
Ben sana +1 vermedim çünkü tam olarak 4
bin kişisin

Tam 4k: D
Beta Decay

1
Başka bir iki bayt ;-) hM-czd\\aynıdır-hMfTczd\\
Jakube

1
@sweerpotato Bkz burada . ¤İki bayt.
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` `

Oldukça basit ama işte yine de bir açıklama:

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
Çok zeki! Golf Bu sürümü ES7 en dizi comprehensions kullanarak, 91 var: a=>(h=-1,[for(g of'¤l/._^')if(f=(a.split(g).length-1)/'222261'[++h])f+'PSLKCR'[h]].join` `)Keşke ilanını basitleştirmek olsaydı h...
ETHproductions

@ETHproductions serin! ES7
DankMemes

8

CJam, 38 35 33 bayt

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

Burada test et.

açıklama

Her bir sosis türünün ilk satırı benzersizdir ve sosisler üste hizalandığından, bu ilk satırdaki ilgili karakterleri saymak yeterlidir. İki tip özel işlem gerektirir:

  • Landjäger (L) hem de sahip \ve /. Onlardan birinden kurtulmak istiyoruz, sonra diğerini diğer bütün karakterler gibi sayabiliriz.
  • Cotechino Modena (C) üç alt çizgiye sahiptir, bu yüzden alt çizgi sayısını 3'e bölmemiz gerekir. Ancak, alt kısımlara tek tek işlem yapmak için girilen alt kısımları basitçe işlemden geçirin ( her zaman yalnızca bir sosise ait olacaktır). Chemen hedef karakter .

Şimdi gerçek kod için:

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.

Ne yaparsan yap, Splurk'u unutma.
Taylor Lopez

6

Mathematica 116

Bazı baytlar büyük olasılıkla traş olabilir, ancak golf dillerine yaklaşmak için hiçbir şey yok.

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

ImportString[#,"Table"][[1]]girişin üst satırında görünen boşlukla ayrılmış dizelerin bir listesini döndürür. Dize, {"¤","l","/","___",".","^"}tekrarlar da dahil olmak üzere listedeki öğelerin herhangi birini içerebilir . Her öğe benzersiz bir sosis türü ile ilişkilendirilir.

Tally Her bir dizginin görünme sayısını sayar.

/.{"¤"->"P","l"->"S",...yerini ¤ile P, lile Svb.

Reverse Her bir taksiti, ilişkili öğenin önüne yerleştirir.

İki Rows çıkışı formatlar.


6

MATLAB, 113

Sondaki boşluklara izin verildiğini varsayarsak (evet gibi), işte bir MATLAB anonim işlevi:

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

Ve bir açıklama:

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

Düzgün çalışmak için görünür. Hala sondaki alan var, ancak şimdi tüm sosisleri doğru şekilde kullanıyor.


3

Perl, 84 77 bayt

Birileri muhtemelen bundan biraz tıraş olabilir ...

84 bayt

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

77 bayt

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

Yıkmak:

STDIN'in ilk satırını alın, değerleri harf kodlarına dönüştürün, fazladan çöpleri silin. dDeğiştirici gerçekten gerekli olmamalıdır, ama garip unicode sorunları koştu ¤onsuz karakteri.

Bulunan her karakter için değişken oluşturmak ve / veya artış değişkenini oluşturmak için sembolik referans kullanın.

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

Üçlü alt çizgi nedeniyle C değişkenini 3'e bölün

$C /= 3;

Sıfırdan büyük bir değere sahipse , alfabe içinde dolaşın ve tek harfli büyük değişkenleri harf ile birlikte yazdırın

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

Test sonucu: http://ideone.com/alpUlI

Düzenleme : Harf çevirerek anonim dönüş değerini doğrudan içine geçirerek 7 bayt doğrayın split.


2

Perl, 172 bayt

Daresay daha bu sosis hala dilimlenmiş olabilir, ama işte on için bir başlangıç.

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

Ungolfed versiyonu

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

Test sonuçları

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

Bunu kısaltacağınızdan eminim, ama zaten bir Python çözümü yoktu.

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çıklama

Oldukça basit, bazıları okunabilir bile diyebilir, ancak işte yine de kısa bir açıklama:

Her sosis sadece ilk satırdan belirlenebildiğinden, ilk giriş satırı okunur.

Şimdi a={z:x.count(y)for y,z in zip('¤l/.^_','PSLKRC')}(sosis her tür tanıtıcı eşleyen bir sözlük anlama olduğunu zsosis her tür sayımına) ( x.count(y)nerede ysosis tanımlayan karakteridir).

Daha sonra üçlü alt çizgi nedeniyle Cotechino Modena (C) sosislerinin sayısını 3'e böldük .

Sonunda sonucu yazdırmak: print(' '.join(str(a[x])+x for x in a if a[x])). Bu, her bir sosisin bir defada bir çıktı a[x]vermesini sağlar , ancak yalnızca bu sosis en az bir kez görüldüyse ( sıfır değil => Truthy). Her sayım dizgisi bir boşlukla birleştirilir ve yazdırılır.


için 'a [x]' + '' + a [x] yazdırın ... Çalışmalı (test edilmemeli) ve 5 bayt kazandırır. Bir geri tepme olmakla.
agtoever
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.