Şükran günü hindisi


10

(Umarım hala senin için Şükran günüdür)

Şükran günü yemeğiniz için bir hindi var ama nasıl eşit olarak dağıtacağınızı bilmiyorsunuz. Sorun şu ki, bazı insanlar diğerlerinden daha fazla yemek, bu yüzden bir çözüm bulmanız gerekiyor

Giriş

İki giriş olacaktır. Birincisi çeşitli insanların ascii sanatı olacak.

     o
 o  \|/
\|/  |
 |   |
/ \ / \

ascii-art özellikler

Her insan 3 sütun genişliğinde yer alır. Her kişi tek bir boşluk sütunu ile ayrılır. Her insanın en tepesi bir o. Aşağıda o, telafi 1ve -1x vardır \ve /sırasıyla. Girdideki oikinci ila son satır arasında, |kişi başına bunların miktarı "yükseklik" tir. Her bir kişiden çıkarmanız gereken tek veri "boyudur".


Her zaman en az bir kişi olacaktır. Her insanın her zaman en az 2 yüksekliği vardır. Programınızın işlemesi gereken maksimum yükseklik en az 64 yüksekliktir.

Boşluklarla doldurulmuş girdinin bir dikdörtgen oluşturmasını istiyorsanız, lütfen cevabınızda bunu belirtin.


İkinci girdi hindi. Hindi aslında bir türkiye değil, daha NxMçok türkiye boyutlarında. İkinci girdi ise 3x2, hindi 3 * 2 boyutlarında ve toplam 6 alana sahiptir.

Çıktı

Çıktı bir liste veya dilinizin en yakın alternatifi olabilir (örn. Dizi). Değerler boşluklarla ayrılmış bir dize de çıkarabilirsiniz.

Her bir kişi için değerler, girildikleri sıraya göre çıkarılmalıdır.

Meydan okuma

Amacınız hindi bölgesini insanlar arasında bölmek.

Örnek bir senaryo:

Bunların , sırasıyla 3ve yükseklikleri olan iki kişi olduğunu varsayın 6. Türkiye varsa 5x3. Türkiyenin dağıtılması gereken toplam alanıdır 15.

Şimdi bunu herkes arasında nasıl dağıtırsınız? Bunu nasıl yapacağınız aşağıda açıklanmıştır:

                    the_persons_height
TurkeyForAPerson = -------------------- * turkey_area
                    sum_of_all_heights

Bu, yüksekliği olan ilk kişi 3için 3/9*15hindi alacaktır veya 5yüksekliği olan ikinci kişi veya hindi 6alacaktır .6/9*1510

Çıktı

Çıktı sadece rakamlardan oluşmalı .ve bonus için gitmeyi seçmediğiniz sürece. Bu durumda, yalnızca rakamlardan, boşluklardan ( ) ve eğik çizgiden ( /) oluşabilir .

Tam örnek

Giriş:

6x5
     o 
     | 
 o  \|/
\|/  | 
 |   | 
 |   | 
/ \ / \

Çıktı:

11.25 18.75

Bonuslar

-20% Bonus: Bir kesir çıkarırsınız (basitleştirilmelidir), bunun karışık mı yoksa uygunsuz bir kesir mi olduğu önemli değildir .

puanlama

Bu bayt en kısa kodu kazanır!


Bir şeyi özlüyor olabilirim, ama her bir kişi için çıktıyı diğerlerinden nasıl ayırmalıyız? Yani çıktı tam olarak hangi formatta olmalıdır?
ETHproductions 26:15

@ETHproductions Bir liste halinde çıktı verebilir veya boşluklarla ayırarak bunu belirtmeyi unuttuğuma inanamıyorum.
Downgoat

Türkiye boyutları için bir üst sınır var mı? yani her boyut her zaman bir basamak mıdır, yoksa 11x10 veya daha üstü olabilir mi?
Tom Carpenter

@TomCarpenter birden fazla basamak olabilir, üst sınır dilinizin desteklediği her
şeydir

Yanıtlar:


3

Pyth, 23 bayt

mc*vXzG\*dsN=N-/R\|C.z0

Bu, çevrimiçi sürümde çalışmaz, çünkü evalhindi büyüklüğünü belirlemek için kullanır .

Açıklama:

mc*vXzG\*dsN=N-/R\|C.z0   implicit: z = first input line
                    .z    read all other lines
                   C      transpose them
               /R\|       count the "|"s in each column
              -       0   remove 0s in this list (columns with no "|"s)
            =N            assign the resulting list to N
m                         map each value d in N to:
    XzG\*                    replace every letter in z with a "*"
   v                         evaluate the result (does the multiplication)
  *      d                   multiply with d
 c        sN                 divide by sum(N)

4

LabVIEW, 67 Bayt

Im meta yazı önerdi sonra sayma bu yüzden onun sabit değil ama evet burada gider.

resim açıklamasını buraya girin

boşluklarla doldurulmuş giriş bekleniyor.

Kafaları sayıyorum ve kafaların bulunduğu çizgiden insanların boyutunu alıyorum


3

Japt , 49 46 bayt

Japt kısaltılmış versiyonudur Ja vaScri nk . yorumlayıcı

W=UqR y f@Y%4¥1 £Xq'| l -1)£Vq'x r@X*Y,1 *X/Wx

Dizi olarak çıktılar. (İki girişin her birini tırnak içine almanız gerektiğini unutmayın.)

Nasıl çalışır

            // Implicit: U = stick-figures, V = turkey size
