정수는 시간이 지남에 따라 앞뒤로 이동


17

입력:

정수

산출:

  1. 먼저 정수를 동등한 로마 숫자로 변환하십시오.
  2. 그런 다음 로마 숫자의 각 대문자를 ASCII / UNICODE 10 진수 값으로 변환하십시오.
  3. 그리고 그 합을 출력하십시오.

예:

1991 -> MCMXCI -> 77+67+77+88+67+73 -> 449
^ input                                ^ output

로마 숫자 : 로마 숫자 변환기는 다음과 같습니다.
여기에 이미지 설명을 입력하십시오

도전 규칙 :

  • 표준 로마 숫자 규칙이 적용되므로 및 대신 IIII또는 .VIIIIIVIX
  • 1,000 개가 넘는 로마 숫자 위에있는 마크로 라인은 ¯(UNICODE nr. 175)입니다. 따라서 한 줄은로 계산 +175되고 두 줄은로 계산 됩니다 +350.
  • 정수를 나타내는 한 모든 종류의 입력 및 출력 유형을 사용할 수 있습니다.
  • 테스트 케이스의 범위는 1 - 2,147,483,647입니다.

* 로마 숫자 규칙 (Wikipedia에서 인용) :

숫자는 기호를 결합하고 값을 추가하여 형성되므로 II2 개 (2 개)이고 XIII13 개 (10 개 및 3 개)입니다. 각 숫자는 위치에 따라 10, 100 등의 배수를 나타내는 것이 아니라 고정 된 값을 가지기 때문에 207 또는 1066과 같은 숫자와 같이 0을 "자리 유지"할 필요가 없습니다. 이 숫자는 CCVII(이백, 다섯, 둘, 하나), MLXVI(천, 오십, 십, 오, 일)로 기록됩니다.

기호는 가장 큰 값부터 시작하여 값 순서대로 왼쪽에서 오른쪽으로 배치됩니다. 그러나 몇 가지 특정 경우에 4 개 문자가 연속적으로 반복되는 것을 피하기 위해 (예 : IIII또는 XXXX) 빼기 표기법이 종종 다음과 같이 사용됩니다.

  • I앞에 배치 V되거나 X1보다 작으므로 4는 IV(5보다 작음) 9는 IX(10보다 작음)
  • X앞에 배치 L되거나 C10보다 작음을 나타내므로 40은 XL(50보다 작음), 90은 XC(100보다 작음)
  • C앞에 위치 D또는 M사백은 그래서 덜 백을 나타냅니다 CD(A 백 채 5 백)와 구백이다 CM(a는 백 덜 천보다)
    예를 들어, MCMIV천구백넷 1904입니다 ( M, 천입니다 CM입니다 구백과 IV네).

로마 숫자를 현대적으로 사용하는 몇 가지 예는 다음과 같습니다.
1954 as MCMLIV; 1990 년 MCMXC; 소스로 2014MMXIV

일반 규칙:

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
    코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하지 마십시오. '모든'프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오.
  • 표준 규칙이 답변에 적용 되므로 STDIN / STDOUT, 적절한 매개 변수가있는 기능 / 방법, 전체 프로그램을 사용할 수 있습니다. 당신의 전화.
  • 기본 허점 은 금지되어 있습니다.
  • 가능하면 코드 테스트 링크를 추가하십시오.
  • 또한 필요한 경우 설명을 추가하십시오.

테스트 사례 :

100          ->   67
1            ->   73
4            ->   159
22           ->   322
5000         ->   261
2016         ->   401
1000000000   ->   427
1991         ->   449
9999         ->   800
1111111111   ->   2344
2147483647   ->   5362


1
@martin 9999-> M(X)CMXCIX-> 77+263+67+77+88+67+73+88-> 8002147483647-> ((MMCXLV)MMCDLXXX)MMMDCXLVII-> 427+427+417+438+426+436 + 252+252+242+243+251+263+263+263 + 77+77+77+68+67+88+76+86+73+73-> 5362. 그래서 두 번째를 수정했지만 9999맞습니다.
케빈 Cruijssen

1
테스트 사례 2222222222가 지정된 범위에 있지 않습니다. 또한 동의합니다 5362.
Neil

1
제목은 스택 오버플로 C 질문처럼 들립니다.
user6245072

3
제목에서 "fourth"라는 단어가 말장난입니까? 그렇지 않은 경우 "4"여야합니다.
Monty Harder

답변:


4

매쓰, 181 (173) 166 151 바이트

골프

