Antrenman değişikliği [kapalı]


10

Otomatik yazarkasa için bir program yazıyorsunuz. Kullanıcının en az kullanılan jetonla değişmesi gerekir. Bir miktar alan (1.53 $ diyelim) ve ABD mezheplerinde değişiklik veren bir program yazın - bu örnekte: 1 x bir dolar notu, 1 x elli sent ve 3 x bir kuruş. En kısa program kazanan olacaktır. Diğer para birimlerini (örn. İngiltere mezhepleri) ve olağandışı para birimlerini (1, 2, 3 sent?) Desteklemek için bonus puanlar

Bu ABD mezheplerine sahipsiniz: 1 sent, 5 sent, 10 sent, 25 sent, 50 sent, 1 dolar (banknot veya madeni para), 2 dolar, 5 dolar, 10 dolar.

Şu İngiltere mezheplerine sahipsiniz: 1 peni, 2 peni, 5 peni, 10 peni, 20 peni, 50 peni, 1 £, 2 £, 5 £ (para veya bozuk para), 10 £.


3
Bunun muhtemelen biraz açıklığa ihtiyacı var. Öncelikle muhtemelen en az sayıda jeton istediğimizi belirtmelisiniz (bu, bonus sorusunu biraz daha ilginç kılar, örneğin {1c, 49c, 50c} ve 98c saf bir algoritmayı kırır). İkinci olarak, bir girdi / çıktı formatı yararlıdır. Elde edilemeyen değerlerin (telafi para birimleri için) ele alınmasına ilişkin bilgiler yardımcı olacaktır. Son olarak - burada mezhepleri listelemek isteyebilirsiniz, böylece insanların aşina olmaları durumunda onu aramaları gerekmez.
Nabb

Bonus puanları nasıl çalışır? En kısa program için bir kravat varsa?
gnibbler

@gnibber, Stephen Fry'dan alıntı: "[puanlar] demografik olarak seçilen bir müşteri hizmetleri odak danışmanlığı tarafından, yaş ve cinsiyete göre ayrılmış olarak, yani ben tarafından tarafsız bir şekilde belirlenir."
Thomas O

Henüz 50 centlik bir sikke görmediğim için 50c isteyeceğim. Ama açıkça varlar
Martin York

Yanıtlar:


2

Windows PowerShell, 108 111 117

İlk denemede, bugüne kadar golf dinledi

$i=+("$input"-replace'[^\d.]')
$args|%{0d+$_}|sort -des|%{$a=[math]::floor($i/$_)
if($a){$i-=$a*$_
"$a×$_"}}

Uygulama notları:

  1. Boru hattı üzerinden döndürülecek miktarı kabul eder
  2. Komut satırı üzerinden para birimi cinsinden listesini kabul eder
  3. Miktar bir para birimi işaretiyle verilebilir; (aslında sayısal olmayan herhangi bir şey) çıkarılacaktır.
  4. Mezhepler listesinin sıralanması gerekmez.
  5. Program, verilen mezheplerle elde edilebilen talep edilen miktardan daha büyük bir değişiklik, yani 1 kuruşluk para eksikse 1.53 için 1.5 çıktı verecektir.

3 ve 4'ün tatmin edilmesi gerekmiyorsa (yani ; girdi biçimini kontrol ediyorum ;-)), o zaman aşağıdaki program yeterlidir (71):

$i=+"$input"
$args|%{$a=[math]::floor($i/$_)
if($a){$i-=$a*$_
"$a×$_"}}

2

Mathematica: 110 karakter

Sort[IntegerPartitions[Rationalize@#,Infinity,{10,5,2,1,1/2,1/4,1/10,5/100,1/100}],
    Length@#1<Length@#2&][[1]]&  

kullanım

%[0.98]  
{1/100, 1/100, 1/100, 1/10, 1/10, 1/4, 1/2}  

Veya

Tally@Sort[IntegerPartitions[Rationalize@#,Infinity,
                             {10,5,2,1,1/2,1/4,1/10,5/100,1/100}],
     Length@#1<Length@#2&][[1]]&  

(6 karakter daha)

{{1/100, 3}, {1/10, 2}, {1/4, 1}, {1/2, 1}}

Diğer mezhepler için, rasyonel tabloyu {10, ...., 5 / 100,1 / 100} değiştirin


2

D: 225 Karakter

import std.algorithm,std.conv,std.stdio;void main(string[]args){auto m=args[1].findSplit(".");void p(T,S)(T t,T u,S s){foreach(v;[u,10,5,1]){writefln("%s %s%s",t/v,v,s);t-=(t/v)*v;}}p(to!int(m[0]),20,"");p(to!int(m[2]),25,"/100");}

Daha okunaklı:

import std.algorithm,std.conv,std.stdio;

void main(string[] a)
{
    auto m = a[1].findSplit(".");

    void p(T, S)(T t, T u, S s)
    {
        foreach(v; [u, 10, 5, 1])
        {
            writefln("%s %s%s", t / v, v, s);
            t -= (t / v) * v;
        }
    }

    p(to!int(m[0]), 20, "");
    p(to!int(m[2]), 25, "/100");
}

Yalnızca ABD para birimini kullanır. Değeri komut satırında kayan nokta değeri olarak alır (1 doların altındaki değerler için baştaki 0 ​​değerine sahip olmalıdır). $ Değerini değerin bir parçası olarak kabul etmez. Her bir fatura / bozuk para türünün sayısını ayrı bir satıra çıkarır. Örneğin 1.53 girdisi şunlarla sonuçlanır:

0 20
0 10
0 5
1 1
2 25/100
0 10/100
0 5/100
3 1/100


1

Mathematica, 51 bayt

#~NumberDecompose~{10,5,2,1,.5,.25,.1,.05,.01}&

giriş

[1.53]

çıktı

{0, 0, 0, 1, 1, 0, 0, 0, 3.}


Mathematica, 82 bayt - BONUS İLE--

(s=#~NumberDecompose~#2;Row@Flatten@Table[Table[#2[[i]]"+",s[[i]]],{i,Length@s}])&

Giriş

[37.6, {15, 7, 2.5, 1, 0.88, 0.2, 0.01}]

çıktı

15 +15 +7 +0,2 +0,2 +0,2 +


Hmm, bu soru kopyadan farklı mezhepler kullanıyor.
ericw31415

OP giriş / çıkış formatını belirtmez.
J42161217

Bu soru 100 dolarlık fatura kullanmıyor ve bonus yok.
ericw31415

tamam. düzeltildi ve bazı baytlar kaydetti! Bonus gelince, sizden soruyu tekrar okumanızı rica ediyorum. Özellikle bölüm .. "Diğer para birimlerini desteklemek için bonus puan"
J42161217

Hata! Sanırım bunu görmedim!
ericw31415

1

Javascript, 84 83 bayt

(n,v=[10,5,2,1,.5,.25,.1,.05,.01],l=[])=>{for(i in v)l[i]=n/v[i]|0,n%=v[i];return l}

(n,v=[10,5,2,1,.5,.25,.1,.05,.01],l=[])=>eval("for(i in v)l[i]=n/v[i]|0,n%=v[i];l")

Açgözlü bir algoritma kullanı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.