이 도전은 센트를 만든다


29

알아, 제목이 너를 깨뜨린 다


금액이 산출되면 가장 적은 수의 동전 이 그 금액을 구성합니다.

0.1
1 dime

0.01
1 penny

0.28
1 quarter 3 penny

0.56
2 quarter 1 nickel 1 penny

1.43
5 quarter 1 dime 1 nickel 3 penny

투기

  • 달러로 100 센트.
  • 각 유형의 동전 값은 다음과 같습니다.
    • penny 1 센트
    • nickel 5 센트
    • dime 10 센트
    • quarter 25 센트

이 작업을 사소한 내장 기능은 허용되지 않습니다.

I / O

입력은 합계의 달러 값을 나타내는 10 진수입니다.

  • 복수형 필요 없음
  • 주문 : quarter->penny
  • 출력은 <#_of_coins> <coin type>
  • Seperators : ,또는 ,또는

허용되는 유일한 후행 공백은 단일 후행 줄 바꿈 / 공백입니다.


코인 유형이 0이면 해당 코인 유형이 표시되지 않아야합니다 . 예 : 0.25-> 1 quarter 아님 1 quarter 0 dime 0 nickel 0 penny


@VoteToClose 아니오, 그러나 쉼표를 구분자로 허용합니다
Downgoat

마지막 예는 1.43보다 큼1
Luis Mendo

@LuisMendo 아, 그 (less than 1)부분은 거기에 없었습니다. 샌드 박스에서 제거하는 것을 잊어 버렸습니다
Downgoat

출력이 괜찮다면 괜찮 2 quarter(2 spaces)1 nickel 1 penny습니까?
Conor O'Brien 1

1
@DigitalTrauma 13.00는 가능한 입력이 될 수 있지만 입력은 절대되지 않습니다 13. 나는 항상 소수점을 가질 것이다
Downgoat

답변:


5

CJam, 60

q~e2i[25A5]{md}/]" quarterx dimex nickelx penny"'x/.+{0#},S*

이 스크립트는 개선의 여지가 많은 것 같지만 지금까지는 짧습니다. 내장 된 "md"명령을 사용하여 나누기의 정수 결과와 나머지를 모두 리턴합니다. 다음을 수행합니다.

  • 입력을 읽습니다 (함수라면 두 문자 이하로 q ~를 제거 할 수 있다고 생각합니다)
  • 100을 곱한 값을 정수로 변환
  • 스택에서 나머지를 초래하는 [25 10 5]를 사용하여 "md"를 수행합니다.
  • 숫자와 동전 이름을 결합
  • 전자가 0이면 숫자와 동전 이름을 제거합니다
  • 사전 번호 0을 추가합니다

여기 사용해보십시오

이전 버전 :

q~e2i[25A5]{md}/]_:!:!" quarter x dime x nickel x penny"'x/.*.+e_0-
q~e2i[25A5]{md}/]_:!:!\" quarter x dime x nickel x penny"'x/.+.*

11

자바 스크립트 ES6, 107 바이트

n=>((n*=100)/25|0)+` quarter ${(n%=25)/10|0} dime ${n%10/5|0} nickel ${n%5|0} penny`.replace(/ ?0 \S+/g,"")

간단한 수학.


좋은 작업! 폐쇄 형 공식 솔루션이 있다고 생각했습니다.
Conor O'Brien

? 해당 코인 유형의 0이 없으면 코인 유형이 출력되지 않습니까?
Frentos

@Frentos 아니오, 끝에 동전이없는 동전 유형을 제거하는 정규식이 있습니다
Downgoat

@ Doᴡɴɢᴏᴀᴛ : 죄송합니다, 시각적 단서가 없을 때 텍스트 영역이 오른쪽으로 스크롤되었음을 인식하지 못했습니다 :-)
Frentos

|0이후 가 필요 n%5합니까?
Neil

11

파이썬 2, 120 바이트

n=int(round(input()*100))
a=25
for b in"quarter","dime","nickel","penny":
 if n>=a:print"%d "%(n/a)+b,
 n%=a;a=40/a+5^12

안전을 위해, 적어도 @Ogaday의 의견을 고치는 데 확실히 작동하는 것으로 변경되었습니다. 필요 여부는 확실하지 int()않지만, 필요 하지 않다는 것을 확신시키는 데 어려움을 겪고 있습니다.

