로마 숫자 라인 세그먼트


10

1.3999 범위의 정수를 입력으로 허용하고 해당 정수를 표준 로마 숫자로 표현하는 데 필요한 선분 수를 리턴하는 프로그램 또는 함수를 작성하십시오 (따라서 VM은 아닌 XL을 사용함). 예 :

   1 -> 1
   4 -> 3
   5 -> 2
   9 -> 3
  10 -> 2
  40 -> 4
  50 -> 2
  90 -> 3
 100 -> 1
 400 -> 3
 500 -> 2
 900 -> 5
1000 -> 4

로마 숫자 변환 기본 제공 허용되지만 위 목록에서 가장 큰 나머지 숫자를 반복적으로 빼서 문제없이 해결할 수 있습니다. 예 : 1234 = 4 + 1 + 1 + 2 + 2 + 2 + 3 = 15.

이것은 이므로 가장 짧은 프로그램이 승리합니다.


왜 4 개가 아닌 10 개의 2 개 선분입니까? X를 쓸 때 일반적으로 두 줄만 쓰지만 줄의 교차점이 네 개의 세그먼트로 만들어지지 않습니까?
Alex A.

@AlexA. 선분의 정의는 일반적으로 "두 점 사이의 최단 경로를 따르는 점 세트"와 같습니다. 이것을 기반으로 X를 잘라야 할 이유가없는 것 같습니다. 끝점을 두 세트 만 정의하면됩니다. (로마인들이 주로 유클리드 기하학에 글을 쓴다고 가정합니다)
FryAmTheEggman

@FryAmTheEggman 흠. 알아 주셔서 감사합니다.
Alex A.

답변:


2

Pyth, 92 76 70 바이트

KsMc."/9hæ²z³Þ§ªW×Oû[Tnè,O¤"\/WQ=Q-Q=Nef!>TQ%2K aY@KhxKN;sY

여기 사용해보십시오!

@FryAmTheEggman 덕분에 문자열 패킹 제안에 대해 바이트를 절약했습니다!

이 목록을 인코딩하는 수학적 방법이 있는지 여전히 궁금합니다. 무언가를 알아 내려고 노력할 것입니다.

설명

이것은 주어진 알고리즘을 사용합니다. K숫자와 해당하는 선분의 ​​수를 교대로 지정한 목록이 포함됩니다. 이 목록은 분할에 의해 디코딩 가져옵니다 포장 된 문자열로 구성됩니다 0/0/1/1/4/3/5/2/9/3/10/2/40/4/50/2/90/3/100/1/400/3/500/2/900/5/1000/4/와 정수로 각 요소를 매핑합니다.

KsMc. "..."\ / WQ = QQ = Nef!> TQ % 2K aY @ KhxKN; sY # Q = 입력

   c. "..."\ / # 문자열을 /
KsM # 모든 숫자를 int로 매핑하고 K에 할당
            WQ # 동안 Q! = 0
                     f % 2K #는 K의 두 번째 요소마다 만 취하고 T로 필터링합니다.
                      !> TQ # T <= Q
                  = Ne # 그 마지막 요소를 가져 와서 N에 할당
              = QQ # Q = Q-N
                                   K에서 N의 첫 번째 발생의 xKN # 인덱스
                                  h # 선분을 원하기 때문에 인덱스를 증가시킵니다
                              aA @ K # 해당 인덱스에서 라인 세그먼트를 가져 와서 Y에 추가
                                      ; sY # 루프를 끝내고 모든 선분의 합을 Y로 인쇄

3

C, 148129

d,x,n[]={1000,900,500,400,100,90,50,40,10,9,5,4,1,4,5,2,3,1,3,2,4,2,3,2,3,1};f(c){while(d+=(c/n[x])*n[x+13],c%=n[x++]);return d;}

내 첫 번째 코드 골프 : ^). 질문에 함수를 사용할 수 있다고 말했기 때문에 main을 함수로 변경하여 일부 문자를 자릅니다 (가장 중요한 것은 c를 scanf 대신 scanf로 전달)

