Yoklama Mühendisi Yoklama İstatistikleri


22

Giriş

Bir ankette bir dizi seçim yüzdesi göz önüne alındığında, bu istatistikleri oluşturmak için ankette bulunması gereken asgari seçmen sayısını hesaplayın.

Örnek: En sevdiğiniz evcil hayvan hangisidir?

  • Köpek: 44.4%
  • Kedi: 44.4%
  • Fare: 11.1%

Çıktı: 9(mümkün olan en az seçmen sayısı)

gözlük

Programınızın / işlevinizin gereksinimleri:

  • Girdi olarak bir yüzde değer dizisi verilir (stdin'de, işlev argümanı olarak vb.)
  • Her yüzde değeri, bir ondalık basamağa yuvarlanmış bir sayıdır (örn 44.4 44.4 11.1.).
  • Ankette, sonuçları bir ondalık basamağa yuvarlandığında kesin yüzdelere ulaştırabilecek asgari seçmen sayısını hesaplayın (stdout'ta veya işlev dönüş değeri).
  • Bonus : Eğer "önemsiz" bir şekilde çözebiliyorsanız -15 karakter (yani, çalışan ilkini bulana kadar her olası seçmen sayısı arasında yineleme yapmayı içermez)

Örnek

>./pollreverse 44.4 44.4 11.1
9
>./pollreverse 26.7 53.3 20.0
15
>./pollreverse 48.4 13.7 21.6 6.5 9.8
153
>./pollreverse 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 99.6
2000
>./pollreverse 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 98.7
667
>./pollreverse 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 98.7
2000
>./pollreverse 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 97.8
401

puanlama

Bu kod-golf, bu yüzden mümkün olan en kısa karakter kazanır. Herhangi bir bonus toplam karakter sayısından daha fazla çıkarılır.


2
Bunun test için birkaç daha garip olayla sonuçlanabileceğini düşünüyorum. 26.7 53.3 20.0(4 8 3 15), 48.4 13.7 21.6 6.5 9.8(74 21 33 10 15/153) vs.
Gareth

@Gareth: İyi düşünce. Test durumlarınızla güncellendi.
mellamokb

Tüm oyların toplamı% 100 olmamalı mı? son dört test
evresinde

@Gajet: Hayır, her zaman% 100'e eşit değildir. Her zaman bir yuvarlama olduğunda 0.5%, toplamdan kaybedersiniz ve her yuvarlama 0.5%olduğunda, toplamı toplarsınız. Son dört test vakası, bu fenomenden en iyi şekilde yararlanmak için bilerek inşa edildi. Sonuçlanan ilk sınavda 2000, ilk 9 girişin her biri 1oyu temsil eder (ve hepsi yuvarlanır 0.5%), sonuncusu 1991oyları (ve yuvarlanır 0.5%) temsil eder . Bu yüzdeleri manuel olarak hesaplar ve 1 ondalık basamağa yuvarlarsanız, hepsinin doğru olduğunu görürsünüz.
mellamokb

VBA’daki önemsiz cevaplarla mücadele ediyorum (o zamandan beri denedim, hiç olmadı), ama üzerinde çalışıyorum!
Gaffi

Yanıtlar:


2

APL (Dyalog Klasik) , 48 43 bayt

-5 Adám bayt

+/0(⊢+{(⌈/⍷⊢)⍺-⍵÷+/⍵})⍣{z≡⍎3⍕⍺÷+/⍺}⍨z←.01×⎕

Tam program stdin'den girdi alıyor.

Çevrimiçi deneyin! Bağlantı dfn versiyonudur.

Ungolfed

normalize   ÷ +/
find_max  {⍵⍷⍨⌈/⍵}
round  {⍎3⍕⍵}
increase  {find_max  - normalize ⍵}
vote_totals  {z←⍺   (⊢+increase)⍣{z  round normalize ⍺} ⍵}
h  {+/ (.01×⍵) vote_totals 0}

Çevrimiçi deneyin!

  • normalize÷haklı argümanının ( ) tüm elemanlarını ( ) toplamıyla ( +/) ayırır .
  • round(y)biçimlendirerek ( ) ve ardından değerlendirerek y'yi 3 ondalık basamağa yuvarlar. ) öğelerini .
  • find_max(y) max (y) bulunduğu ve 1 başka yerde 0 olan bir dizi döndürür.
  • increase(x,y) x (hedef yüzdeleri) ve y (geçerli oyların toplamı) dizisini alır ve yüzdeleri x'e yaklaştırmak için y'yi 1 olarak nereye ekleyeceğini hesaplar.
  • vote_totals(x,y) x (hedef yüzdeleri) ve y (başlangıç ​​oy toplamı) alır ve yüzdeleri x'e yuvarlanıncaya kadar oy ekleyerek f'yi tekrar tekrar yürütür.
    • Sözdizimi , doğru oluncaya kadar tekrar tekrar f ⍣ gyürütmek anlamına gelir . Bu durumda görmezden geliyoruz .fg(y,f(y))f(y)
  • h(x) y'yi 0'a ayarlar (vectorization nedeniyle 0 dizisine eşdeğerdir), g yürütür ve son oy toplamını toplar.

7

Python, 154

def p(x):
 n=[1]*len(x);d=2;r=lambda z:round(1000.*z/d)/10
 while 1:
    if(map(r,n),sum(n))==(x,d):return d
    d+=1
    for i in range(len(x)):n[i]+=r(n[i])<x[i]

Şimdi son örnek için çalışıyor.

Örnek çalıştırır:

>>> p([44.4, 44.4, 11.1])
9
>>> p([26.7, 53.3, 20.0])
15
>>> p([48.4, 13.7, 21.6, 6.5, 9.8])
153
>>> p([0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 99.6])
2000
>>> p([0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 98.7])
667
>>> p([0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 98.7])
2000
>>> p([0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 97.8])
401

Son örnekte bir şeylerin yanlış olabileceğini düşünüyorum; belki de 99.1en son değeri demek
istedin

2
Bence doğru ama oldukça kafa karıştırıcı. 1/2000 = 0.05%( 0.1%yuvarlak) ve 1991/2000 = 99.55%( 99.6%yuvarlak). Eğer bir ankette on seçenek varsa ve en son 1991 oy alırken dokuz tanesi bir defa oylanırsa, o zaman bu yüzdeleri verir.
grc

Haklısın. Harika bir çözüm, BTW.
Cristian Lupascu

Bu ipucunu izleyerek 3 karakterden daha tasarruf edebileceğinizi düşünüyorum: codegolf.stackexchange.com/a/58/3527
Cristian Lupascu

Sağol w0lf. Sekmeleri eklemek için şimdi güncelledim. Birileri merak ediyorsa, sekmeler dört boşluk olarak görünür.
grc

4

J, 57 karakter

t=:".>'1'8!:0|:100*%/~i.1001
{.I.*/"1(t{~i.#t)e."1~1!:1[1

Önemsiz yöntem kullanılır. Klavyeden girdi alır. tarama tablosu oluşturur ve ikinci satır tablo içindeki girişi arar. İlgilenen olursa kodun genişletilmiş bir açıklamasını yapabilirim.

Bir kesir oluşturmak için yüzdeyi kullanmaya başlamıştım, ardından sayıyı bulmak için en düşük kesri şeklini almıştım, ancak sonuçların yuvarlanmasıyla çalışmasını sağlayacak bir yol bulamadım.


Hmm, bu yeni test durumu için başarısız. Bir düzeltme aramam gerekecek.
Gareth

4

Python, 154

def r(l):
 v=0
 while 1:
  v+=1;o=[round(y*v/100)for y in l];s=sum(o)
  if s: 
    if all(a==b for a,b in zip(l,[round(y*1000/s)/10for y in o])):return s

+1 iyi görünüyor! ideone.com/k2Mgb . Kırmak için patolojik bir vaka bulmaya çalıştım ama yapamadım.
mellamokb

Zaman sınırını aştığından dolayı ideone oluşturamıyorum, ancak ne sonuç alıyorsunuz [0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,99.6]?
mellamokb

hmm ... yarım saat ve program hala çalışıyor. Bence bu bir kırıcı olduğunu söylemek güvenlidir. ancak bunun nasıl geçerli bir cevap olabileceğini göremiyorum çünkü% 100,5 ve% 100 değil
Blazer

2
1/2000 = 0.05%( 0.1%yuvarlak) ve 1991/2000 = 99.55%( 99.6%yuvarlak). Bu yüzden aslında% 100 toplam, ancak yuvarlama gerçekten kafa karıştırıcı kılar.
grc

3

VBA - 541

Bunun göze batan bazı hataları var, ancak benim için önemsiz olmayan / döngüsel olana kadar doğru sayıdaki bir çözümü bulma çabamdı. Ben tam anlamıyla golf oynamıyorum, ancak bu konuda eklenmesi gereken çok şey olduğunu sanmıyorum. Ancak, bunun için çok zaman harcadım ve şimdi başımı acıtıyor. Bahsetmiyorum bile, kurallar muhtemelen çok kırılmış ve sadece bu örneklere az ya da çok uygulanıyor.

Bu benim yaptığım birçok test için (yani toplamlar, hatta 2 veya 3 girdi bile) çok iyi sonuç veriyor, ancak zorlukla sunulan bazı testler için başarısız oluyor. Ancak, girişin ondalık hassasiyetini arttırırsanız (zorluğun kapsamı dışında) doğruluğun arttığını gördüm.

Çalışmanın çoğu, sağlanan sayılar kümesi için gcd'yi bulmaktan ibarettir ve Function g()çıktılarımdaki hataların en azından bir kısmının kesin olarak eksik ve muhtemelen bir kaynağı olmasına rağmen, bunu başardım .

Giriş, boşlukla ayrılmış bir değerler dizesidir.

Const q=10^10
Sub a(s)
e=Split(s)
m=1
f=UBound(e)
For i=0 To f
t=1/(e(i)/100)
m=m*t
n=IIf(n>t Or i=0,t,n)
x=IIf(x<t Or i=0,t,x)
Next
h=g(n,x)
i=(n*x)/(h)
If Int(i)=Round(Int(i*q)/q) Then
r=i
ElseIf (n+x)=(n*x) Then
r=(1/(n*x))/h/m
ElseIf x=Int(x) Then
r=x*(f+1)
Else
z=((n+x)+(n*x)+m)*h
y=m/(((m*h)/(f+1))+n)
r=IIf(y>z,z,y)
End If
Debug.Print Round(r)
End Sub
Function g(a,b)
x=Round(Int(a*q)/q,3)
y=Round(Int(b*q)/q,3)
If a Then
If b Then
If x>y Then
g=g(a-b,b)
ElseIf y>x Then
g=g(a,b-a)
Else
g=a
End If
End If
Else
g=b
End If
End Function

Testcases (giriş ==> beklenen / iade edildi):

Passed:  

"95 5" ==> 20/20
"90 10" ==> 10/10
"46.7 53.3" ==> 15/15
"4.7 30.9 40.4 23.8" ==> 42/42
"44.4 44.4 11.1" ==> 9/9
"26.7 53.3 20.0" ==> 15/15
"48.4 13.7 21.6 6.5 9.8" ==> 153/153
"0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05 99.55" ==> 2000/2000
"0.15 0.15 0.15 0.15 0.15 0.15 0.15 0.15 0.15 98.65" ==> 2000/2000
"0.149925 0.149925 0.149925 0.149925 0.149925 0.149925 0.149925 0.149925 0.149925 98.65067" ==> 667/667


Failed:  

"0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 99.6" ==> 2000/1000
"0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 98.7" ==> 2000/5000
"0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 98.7" ==> 667/1000
"0.14 0.14 0.14 0.14 0.14 0.14 0.14 0.14 0.14 98.65" ==> 667/10000
"0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 97.8" ==> 401/500
"0.24 0.24 0.24 0.24 0.24 0.24 0.24 0.24 0.24 97.75" ==> 401/235
"0.249377 0.249377 0.249377 0.249377 0.249377 0.249377 0.249377 0.249377 0.249377 97.75561" ==> 401/14010

Eğer dönüştürerek 6 bayt gevşek olabilir Debug.Print içinDebug.?
Taylor Scott

2

C # (.NET Core) , 286 bayt

double M(string[]a){var p=a.Select(double.Parse).ToList();var n=p.Select(x=>1d).ToList();var c=2;for(;;){Func<double,double>f=x=>Math.Round(x*1000/c,(MidpointRounding)1)/10;if(n.Select(f).Zip(p,(x,y)=>x==y).All(z=>z)&&c==n.Sum())return c;c++;n=n.Zip(p,(x,y)=>x+(f(x)<y?1:0)).ToList();}}

Çevrimiçi deneyin!

Peter Taylor ve Cehalet Tüzüğü sayesinde çok sayıda bayt kurtarıldı


Bunu ideone.com'da test etmek için nasıl değiştirebilirim?
Gareth

}Sonunda bir eksik olduğunu düşünüyorum .
grc

@Gareth ideone.com'da çalıştırmayı denedim, ancak 4.0'dan daha eski bir .NET framework sürümü kullanıyor, çünkü Linq Zipyöntemini tanımıyor .
Cristian Lupascu

@grc Bunu işaret ettiğiniz için teşekkürler. Güncellenmiş.
Cristian Lupascu

1
@Gaffi: Hayır, C # yazarken (Java gibi) katı bir yazı yazmalıdır. Bundan 1>0daha kısa olduğu trueiçin tercih edilir.
mellamokb

0

Python 3 , 140 139 137 bayt

f=lambda l,m=1,i=0,c=0,x=0:round(x*100,1)-l[i]and(x<1and f(l,m,i,c,x+1/m)or f(l,m+1))or l[i+1:]and f(l,m,i+1,c+x)or c+x-1and f(l,m+1)or m

Çevrimiçi deneyin!

İlk iki test vakası için doğru cevabı verir ve Python'un diğerleri için özyineleme sınırlarını aşar. Bu çok şaşırtıcı değil, çünkü her kontrol yeni bir özyineleme düzeyinde yapıldı. Kısa, yine de ...

(Kullanılan değişkenlerin bir açıklaması TIO linkinde bulunabilir)

f=lambda l,m=1,i=0,c=0,x=1:round(x*100,1)-l[i]and(x and f(l,m,i,c,x-1/m)or f(l,m+1))or l[i+1:]and f(l,m,i+1,c+x)or c+x-1and f(l,m+1)or m

için çalışmalı 136 bayt , fakat kayan kesinlikten dolayı olmamalıdır.

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.