W=UqR y     // Assign variable W to: split U at newlines, transpose rows with columns,
f@Y%4==1    // take each stick-figure body,
m@Xq'| l -1 // and count the number of "|"s.
)m@Vq'x     // Now map each item X in W to: V split at "x",
r@X*Y,1     // reduced by multiplication, starting at 1,
*X/Wx       // multiplied by X and divided by the total of W.
            // Implicit: output last expression

3

MATLAB 109 *% 80 = 87,2 bayt

function o=f(t,p);p=char(strsplit(p,'\n'));a=sum(p(:,2:4:end)=='|');o=rats(prod(sscanf(t,'%dx%d'))*a/sum(a));

Yani bu iki girdi alan bir MATLAB fonksiyonudur, birincisi hindi büyüklüğü için bir dizedir (örneğin '8x4', ikincisi insanları içeren dizedir. Her kişi için uygun olmayan kesirler içeren bir dize döndürür.

Bu çok daha küçük olabilirdi, ancak yeni çizgiler zorlaştı. MATLAB, bir dizeyi ;her satır için ayırıcı olarak kolayca dönüştürebilir , ancak yeni bir satır kullanmaya çalışmak 25 karaktere mal olmak zor oldu:

p=char(strsplit(p,'\n')); % Converts the input person string to a 2D array

İnsanların büyüklüğünü elde etmek aslında oldukça kolaydır:

a=sum(p(:,2:4:end)=='|');

Bu, ikinciden başlayarak her dördüncü sütunu alır (bu, insanların gövdelerinin olacağı tüm sütunlar olacaktır), daha sonra bunu, vücut bitlerinin olduğu 1'leri ve bulunmayan 0'ları içeren bir diziye dönüştürür. Son olarak a, her bir kişinin boyutunu içeren bir 1D dizisi olan diziyle sonuçlanan sütun-bilge toplar.

prod(sscanf(t,'%dx%d'))*a/sum(a)

Daha sonra hindi büyüklüğünü formdaki giriş dizesinden çıkarıyoruz %dx%d, yani bir sayı sonra 'x' sonra başka bir sayı. Ortaya çıkan iki sayı dizisi hindi alanını elde etmek için birlikte çarpılır.

Bu, halkların her birinin yüksekliği ile çarpılır ve aynı zamanda her insan için hindi bölümünü ondalık sayı olarak almak için tüm insanların toplam yüksekliğine bölünür.

rats(...)

Bonusu nitelendirmek için son adım - bu bit kodu 6 karakter daha uzun hale getirir, ancak bonus ~ 22'yi devirir, bu yüzden buna değer. rats()ondalık bir sayıyı basitleştirilmiş bir uygunsuz kesire (13 dp'ye kadar doğru) dönüştüren hoş bir işlevdir. Bir ondalık sayı dizisi (yani her bir kişi için miktar) beslemek, her bir kişi için boşluklarla ayrılmış olarak kesirler içeren tek bir dize döndürür.

Çıktısını Verilen rats()birden fazla boşluk ekler, ama soru yapamıyor söylemez - sadece dize sadece hane olmalıdır diyor '' ve '/'.

Bu örnekten çıktıdır (gerçek çıktıda değil boşlukların kaldırılmasını önlemek için eklediğim tırnak işaretleri):

'     45/4          75/4     '

Örnek kullanım:

f('6x5',['     o ' 10 '     | ' 10 ' o  \|/' 10 '\|/  | ' 10 ' |   | ' 10 ' |   | ' 10 '/ \ / \'])

çıktı:

'     45/4          75/4     '

Ayrıca çevrimiçi Octave yorumlayıcıda (uyarılarla birlikte) çalışır . Burada deneyebilirsiniz . Bağlantı, fbir dosyada zaten tanımlanan işlevin bulunduğu bir çalışma alanıdır . Bu yüzden komut isteminde yukarıdaki örnek kullanımı girebilmeniz gerekir.



2

Haskell 119 bayt

import Data.List
g x=sum[1|y<-x,y>'{']
s#p|(h,_:t)<-span(<'x')s=[g x*read h*read t/g p|x<-transpose$lines p,any(>'{')x]

Kullanım örneği: "6x5" # " o \n | \n o \\|/\n\\|/ | \n | | \n | | \n/ \\ / \\\n"-> [11.25,18.75].


2

JavaScript (ES6), 131 bayt

(t,p)=>eval(`h=[];for(s=0;m=r.exec(p);s++)h[i=m.index%l/4|0]=~~h[i]+1;h.map(v=>v/s*${t.replace("x","*")})`,l=p.search`
`+1,r=/\|/g)

Bir dizi bölüm döndürür.

açıklama

(t,p)=>                      // t = turkey equation, p = ASCII art of people
  eval(`                     // use eval to enable for loop without {} or return
    h=[];                    // h = array of each person's height
    for(s=0;m=r.exec(p);s++) // for each match of "|", s = sum of all heights
      h[i=m.index%l/4|0]=    // i = person index of this match
        ~~h[i]+1;            // increment person's height (~~ casts undefined to 0)
    h.map(v=>v/s*            // divide each height by the sum and multiply by turkey area
      ${t.replace("x","*")}  // since this is inside an eval just convert t to an equation
    )`,                      // implicit: return array of each person's portion

    // These are executed BEFORE the eval (escaping characters would mean more bytes)
    l=p.search`
`+1,                         // l = line length
    r=/\|/g                  // r = regex to match height markers
  )

Ölçek


1

Python 99 bayt

lambda a,b: [`(''.join(i)).count('|')*1.0/a.count('|')*eval(b)` for i in zip(*a.split('\n'))[1::4]]

Giriş:' o \n | \n o \\|/\n\\|/ | \n | | \n | | \n/ \\ / \\','6*5'

Çıktı: ['11.25', '18.75']

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.