포장을 풀다

d,x,n[]={1000,900,500,400,100,90,50,40,10,9,5,4,1,4,5,2,3,1,3,2,4,2,3,2,3,1};
f(c){
  while(d+=(c/n[x])*n[x+13],
        c%=n[x++]);
  return d;
}

2

Mathematica, 80 72 바이트

Tr[Characters[#~IntegerString~"Roman"]/.{"I"|"C"->1,"M"->4,_String->2}]&

숫자를 로마 숫자로 변환하고 각 문자를 세그먼트 수로 바꾸고 총계를 취하는 익명 함수.


2

레티 나, 128 바이트

. +
$ *
1 {1000}
티'
1 {900}
td
1 {500}
디
1 {400}
티
1 {100}
'
1 {90}
티
1 {50}
디
1 {40}
티'
1 {10}
디
1 {9}
티
1 {5}
디
1 {4}
티
1
'
티
디'
디
''
'+
$ .0

교체 할 것이 없을 때까지 간단하게 교체하십시오. 그런 다음 아포스트로피가 계산되고 이것이 우리의 선 세그먼트 수입니다.

단항으로 입력 및 출력이 허용되는 경우 115 바이트입니다 (누가 1234를 입력하겠습니까?).

온라인으로 사용해보십시오!
온라인으로 사용해보십시오! (단항 IO)


2

파이썬 3, 95 바이트

def f(a,b=0):
 for e in'᝴ᔝ஺ॣəȟĮô>9 ':e=ord(e);d=e//6;b+=a//d*(e%6);a%=d
 return b

유니 코드 문자열은 코드 포인트로 구성됩니다.

6004 5405 3002 2403 601 543 302 244 62 57 32 27 7

해당 문자열을 바이트 리터럴로 e=ord(e);
바꾸면

나는 그것이 내 경우에는 효과가 없다고 생각합니다. 나는 유니 코드 문자열이 필요 :( 즉, 내가하지 바이트 이상, 그 문자열의 코드 포인트를 통해 반복하고 있습니다.

1
아, 알겠습니다 문자열의 16 진 덤프를 제공 하시겠습니까? 전화기에 제대로 표시되지 않습니다.
xsot

1

자바, 152 바이트

왜냐하면, 나중에 알기 때문입니다.

n->{int c=0;int[]r={999,4,899,5,499,2,399,3,99,1,89,3,49,2,39,4,9,2,8,3,4,2,3,3,0,1};for(int i=0;i<26;i+=2)while(n>r[i]){n-=r[i]+1;c+=r[i+1];}return c;}

주어진 알고리즘의 간단한 리터럴 구현. 배열은 변환 정보를 압축합니다. 짝수 색인은 로마 숫자보다 하나가 작고 홀수 색인은 해당 숫자의 수입니다.

이것은 int/ 를 가져 와서 반환하는 람다입니다 Integer. 여기에는 IntUnaryOperatorUnaryOperator<Integer>.


1

자바 스크립트 (ES6), 79 바이트

n=>"0123323453"[[,a,b,c,d]=1e4+n+'',d]-(-"0246424683"[c]-"0123323455"[b])+a*4

문자열은 단위, 수십 및 수백 자릿수의 선 세그먼트 수를 나타냅니다. (수천은 단순히 수천 자릿수의 네 배입니다.)이 방법은 질문에서 제안한 알고리즘과 같은 다른 옵션보다 짧은 것 같습니다.

편집 : @ user81655 덕분에 2 바이트가 절약되었습니다.


이것은 멋진 알고리즘입니다. 캐스트를 정리하는 2 바이트를 절약 할 수 있습니다뿐만 아니라 :n=>"0123323453"[[,a,b,c,d]=1e4+n+'',d]-(-"0246424683"[c]-"0123323455"[b])+a*4
user81655

@ user81655 오, 좋습니다. 간단히 +s를 -s로 변경 하면 Leading을 제거 할 수 +있지만 그룹화는 다른 바이트를 저장합니다.
Neil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.