print`n/a`+" "+b,

는 여분의 바이트 오프이지만 L큰 입력의 경우 여분 을 인쇄합니다 (이 코드는 부동 소수점 정밀도로 인해 매우 큰 입력에서는 작동하지 않지만).


1
당신은 내가 Mego 's가 쓰레기로 나가기 위해 솔루션을 개선하는 데 항상 썼다. 그래도 잘 했어!
Alexander Revo

1
+1 - 내가 당신을 마련하는 데 어떤 마법을 알고 싶어a=40/a+5^12
디지털 외상

@DigitalTrauma 예를 들어 [x^k for x in [10, 5, 1]], [k/y for y in [25, 10, 5]]다른 여러 가지 산술 연산자를 시도한 k후 두 목록이 5로 상쇄되는 것을 보았을 것입니다.
Sp3000

이것은 실제로 적어도 10.03and 에 대한 입력에서 실패합니다 10.04. 파이썬의 floats 표현과 int로 반올림하는 방법과 관련이 있습니다. 시도하십시오 "print %d"%(10.03*100).
Ogaday

n=int(''.join(raw_input().split(".")))작동하지만 꽤 장황합니다.
Sherlock9

7

dc, 104

"가독성"에 추가 된 줄 바꿈 :

[dn[ quarter ]n]sq
[dn[ dime ]n]sd
[dn[ nickel ]n]sn
[d1/n[ penny ]n]sp
?A0*
25~rd0<qst
A~rd0<dst
5~rd0<nst
d0<p

15
dc : 이제 Readability ™ 사용
Alex A.

6

망막 , 97

@randomra에게 감사합니다 (항상)-1 바이트를 절약했습니다.

입력이 xxx.yy또는 형식이라고 가정합니다 xxx.y.

\..$
$&0
\.

.+
$0$*:
(:{25})+
$#1 quarter 
(:{10})+
$#1 dime 
(:{5})+
$#1 nickel 
(:)+
$#1 penny

온라인으로 사용해보십시오.


1
$&과 동일 $0당신이 바이트를 저장할 수 있도록 $0.0하여 $&0.
randomra

0.9999999와 같은 것을 입력함으로써, 출력은 약간 미쳤다
Anthony Pham

연준이 10 개 micropenny 조각 ;-) 조폐 시작할 때 나는에 대한 지원을 추가 할 것입니다 @PythonMaster
디지털 외상을

4

Vitsy, 110 (100) 97 바이트

그래, 잠깐만, 난 아직도이 방법을 사용하고있어.

