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.