Modular SNUSP에서 숫자의 가장 짧은 표현을 찾으십시오


10

배경

많은 난해한 프로그래밍 언어에는 리터럴에 숫자가 내장되어 있지 않으므로 런타임에 계산해야합니다. 이러한 많은 경우에 숫자 표현은 매우 흥미로울 수 있습니다. 우리는 이미 Underload의 숫자를 나타내는 데 어려움 을 겪었습니다. 이 과제는 모듈 식 SNUSP 에서 숫자를 나타내는 입니다. (이 도전을 완료하기 위해 SNUSP를 배울 필요는 없습니다. 필요한 모든 정보는 사양에 있습니다. 그러나 배경은 흥미로울 수 있습니다.)

작업

이 과제의 목적을 위해, 모듈 형 SNUSP 번호는 문자로 밖으로 형성되는 문자열 @, +그리고 =마지막 문자는 것을 제외하고는 #끝에서 두 번째 문자가 있어야합니다, 그리고 +=(그것은있을 수 없습니다 @). 예를 들어, 유효 숫자는 포함 @+#, ==#@@+@=#; 유효 숫자의 예는 +=, @@#하고 +?+#.

모듈 식 SNUSP 번호의 값은 다음과 같이 재귀 적으로 계산됩니다.

  • # 값이 0입니다 (기본 사례).
  • 숫자가 =x임의의 문자열 형식 인 x경우 해당 값은 값과 같습니다 x.
  • 숫자의 형식 +x이 임의의 문자열 x인 경우 값은 x에 1을 더한 값과 같습니다 .
  • 숫자가 @cx단일 문자 c및 문자열에 대해 형식을 갖는 경우 x해당 값은 값에 x+를 더한 값과 같습니다 cx.

이 문제를 해결하려면 음수가 아닌 정수를 입력으로 사용하고 입력과 같은 값을 갖는 가능한 가장 짧은 모듈 식 SNUSP 번호 인 문자열을 출력하는 프로그램을 작성해야합니다.

설명

  • 동일한 값을 가진 하나 이상의 문자열이있을 수 있으며, 특히 일부 정수의 경우 해당 값을 가진 가장 짧은 모듈 식 SNUSP 번호에 대한 연결이 있습니다. 이 경우 넥타이와 관련된 숫자를 출력 할 수 있습니다.
  • 숫자를 찾는 데 사용하는 알고리즘에는 제한이 없습니다. 예를 들어, 무차별 강제 문자열과 평가는 합법적 인 방법이지만 검색 공간을 줄이기 위해보다 영리한 작업을 수행하고 있습니다.
  • PPCG에서 평소와 같이 제출물은 전체 프로그램 또는 기능 일 수 있습니다 (언어 중 더 간결한 것을 선택하십시오).
  • 이것은 입력 및 출력 형식을 처리하는 데 문제가되지 않으므로 합리적인 방법을 사용하여 음이 아닌 정수를 입력하고 문자열을 출력 할 수 있습니다. 거기에 메타에서 전체 가이드는 하지만, 가장 일반적으로 사용되는 합법적 인 방법은 함수 인수 / 반환 명령 행 인수, 표준 입력 / 표준 출력을 포함한다.

테스트 사례

처음 몇 숫자의 가장 짧은 표현은 다음과 같습니다.

  • 0 :#
  • 1 :+#
  • 2 :++#
  • 3 : +++#또는@++#
  • 4 : ++++#또는 +@++#또는@=++#
  • 5 : @+++#또는@@++#
  • 6 : +@+++#또는 +@@++#또는 @=+++#또는 @=@++#또는@@=++#
  • 7 : @++++#또는@+@++#
  • 8 : @@+++#또는@@@++#
  • 9 : +@@+++#+@@@++#@+++++#@++@++#@+@=++#@@=+++#@@=@++#
  • 10 : @=@+++#@=@@++#또는 @@@=++#( 이 확인하는 매우 중요한 테스트 케이스입니다 가능한 모든 답변을 포함로 =)
  • 11 : @+@+++#또는 @+@@++#또는 @@++++#또는@@+@++#
  • 12 : +@+@+++#+@+@@++#+@@++++#+@@+@++#@=+@+++#@=+@@++#@=@=+++#@=@=@++#@=@@=++#@@=++++#@@=+@++#@@=@=++#
  • 13 : @@@+++#또는@@@@++#
  • 14 : +@@@+++#+@@@@++#@=@++++#@=@+@++#@@+++++#@@++@++#@@+@=++#
  • 15 : @+@++++#@+@+@++#@@=@+++#@@=@@++#@@@=+++#@@@=@++#

