펄 69 바이트
s;.;y/XVI60-9/CLXVIX/dfor$a[$_].="32e$&"%72726;gefor 1..100;print"@a"
마법의 공식으로 작동합니다. 이 식은 "32e$&"%72726
각 숫자를 다음과 같은 방식으로 변환합니다 :
0⇒32, 1⇒320, 2⇒3200, 3⇒32000, 4⇒29096, 5⇒56, 6⇒560, 7⇒5600, 8⇒56000, 9⇒50918
번역을 적용한 후 y/016/IXV/
대신
0⇒32, 1⇒32 I , 2⇒32 II , 3⇒32 III , 4⇒29 I 9 V , 5⇒5 V , 6⇒5 VI , 7⇒5 VII , 8⇒5 VIII , 9⇒5 I 9 X 8
나머지 숫자 ( 2-57-9
)는 제거됩니다. 이러한 변환 공식을 사용하여 1 바이트 개선 될 수 있습니다 012
대신 016
간소화 /XVI60-9/
에이 /XVI0-9/
. 하나를 찾지 못했지만 운이 좋을 것입니다.
한자리 이와 같이 형질 전환 된 후, 처리 결과를 추가하고, 변환 이전의 다음 자리에 대해 반복 XVI
을들 CLX
새 자리에 대한 변환이 발생하는 동시에.
최신 정보
철저한 검색 더 짧은 것이 발견되지 않았습니다. 그러나 대안적인 69 바이트 솔루션을 찾았습니다.
s;.;y/XVI0-9/CLXIXV/dfor$a[$_].="57e$&"%474976;gefor 1..100;print"@a"
이것은 하나를 사용 0-2
대체물을IXV
하지만 한 자리 더 긴 모듈로를 가지고 있습니다.
업데이트 : 66 65 바이트
이 버전은 눈에 띄게 다르므로 아마도 그것에 대해 몇 마디 말해야 할 것입니다. 그것이 사용하는 공식은 실제로 1 바이트 더 길다!
공식을 더 이상 단축시킬 수 없어서 내가 가진 것을 골라 내려고 결심했습니다. 오래 된 친구를 기억할 때까지 오래지 않았다 $\
. 때 print
한 Statment 발행, $\
자동 출력의 끝에 추가된다. $a[$_]
2 바이트 개선을 위해 어색한 구성을 제거 할 수있었습니다 .
s;.;y/XVI60-9/CLXVIX/dfor$\.="32e$&"%72726;ge,$\=!print$"for 1..100
훨씬 낫지 만 $\=!print$"
여전히 조금 장황하게 보였습니다. 그런 다음 3
숫자 변환에 숫자 가 포함되어 있지 않은 동일한 길이의 수식을 기억했습니다 . 따라서 $\=2+print
대신 사용 하고 결과 3
를 공백으로 대체 할 수 있어야합니다 .
s;.;y/XVI0-9/CLXIIX V/dfor$\.="8e$&"%61535;ge,$\=2+print for 1..100
print
와 사이에 필요한 공백으로 인해 67 바이트도 사용 for
됩니다.
편집 : 이것은 print
앞쪽 으로 이동하여 1 바이트 씩 향상시킬 수 있습니다 .
$\=2+print!s;.;y/XVI0-9/CLXIIX V/dfor$\.="8e$&"%61535;gefor 1..100
을 대체하기 전에 치환을 완전히 평가해야 print
하므로$\
은 계속 마지막에 수행됩니다. ge
와 사이의 공백 제거for
더 이상 사용되지 경고를하지만, 그렇지 않으면 유효합니다.
그러나 사용하지 않은 수식이 있다면 1
어디에서나$\=2+print
가됩니다 $\=print
절감의 또 다른 두 바이트의 가치에 대해. 1 바이트 더 길어도 여전히 개선 될 것입니다.
결과적으로, 그러한 공식은 존재하지만 원래보다 1 바이트 더 길어서 최종 점수는 65 바이트입니다. .
$\=print!s;.;y/XVI60-9/CLXXI V/dfor$\.="37e$&"%97366;gefor 1..100
방법론
문제는 그러한 공식을 찾는 방법에 대한 질문이었습니다. 일반적으로, 데이터 세트를 일반화 할 마법 공식을 찾는 것은 가능성의 문제입니다. 즉, 원하는 결과와 비슷한 것을 생성 할 수있는 양식을 선택하려고합니다.
처음 몇 개의 로마 숫자를 검사합니다.
0:
1: I
2: II
3: III
4: IV
5: V
6: VI
7: VII
8: VIII
9: IX
볼 규칙이 있습니다. 구체적으로, 0-3 에서 다시 5-8에서 , 각각의 연속적인 용어의 길이는 1 씩 증가한다. 우리가 숫자 자리에서 맵핑을 작성하고자한다면, 우리는 표현해야 할 것이다 또한 각각의 연속적인 용어에 대해 하나 개의 숫자로 길이가 증가합니다. 논리적 선택은 k • 10 d입니다. 여기서 d 는 해당 숫자이고 k 는 정수 상수입니다.
이것은 0-3 작동 하지만 4 는 패턴을 깰 필요가 있습니다. 여기서 수행 할 수있는 것은 모듈로에 대한 압정입니다.
k • 10 d % m , 여기서 m 은 k • 10 3 과 k • 10 4 사이 입니다. 이것은 0-3 의 범위를 그대로 유지하고 4를 포함하지 않도록 4를 수정 합니다 I
. 검색 알고리즘을 5 의 모듈 형 잔차가 j 라고 부르고 m / 1000 보다 작 도록 검색 알고리즘을 추가로 제한하면 5-8의 규칙 성도 보장 됩니다. 결과는 다음과 같습니다.
0: k
1: k0
2: k00
3: k000
4: ????
5: j
6: j0
7: j00
8: j000
9: ????
당신이 볼 수 있듯이, 우리가 바꿀 경우 0
에 I
, 0-3 와 5-8은 모든 올바르게 매핑이 보장된다! 4 와 9 의 값은 무차별 적이어야합니다. 구체적으로, 4 는 1 0
과 1 j
을 순서대로 포함해야 하고 9 는 1을 포함해야합니다0
그 뒤에 다른 곳에 나타나지 않는 다른 숫자가 있어야합니다. 확실히, 우연의 충돌로 인해 원하는 결과를 얻을 수있는 다른 많은 공식이 있습니다. 그들 중 일부는 더 짧을 수도 있습니다. 그러나 나는 이것만큼 성공할만한 것이 없다고 생각합니다.
또한 여러 번의 교체 I
및 / 또는 V
일부 성공 을 실험했습니다 . 그러나 아아, 내가 이미 가지고 있었던 것보다 짧은 것은 없습니다. 여기 내가 찾은 가장 짧은 솔루션 목록이 있습니다 (1-2 바이트 더 무거운 솔루션의 수가 너무 많아서 나열 할 수 없음).
y/XVI60-9/CLXVIX/dfor$\.="32e$&"%72726
y/XVI0-9/CLXIXV/dfor$\.="57e$&"%474976
y/XVI0-9/CLXIVXI/dfor$\.="49e$&"%87971
y/XVI0-9/CLXIIXIV/dfor$\.="7e$&"%10606 #
y/XVI0-9/CLXIIXIV/dfor$\.="7e$&"%15909 # These are all essentially the same
y/XVI0-9/CLXIIXIV/dfor$\.="7e$&"%31818 #
y/XVI0-9/CLXIIX V/dfor$\.="8e$&"%61535 # Doesn't contain 3 anywhere
y/XVI60-9/CLXXI V/dfor$\.="37e$&"%97366 # Doesn't contain 1 anywhere