(q=Select[ToCharacterCode@#,64<#<99&]&/@StringSplit[RomanNumeral[#],"_"];p=PadLeft;l=Length;Total[p[q,4]+p[{350,350*Mod[l@q,2],175,0}[[-l@q;;]],4],2])&

언 골프

(
q = Select[
     ToCharacterCode@#,
     64<#<99&
    ]&/@StringSplit[RomanNumeral@#,"_"];
p=PadLeft;
l=Length;
Total[
   p[q,4]+
   p[{350,350*Mod[l@q,2],175,0}[[-l@q;;]],4]
   ,2]
)&

Mathematica의 RomanNumeral구현은 9999에 (IX) CMXCIX를 제공하므로 프로그램은 해당 숫자에 대해 971을 리턴합니다.

작성된 것처럼 ((...)) (...) ... 유형의 로마 숫자는 길이가 4 인 로마 숫자 ((...))에 대한 ASCII 코드의 중첩 된 목록을 반환합니다. 길이 3의리스트를 리턴하고, (...) ...는 길이 2의리스트를 리턴하고 ...는 길이 1의리스트를 리턴합니다. 마지막 행은 해당 규칙을 list, 해당 매크로를 추가 한 다음 전체 중첩 목록을 합산하여 출력을 반환합니다.


1
PPCG에 오신 것을 환영합니다!
betseg

@betseg 감사합니다! 이것은 재미있는 첫 번째 문제였습니다.
HiggstonRainbird

10

파이썬 3, 281 278 273 269 바이트

codegolf에 대한 첫 번째 시도는 여기에 있습니다. 연결된 질문을 보지 않고 시도했지만 너무 끔찍할 것입니다 :)

def f(n):d=len(str(n))-1;l=10**d;return 0if n<1else(n<l*4and[73,88,67,77,263,242,252,438,417,427][d]+f(n-l))or(l<=n//9and[161,155,144,340,505,494,690,855,844][d]+f(n-9*l))or(n<l*5and[159,164,135,338,514,485,688,864,835][d]+f(n-4*l))or[86,76,68][d%3]+(d//3*175)+f(n-5*l)

Gábor Fekete 덕분에 8 바이트 작음

언 골프 드 :

def f(n):
d = len(str(n)) - 1 # number of digits minus one
l = 10 ** d         # largest power of 10 that is not larger than parameter
if n == 0:
    return 0
elif n < 4 * l: # starts with X, C, M, ...
    return [
        ord('I'),
        ord('X'),
        ord('C'),
        ord('M'),
        ord('X') + 175, 
        ord('C') + 175, 
        ord('M') + 175, 
        ord('X') + 350, 
        ord('C') + 350, 
        ord('M') + 350
    ][d] + f(n - l)
elif n // 9 * 10 >= 10 * l: # starts with IX, XC, ...
    return [
        ord('I') + ord('X'), 
        ord('X') + ord('C'), 
        ord('C') + ord('M'),
        ord('M') + ord('X') + 175,
        ord('X') + ord('C') + 350,
        ord('C') + ord('M') + 350,
        ord('M') + ord('X') + 525,
        ord('X') + ord('C') + 700,
        ord('C') + ord('M') + 700
    ][d] + f(n - 9*l)
elif n < 5 * l: # starts with IV, XL, CD, ... 
    return [
        ord('I') + ord('V'),
        ord('X') + ord('L'),
        ord('C') + ord('D'),
        ord('M') + ord('V') + 175,
        ord('X') + ord('L') + 350,
        ord('C') + ord('D') + 350,
        ord('M') + ord('V') + 525,
        ord('X') + ord('L') + 700,
        ord('C') + ord('D') + 700
    ][d] + f(n - 4 * l)
else: # starts with V, L, D, ...
    return [
        ord('V'), 
        ord('L'), 
        ord('D'),
        ord('V') + 175, 
        ord('L') + 175, 
        ord('D') + 175,
        ord('V') + 350, 
        ord('L') + 350, 
        ord('D') + 350
    ][d] + f(n - 5 * l)

할 수 있습니다 교체하여 일부 바이트 골프 return 0 if n==0 elsereturn 0if n<1else
가보 Fekete

f함수 이름이 인 경우 골프 버전에 호출 이 g있습니다.
Gábor Fekete

변경 n//9*10>=10*l하는 n//9>=l좀 더 저장합니다.
Gábor Fekete

기능 이름을 수정했습니다. 골프를 올바르게했는지 확인하고 다시 변경하는 것을 잊어 버렸습니다.
jDomantas


3

Mathematica, 198 바이트

Tr[Tr@Flatten[ToCharacterCode/@#]+Length@#*Tr@#2&@@#&/@Partition[Join[SplitBy[Select[Characters@#/."\&"->1,MemberQ[Join["A"~CharacterRange~"Z",{1}],#]&],LetterQ]/. 1->175,{{0}}],2]]&@RomanNumeral@#&

불행히도 내장 기능은 여기에별로 도움이되지 않지만 훨씬 더 골프를 칠 수 있다고 확신합니다.

참고 : 여기에9999 -> 971 따라 평가 합니다 .


2

배치, 373 바이트

@echo off
set/an=%1,t=0,p=1
call:l 73 159 86 161
call:l 88 164 76 155
call:l 67 135 68 144
call:l 77 338 261 340
call:l 263 514 251 505
call:l 242 485 243 494
call:l 252 688 436 690
call:l 438 864 426 855
call:l 417 835 418 844
call:l 427 0 0 0
echo %t%
exit/b
:l
set/ad=n/p%%10,p*=10,c=d+7^>^>4,d-=9*c,t+=%4*c,c=d+3^>^>3,d-=5*c,t+=%3*c+%2*(d^>^>2)+%1*(d^&3)

값 1, 4, 5 및 9에 대한 조회 테이블에 따라 숫자의 각 숫자를 변환하여 작동합니다 M(V). M(X), (M(V))및을 사용합니다 (M(X)). 원하는 경우 (IV), (IX), ((IV))그리고 ((IX))다음 사용 call:l 77 509 261 511하고 call:l 252 859 436 861각각.


1

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

f=(n,a=0)=>n<4e3?[256077,230544,128068,102535,25667,23195,12876,10404,2648,2465,1366,1183,329].map((e,i)=>(d=e>>8,c=n/d|0,n-=c*d,r+=c*(e%256+a*-~(i&1))),r=0)|r:f(n/1e3,a+175)+f(n%1e3)

참고 :뿐만 아니라 선호 (IV)M(V), 또한 선호 (VI)(V)M; 실제로 숫자의 맨 처음에 M 만 사용합니다.


1

파이썬, 263 바이트

def g(m):x=0;r=[73,86,88,76,67,68,77,261,263,251,242,243,252,436,438,426,417,418,427,0,0];return sum([b%5%4*r[i+(i*1)]+((b==9)*(r[i+(i*1)]+r[(i+1)*2]))+((b==4)*(r[i+(i*1)]+r[i+1+(i*1)]))+((b in [5,6,7,8])*r[i+1+(i*1)])for i,b in enumerate(map(int,str(m)[::-1]))])

PPCG에 오신 것을 환영합니다. 좋은 첫 답변입니다!
구리

1

R, 115 바이트

그래서 ... 질문이 꽤 흥미로워 서 솔루션을 게시하고 있습니다. 나는 내 최고의했던 R '패키지없이 로마 숫자를 다루는의 용량을 : 당신은 단지 입력 번호 사이의 수 13899는 AS, as.roman문서가 설명합니다.

나는 사이의 범위를 제공함으로써 조금 속임수 이유입니다 1에 에서 루프 : 그것의 아이폰에의 의 출력 ( ) . 실제로, 이 웹 사이트 에 따르면 , 가장 긴 로마 숫자는 (14 자)이며 이는에 해당합니다 .11 14foras.roman(3899)MMMDCCCXCIX
MMDCCCLXXXVIII2888

또한 length이 함수의 출력 결과를 계산할 수 없습니다 .

a=scan();v=0;for(i in 1:14){v=c(v,as.numeric(charToRaw(substring(as.character(as.roman(a)),1:14,1:14)[i])))};sum(v)

누구든지 위의 문제를 해결할 수있는 해결책을 찾으면 언제든지 의견을 말하십시오.


0

파이썬 3, 315 바이트

def p(n=int(input()),r=range):return sum([f*g for f,g in zip([abs(((n-4)%5)-1)]+[t for T in zip([((n+10**g)//(10**g*5))%2for g in r(10)],[(n%(10**g*5))//(10**g*4)+max((n%(10**g*5)%(10**g*4)+10**(g-1))//(10**g),0)for g in r(1,10)])for t in T],[73,86,88,76,67,68,77,261,263,251,242,243,252,436,438,426,417,418,427])])

언 골프 버전 :

def p(n=int(input()),r=range):
    return sum([f*g for f,g in zip(
        [abs(((n-4)%5)-1)]+
        [t for T in zip(
            [((n+10**g)//(10**g*5))%2for g in r(10)],
            [(n%(10**g*5))//(10**g*4)+max((n%(10**g*5)%(10**g*4)+10**(g-1))//(10**g),0)for g in r(1,10)]
        )for t in T],
        [73,86,88,76,67,68,77,261,263,251,242,243,252,436,438,426,417,418,427])])

설명 : 이 버전은 다른 접근 방식을 사용하며 숫자에서 로마 숫자의 발생 횟수를 계산합니다.

[abs(((n-4)%5)-1)]I로마 숫자 의 s 수입니다 .

[((n+10**g)//(10**g*5))%2for g in r(10)]숫자에서 V,L,D,(V),(L),(D),((V)),((L)),((D))s의 수입니다.

[(n%(10**g*5))//(10**g*4)+max((n%(10**g*5)%(10**g*4)+10**(g-1))//(10**g),0)for g in r(1,10)]숫자에서 X,C,M,(X),(C),(M),((X)),((C)),((M))s의 숫자입니다.

그런 다음 어커런스에 문자 값을 곱한 후 그 합계를 리턴합니다.

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