aa**Dv52^1m([N' retrauq 'Z]v52^MDva1m([N' emid 'Z]vDvaM51m([N' lekcin 'Z]v5MD([N'ynnep 'Z]
/D1M-D

곧 출시 될 자세한 모드의 설명 :

push a;
push a;
multiply top two;
multiply top two;
duplicate top item;
save top as temporary variable;
push 5;
push 2;
push second to top to the power of top;
push 1;
goto top method;
if (int) top is 0;
begin recursive area;
output top as number;
push " quarter ";
output stack as chars;
end recursive area;
save top as temporary variable;
push 5;
push 2;
push second to top to the power of top;
modulo top two;
duplicate top item;
save top as temporary variable;
push a;
push 1;
goto top method;
if (int) top is 0;
begin recursive area;
output top as number;
push " dime ";
output stack as chars;
end recursive area;
save top as temporary variable;
duplicate top item;
save top as temporary variable;
push a;
modulo top two;
push 5;
push 1;
goto top method;
if (int) top is 0;
begin recursive area;
output top as number;
push " nickel ";
output stack as chars;
end recursive area;
save top as temporary variable;
push 5;
modulo top two;
duplicate top item;
if (int) top is 0;
begin recursive area;
output top as number;
push " penny";
output stack as chars;
end recursive area;
:
divide top two;
duplicate top item;
push 1;
modulo top two;
subtract top two;
duplicate top item;

온라인으로 사용해보십시오!


2
retrauq거의 단어처럼 보인다 ...
코너 오브라이언

퍼머 링크가 작동하지 않습니다
Downgoat

죄송합니다. 이전 코드 링크. : P
Addison Crump

3

Java 8 람다, 165 바이트

입력 y을 double 또는 float로 예상합니다 .

y->{int c,d=(int)(y*100);return(((c=d/25)>0)?c+" quarter ":"")+(((c=(d=d%25)/10)>0)?c+" dime ":"")+(((c=(d=d%10)/5)>0)?c+" nickel ":"")+(((d=d%5)>0)?d+" penny":"");}

너무 많은 삼항. ;-;


;-;그게 뭐야? 왓 파야?
비커

@ 비커 울음.
애디슨 크럼

2

자바 스크립트 ES6, 202 200 바이트

나는 이것이 골프 될 수 있기를 바랍니다 ...

r=>eval('i=[.25,.1,.05,.01];v=[0,0,0,0];for(k=0;k<4;k++)for(;r>=i[k];v[k]++,r-=i[k],r=((r*100+.01)|0)/100);v.map((x,i)=>x?x+" "+"quarter0dime0nickel0penny".split(0)[i]:"").join` `.replace(/ +/g," ")')

Ungolfed 코드 :

function m(r){
    i=[.25,.1,.05,.01]
    v=[0,0,0,0]
    for(k=0;k<4;k++)for(;r>=i[k];v[k]++,r-=i[k],r=((r*100+.01)|0)/100);
    return v.map((x,i)=>x?x+" "+"quarter0dime0nickel0penny".split(0)[i]:"").join(" ").replace(/ +/g," ");
}

2

LabVIEW, 62 LabVIEW 프리미티브

이름과 값에 대해 2 개의 배열을 만들고 모듈러스 연산자 (R IQ 사물)를 사용하여 맨 위 (i가있는 인덱스 배열)를 통과했습니다. 나머지 코인은 시프트 레지스터로 전달됩니다.

값이 0보다 크면 숫자를 문자열로 변환하고 전달 된 문자열을 숫자와 동전 이름을 연결하고 시프트 레지스터에 다시 넣습니다.

Ijus는 내 gif가 잘못된 경우를 보여주지 않지만 어쨌든 볼 것이 없다는 것을 깨달았습니다.


"프리미티브"는 바이트와 어떻게 비교됩니까? x <y 일 때 "x 프리미티브"가 "y 바이트"를 초과합니까? 그냥 물어
루이스 멘도

링크를 확인하여 기본 요소의 계산 방법을 확인할 수 있습니다. labview 코드의 크기를 바이트 단위로 지정하면 빈 vi가 이미 ~ 10kb 크기이므로 다소 쓸모가 없습니다. 경험상 골프 언어의 바이트보다 몇 가지 프리미티브가 있으므로 CJam 등에서 약 50-60 바이트가됩니다.
Eumel

1
@LuisMendo LabView 파일의 정보 내용을 프리미티브 당 1 바이트 씩 바인딩 할 수 없으므로 LabView를 프리미티브 당 1 바이트로 계산하는 것은 불공평합니다.
lirtosiast

@ThomasKwa tbh 당신이 할 수있는 잘 짜여진 골프 언어로, 각각의 입력 루프에 대해 와이어 당 1 바이트 1 바이트는 2-4 바이트이고 동안은 3 프리미티브입니다
Eumel

2

apt, 77 바이트

` {U*=L /25|0} quÂòr {U%=25 /A|0} ÜX {U%A/5|0} Íõel {U%5|0} p¿ny` r" 0 %S+" x

고맙게도, 네 개의 코인 이름은 모두 압축 가능합니다. 는 ¿문자 그대로 바이트를 0x81해야합니다. 온라인으로 테스트하십시오!


임의의 입력으로 시도해 보았습니다 .18.33에서 1 센트 떨어져 있습니다 73 quarter 1 nickel 2 penny. 73 * .25 + 1 * .05 + 2 * .01 = 18.32 대신 18.33.
D. Strout

2

C, 147 144 142 140 바이트

a[]={25,10,5,1},m,i=0;f(float n){for(m=n*100;i<4;m%=a[i++])m/a[i]&&printf("%d %s ",m/a[i],(char*[]){"quarter","dime","nickel","penny"}[i]);}

테스트로 풀리지 않은 :

#include <stdio.h>

a[]={25,10,5,1},m,i=0;

f(float n)
{
    for(m=n*100;i<4;m%=a[i++])
        if(m/a[i])
            printf("%d %s ",m/a[i],(char*[]){"quarter","dime","nickel","penny"}[i]);
}

int main()
{
    float test[] = {.1, .01, .28, .56, 1.43};
    for(int j = 0; j < 5; i = 0)
    {
        f(test[j++]);
        printf("\n");
    }
}

1
어쩌면 교체 시도 char*[]char**, int a[]int*a,와를 넣어 m%=a[i++]for 루프의 마지막 부분에. 4 바이트를 저장해야합니다. 아직 테스트하지 않았으므로 각각 시도해보십시오.
타 크라

@ minerguy31 배열 대신 포인터를 사용하면 목록 이니셜 라이저를 사용할 수 없습니다. m%=a[i++]그래도 조금 움직 였다.
Alexander Revo

1
또한, 당신은 대체 할 수 있습니다 if(m/a[i])m/a[i]&&2 이상의 바이트 저장합니다.
타 크라

"quarter\0dime\0nickel\0penny"printf 에서도 사용해보십시오 . 각 \ 0은 문자열을 종료하고 각각 1 개의 문자를 저장합니다
takra

@ minerguy31에서 string with를 사용 \0하면 프로그램이 중단됩니다. 어쨌든 반복이 어떻게 그런 문자열에서 작동 해야하는지 잘 모르겠습니다.
Alexander Revo


1

자바 스크립트, 156 (145) 144 바이트

ETHproduction의 공식 답변과 일치하지 않지만 어쨌든 ...

function c(t){n=['quarter','dime','nickel','penny'];v=[.25,.1,.05,.01];s='';for(i in v){c=t/v[i]|0;if(c>0)s+=c+' '+n[i]+' ';t-=c*v[i];}return s}

이것은 내 첫 번째 골프 라운드 중 하나이므로 모든 개선 사항을 높이 평가합니다! 나는 이미 ETH의 "xor trunc"를 훔쳤습니다. 죄송합니다. 너무 똑똑했습니다 :-)

더 읽기 쉬운 :

function c(t)
{
  n = ['quarter', 'dime', 'nickel', 'penny'];
  v = [.25, .1, .05, .01];
  s = '';
  for(i in v)
  {
    c = t/v[i]|0;
    if(c>0) s += c+' '+n[i]+' ';
    t -= c*v[i];
  }
  return s
}

참고 : 나는 자바 스크립트 그 (? 내 컴퓨터에 적어도) 분할 실현 테스트하는 동안 1.13 / 0.01로를 1.12999...내 (그리고 아마도 다른 모든 JS 제출)하고, 제대로 100 % 작동하지 ...


마지막 세미콜론이 필요하다고 생각하지 않습니다.
Downgoat

0

펄 5 - 128 124 바이트

나는 이것을 훨씬 더 짧게 다시 쓸 수 있다고 생각하지만 실제로는 그것을 볼 수 없습니다.

$s=<>*100;@v=($s/25,$s%2.5,$s%25%10/5,$s%250%5);map{$l=int($_);print$l.$".qw(quarter dime nickel penny)[$i].$"if$l>0;$i++}@v

편집 : 4 문자를 저장하는 수학 트릭.


0

펄 6 , 96 바이트

$/=get;put map {$_=Int($//$^a);$/%=$a;"$_ $^b" if $_},<.25 quarter .1 dime .05 nickel .01 penny>
$/ = get; # set $/ to the input

# print the following list with spaces between
# and a newline at the end
put map {
  # the parameters to this block are $a, and $b
  # which are declared as placeholder parameters $^a, and $^b

  $_ = Int( $/ / $^a ); # set $_ to the count of the current coin

  $/ %= $a;             # set $/ to the modulus of itself and the current coin

  "$_ $^b" if $_        # return a string if $_, otherwise return Empty
},
<
  .25 quarter
  .1  dime
  .05 nickel
  .01 penny
>

용법:

for amount in  0.1  0.01  0.28  0.56  1.43; do
  echo $amount | perl6 -e'…';
done
1 dime
1 penny
1 quarter 3 penny
2 quarter 1 nickel 1 penny
5 quarter 1 dime 1 nickel 3 penny

0

파이썬 2, 167 바이트

업데이트 1 : Stole Sp3000의 아이디어는 input ()을 사용하고 코드를 함수 대신 스크립트로 만드는 것입니다.

a=input()*100;k={25:0,10:0,5:0,1:0}
for i in k:k[i]=a//i;a%=i
print' '.join(['%d %s'%(k[x],{25:'quarter',10:'dime',5:'nickel',1:'penny'}[x]) for x in k if k[x]])

0

C, 162 바이트

불행히도가 없으면 작동하지 않습니다 #include.

#include <stdlib.h>
i,a[]={25,10,5,1};main(c,v)char**v;{for(c=atof(v[1])/.01;c;c%=a[i++])c/a[i]?printf("%d %s ",c/a[i],"quarter\0dime\0   nickel\0 penny"+8*i):0;}

언 골프

#include <stdlib.h>

i,a[]={25,10,5,1}; /* loop index, coin values */

main(c,v) char**v;
{
    /* Get dollar amount from command line, convert to pennies */
    for (c=atof(v[1])/.01;c;c%=a[i++]) /* loop while still change... */
    {
        c/a[i] /* if there are coins at this index... */
            ? printf("%d %s ", c/a[i], "quarter\0dime\0   nickel\0 penny"+8*i) /* print out how many */
            : 0;
    }
}

0

루아 5.3 141 139 132 131 바이트

Sp3000의 Python 답변을 기반으로하지만 내 자신의 마술 공식을 사용합니다.

n=.5+100*io.read'n'a=25
for s in("quarter dime nickle penny "):gmatch".- "do
_=n<a or io.write(s,~~(n//a)," ")n=n%a
a=35%a|#s%2
end

편집- a수식을 개선했습니다 . 이전에는이었습니다 a=a*3%13~#s%4.

편집 2-이전에는 math.ceil정수로 반올림하고 변환하는 데 사용 했습니다. 이제 나는 //반올림하고 다시 추가하고 있습니다.~~ 하고 정수로 변환하기 위해 하고 있습니다.

편집 3-패턴을에서 "%w+ "로 변경하여 문자를 면도했습니다 ".- ".


0

K (oK) , 95 78 바이트

해결책:

{" "/,/`quarter`dime`nickel`penny{("";$y,x)y>0}'(-c,1)!'{y!x}\x,c:25 10 5}100*

온라인으로 사용해보십시오!

예:

{" "/,/`quarter`dime`nickel`penny{("";$y,x)y>0}'(-c,1)!'{y!x}\x,c:25 10 5}100*0.92
"3 quarter 1 dime 1 nickel 2 penny"
{" "/,/`quarter`dime`nickel`penny{("";$y,x)y>0}'(-c,1)!'{y!x}\x,c:25 10 5}100*0.95
"3 quarter 2 dime"

설명:

각 동전으로 입력을 모듈로 한 다음 결과로 동전을 나눕니다.

코인의 이름과 함께 각 결과를 함수에 공급하고 코인 수가 0이 아닌 경우 두 문자열 값을 반환합니다.

모든 것을 아래로 병합하고 공백과 함께 결합하십시오.


0

코 틀린 , 147 바이트

{listOf("quarter" to 25,"dime" to 10,"nickel" to 5,"penny" to 1).fold((it*100).toInt()){d,(n,a)->val z=d/a
if(z>0){print("$z $n ")
d-(z*a)}else d}}

미화

{
    listOf(
            "quarter" to 25,
            "dime" to 10,
            "nickel" to 5,
            "penny" to 1).fold((it * 100).toInt()) { d, (n, a) ->
        val z = d / a
        if (z > 0) {
            print("$z $n ")
            d - (z * a)
        } else d
    }
}

테스트

import java.io.ByteArrayOutputStream
import java.io.PrintStream

var f:(Double)->Unit =
{listOf("quarter" to 25,"dime" to 10,"nickel" to 5,"penny" to 1).fold((it*100).toInt()){d,(n,a)->val z=d/a
if(z>0){print("$z $n ")
d-(z*a)}else d}}

val TEST = listOf(
        0.1 to "1 dime",
        0.01 to "1 penny",
        0.28 to "1 quarter 3 penny",
        0.56 to "2 quarter 1 nickel 1 penny",
        1.43 to "5 quarter 1 dime 1 nickel 3 penny"
)

fun main(args: Array<String>) {
    val temp = ByteArrayOutputStream()
    System.setOut(PrintStream(temp))
    for ((input, output) in TEST) {
        temp.reset()
        f(input)
        println()
        val text = temp.toString().trim()
        if (text != output) {
            throw AssertionError("$input '$output' != '$text'")
        }
    }
}

TIO

TryItOnline

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.