큰 테스트 케이스로서, 입력에서 출력 (40)이 있어야한다 @@@=@@+++#, @@@=@@@++#, @@@@=@+++#, 또는 @@@@=@@++#.

승리 조건

A와 도전, 승자는 바이트 단위로 측정 짧은 항목이다.


1
=최적으로 만 발생 @=합니까?
orlp

3
그건 그렇고, 이러한 종류의 도전은 일반적으로 metagolf로 게시하는 것이 가장 좋습니다. 왜냐하면 흥미로운 답변이 거의 없기 때문입니다 (문자열을 평가하고 가능한 모든 문자열을 반복하십시오).
orlp

3
@orlp : 동의하지 않습니다. 최적의 답을 찾는 것이 비교적 쉽고 metagolf는 점수에 다른 제한을 두지 않기 때문에 metagolf만큼 쉽지 않습니다. 나는 여기서 대부분의 대답이 무차별 적이라고 기대하지만, 사양은 무차별 a)가 가장 짧지 않을 수 있고 b) 그 자체로 골프에 흥미가있을 정도로 복잡합니다. 승리 조건의 변화를 원한다면 다른 유일한 도전 은 아마도 가장 빠른 코드 일 것입니다.

우리는 또한 Brain-flak에 대한 수많은 골프 도전을 겪었습니다
ASCII 전용

답변:


3

Oracle SQL 11.2, 341 262 바이트

WITH e AS(SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4),n(s,v,p,c,i)AS(SELECT'#',0,0,e,1 FROM e UNION ALL SELECT c||s,DECODE(c,'+',1,'@',p,0)+v,v,e,i+1 FROM n,e WHERE i<11)CYCLE s SET y TO 1 DEFAULT 0 SELECT s FROM n WHERE:1=v AND rownum=1;

구 버전

WITH e AS(SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4),n(s,v,p,c) AS(SELECT'#',0,0,e FROM e UNION ALL SELECT s||c,CASE c WHEN'+'THEN 1 WHEN'='THEN 0 WHEN'@'THEN p ELSE 0 END+v,v,e FROM n,e WHERE LENGTH(s)<10)CYCLE s SET y TO 1 DEFAULT 0 SELECT MIN(REVERSE(s))KEEP(DENSE_RANK FIRST ORDER BY LENGTH(s))FROM n WHERE v=:1;

: 1 모듈 식 SNUSP에 표시 할 숫자

언 골프 :

WITH e AS (SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4),  
n(s,v,p,c,i) AS                   
(
  SELECT '#',0,0,e,1 FROM e
  UNION ALL
  SELECT s||c
       , DECODE(c,'+',1,'@',p,0)+v 
       , v
       , e
       , i+1
  FROM n,e
  WHERE i<11
) CYCLE s SET y TO 1 DEFAULT 0
SELECT s FROM n WHERE:1=v AND rownum=1;

먼저 숫자를 나타내는 데 사용되는 각 기호 당 하나씩, 줄의 끝에서만 사용되는 #을 뺀 3 개의 선으로 된 뷰를 만듭니다.

SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4;    

그런 다음 재귀 뷰 n은 3 개의 기호로 가능한 모든 문자열을 생성하고 #에 연결하여 평가합니다.

매개 변수는 다음과 같습니다.

s : 평가중인 숫자의 모듈 식 SNUSP 표현
v : 이전 반복으로 계산 된 s의 10 진수 값
p : v i-2 반복으로 계산 된
c : s에 연결되는 다음 기호
i : s 의 길이 만 골프 목적으로 두 개의 LENGTH ()를 제거해야했습니다.

DECODE(c,'+',1,'@',p,0)+v 

마지막 기호가 +이면 1을
더합니다. @이면 i-2 반복의 값을 더합니다.
그렇지 않으면 기호는 # 또는 =입니다. 재귀 뷰의 초기 부분에서 v는 0으로 초기화되므로 새 v는 두 경우 모두 이전 v와 같습니다.

WHERE i<11

3 개의 기호로 가능한 모든 문자열이 계산되므로이 부분은 요청이 크런치 될 때까지 실행되지 않도록합니다.

CYCLE s SET y TO 1 DEFAULT 0

현의 구성에 대한 규칙이 없기 때문에, 복제가 발생해야한다. 재귀 적 관점에서 오라클은 이러한 중복을 주기로 해석하고 사례를 명시 적으로 처리하지 않으면 오류를 발생시킵니다.

SELECT s FROM n WHERE:1=v AND rownum=1;

매개 변수로 입력 한 10 진수로 평가되는 첫 번째 모듈 식 SNUSP 표현을 리턴합니다.

내 테스트에서 첫 번째 줄은 항상 가장 짧은 표현 중 하나입니다.

데이터베이스가 같은 방식으로 작동하지 않는 경우 마지막 절을

SELECT MIN(s)KEEP(DENSE_RANK FIRST ORDER BY i)FROM n WHERE:1=v

2

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

n=>eval("for(a=[['#',0,0]];[[s,t,p],...a]=a,t-n;)a.push(['='+s,t,t],['+'+s,t+1,t],['@'+s,t+p,t]);s")

간단한 무차별 폭 우선 검색 알고리즘.


40의 경우 "@@@@@@@ = ​​++ #"을 반환합니다.이 값은 42로 평가됩니다
SE는 EVIL이기 때문에 aditsu quit

12 일조차도 "
@@

흠, 나는 변화 t<n가 효과 t-n가 있다고 생각 합니다 ...
Neil

2

Pyth, 41 바이트

L?b+ytb@[yttb001)Chb0+hfqQyTs^L"+@="UhQ\#

테스트 스위트

작동 방식 :

두 부분이 있습니다. 후행없이 SNUSP 표현식의 값 #과 무차별 대입 루틴 을 계산하는 재귀 함수입니다 .

평가 :

L?b+ytb@[yttb001)Chb0
L                        Define the function y(b) as follows
 ?b                      If b is nonempty
   +ytb                  The sum of y(tail(b)) and   # tail(b) = b[1:]
   @[       )            The element in the list at location
   Chb                   Character values of the first character.
                         Modular indexing means that 
                         + -> 3
                         @ -> 0
                         = -> 1
                         Index 2 is filler.
    [yttb001)            @ adds y(tail(tail(b)). Tail suppresses the error when
                         called on an empty list, so this treats @# as zero, but
                         this can't lead to problems because removing the @ will
                         always make the expression shorter.
                         + adds 1, = adds 0.
 0                       If b is the empty string, return 0

무차별 대입 :

+hfqQyTs^L"+@="UhQ\#
               UhQ      0 ... Q     # Q is the input
        ^L"+@="         Map that list to all strings formed from the characters
                        "+@=", with that many characters.
       s                Concatenate
  fqQyT                 Filter for strings which evaluate to the input
 h                      Take the first success, which is the shortest due to
                        the order the strings were generated.
+                 \#    Add a '#' and output


1

하스켈 , 89 86 바이트

편집하다:

  • -3 바이트 : 압축이 색인 작성보다 짧았습니다.

Neil의 답변에서 많은 영감을 얻은 또 다른 무차별 대입 솔루션. (골프를 소개하기 전에 isaacg의 Pyth와 비슷하게 작동했지만 l.)

f n=[s|(a,_,s)<-l,a==n]!!0
l=(0,0,"#"):[(a+c,a,d:s)|(a,b,s)<-l,(c,d)<-zip[0,1,b]"=+@"]

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

  • f 정수를 사용하고 문자열을 반환하는 주 함수입니다.
  • l는 튜플의 무한한 목록으로 (a,b,s), 가장 짧은 표현부터 s먼저 그 값 ab첫 번째 문자가 제거 된 표현 의 값 과 함께 표시됩니다. (다른 사람들이 지적했거나 주목 한 것처럼 후자를 0으로 취급하는 것은 무해합니다 #.)
  • l첫 번째 요소 이외 의 요소 는 목록 이해를 통해 재귀 적으로 생성됩니다. 목록에서 새 표현을 생성 d하기 s위해 앞에 추가 할 문자 이며 'c'는에 해당하는 증분 a입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.