엄마를 봐! 나는 내 자신의 (Base 10) 숫자 체계를 만들었다! [닫은]


21

우리는 모두 잘 해냈지만 어쩌면 자신의 외계 언어와 번호 시스템을 만드는 것은 특히 판타지 작문의 필수 요소이지만 대부분 재미있는 활동입니다.

작업은 간단합니다. 두 가지 입력을받습니다.

  1. 10 개의 고유 한 '숫자'(인쇄 가능한 ASCII 문자)의 순서가있는 목록 입력은 순서대로 값을 0, 1, 2, 3, ..., 9로 해석합니다.

    + 숫자가 될 수있는 예외가 있습니다. 산술 연산자 (+,-, *, /), 괄호 및 공백은 숫자 중 하나로 사용할 수 없습니다.

  2. '숫자'만 사용하는 산술 문제

주어진 형식으로 동등한 정수 결과를 출력하십시오.

예를 들면 다음과 같습니다.

INPUT

abcdefghij

bcd + efg + hij
OUTPUT

bdgi

예에서, 'abcdefghij'의 입력 목록 (목록이 어떤 형식으로 제공되는지 선택할 수 있음)은 'hjkloiwdfp'가 '0123456789'와 1 대 1에 해당하는 것처럼 '0123456789'에 해당합니다. 제로, 'h'않습니다. 다음의 산술은 123 + 456 + 789로 변환되며 1368과 같습니다. 그런 다음 우리가 준 형식으로 출력해야합니다. 따라서 b (1을 나타냄) d (2를 나타냅니다) g (6) 및 i ( 8).

테스트 사례

abcdefghij
abc + def - ghij

-gedc
qwertyuiop
qwerty / uiop

e
%y83l;[=9|
(83l * 9) + 8%

y9|8

더 많은 규칙

  • 표준 허점 은 금지되어 있습니다!
  • 이것은 코드 골프이므로 바이트 단위의 최단 답변이 이깁니다.
  • 가장 적합한 형식으로 입력 및 출력을 취하는 전체 프로그램 또는 기능이어야합니다. (입력에 additioal 정보를 추가 할 수 없으며 '숫자'와 표현식 만 추가하면됩니다.
  • 원하는 언어를 사용하십시오 (다른 규칙을 준수하는 한)

9
두 번째 테스트 사례는 최종 출력이 반올림됨을 나타내며, 그렇지 않으면 결과는입니다 q.ioiopewioyetqorw.... 그렇다면 어떤 종류의 반올림을 적용해야합니까?
Arnauld

2
@ SriotchilismO'Zaic의 요점에 추가하기 위해, 우리는 또한 당신의 이익과 우리의 이익을위한 샌드 박스 를 가지고 있습니다 ; 이는 커뮤니티가 도전을 게시하기 전에 세분화하는 데 도움을주는 것입니다. 그래도 도전에 대한 좋은 아이디어!
주세페

3
다른 언어는 같은 방정식을 다르게 평가할 가능성이 있지만 그 주위에 어떤 방법이 있는지 잘 모르겠습니다. 예를 들어 T-SQL은 정수 나누기 (반올림 하지 않음 )로 인해 not을 반환 1합니다 . 이것은 도전을 무효화하지 않지만 동일한 테스트 사례에 대해 다른 허용 가능한 답변을 허용해야 할 수도 있습니다 (아래의 T-SQL 답변 참조). 5/32
BradC

2
@ 주세페 와우, 나는이 스택을 오랫동안 탐색했지만 그것을 알지 못했습니다! 특히 내가 처음으로 포스터 (장수)로 도움이되었을 것입니다. 다음에 참고할 것입니다! 귀하의 의견과 답변에 감사드립니다.
Bill W

2
이것에 대한 흥미로운 변형은 입력에서 첫 번째 문자열의 길이에 따라 모든 숫자 기반을 지원하는 것입니다.
Darrel Hoffman

답변:


11

05AB1E , 10 9 바이트

žh‡.Eò¹Åв

(이제) 문자 목록으로 출력합니다.

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

          # Transliterate the second (implicit) input, replacing every character of 
           # the first (implicit) input with:
žh         # The builtin "0123456789"
   .E      # Then evaluate it as Elixir code
     ò     # Round it to the nearest integer
      ¹Åв  # And change it back by using a custom base-conversion with the first input as
           # base (which results in a character list)
           # (after which that result is output implicitly)

05AB1E의 새 버전은 빌드가 Elixir 입니다. .E함수를 호출 할 것이다 call_unary(fn x -> {result, _} = Code.eval_string(to_string(x)); result end, a)(가) 어디, Code.eval_string엘릭서의 내장입니다 .

레거시 버전의 05AB1E는 Python으로 빌드되었으므로 작동하지 않습니다. 앞에 0이있는 숫자는 평가되지 않습니다
. 레거시 버전 ( Åв내장 된 새 항목 이므로 10 바이트 버전을 사용)의 모든 테스트 사례를 참조하십시오 .


8

R , 58 바이트

function(d,s,`[`=chartr)'0-9'[d,eval(parse(t=d['0-9',s]))]

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

문자 변환 chartr을 사용 하여 숫자, parses 및 evals 를 교환 한 다음 chartr원래 숫자로 되돌립니다.

가장 가까운 정수로 반올림해야하는 경우

R , 65 바이트

function(d,s,`[`=chartr)'0-9'[d,round(eval(parse(t=d['0-9',s])))]

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


사용하여 [3 개 개의 매개 변수와 함수에 대한 짧은 이름으로 매우 똑똑하다. 잘 했어.
로빈 라이더

6

T-SQL, 117 바이트

DECLARE @ CHAR(99)
SELECT @='SELECT TRANSLATE('+TRANSLATE(e,c,'0123456789')+',''0123456789'','''+c+''')'FROM t
EXEC(@)

줄 바꿈은 읽기 쉬운 것입니다.

입력은 IO 규칙에 따라 텍스트 열 c (문자) 및 e (방정식)가있는 기존 테이블 t 를 통해 이루어 집니다.

SQL 2017 함수 TRANSLATE를 사용하여 문자를 전환하고 방정식뿐만 아니라 원래 문자로 다시 변환하는 코드를 포함하는 문자열을 생성합니다.

SELECT TRANSLATE(123 + 456 + 789,'0123456789','abcdefghij') 

그런 다음이 문자열을 사용하여 평가 EXEC()합니다.

'이 코드를 깨뜨리는 문자 (예 : 작은 따옴표 )가있을 수 있습니다. 가능한 모든 ASCII 문자를 테스트하지 않았습니다.

도전 과제에 따라, 나는 언어가 해당 연산자를 어떻게 해석하는지에 따라 주어진 표현을 평가하고 있습니다. 따라서 두 번째 테스트 사례는 정수 나누기로 인해 w2 ( e)가 아닌 1 ( )을 반환합니다 .


4

펄 6 , 38 바이트

{*.trans($_=>^10).EVAL.trans(^10=>$_)}

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

반올림이 어떻게 작동하는지 잘 모르겠습니다. 이 말에 반올림하면 그때 추가 할 수 있습니다 .round에 대한 6 바이트 . 동작 /이 달라야하면 더 길어질 수 있습니다. 같은 카레 입력을 f(arithmetic)(numerals)(arithmetic)받습니다.

설명:

{                                    }  # Anonymous codeblock
 *                                      # Returning a whatever lambda
  .trans($_=>^10)       # That translates the numerals to digits
                 .EVAL  # Evaluates the result as code
                      .trans(^10=>$_)   # And translates it back again

3

Stax , 74 66 65 바이트

┼ö8Q#xóπcM~oÖ÷╦├mî☼yº─▐4ç≥e╘o▄ê‼ø_k╜ø8%N╫ ╗e<.╗P[─╛èA±!xêj«w╠°{B♪

실행 및 디버깅

Stax는 진정한 "eval"명령이 없어서 여기서 잘하지 않습니다. 문서에는 "eval"이라는 것이 있지만 전체 표현식이 아닌 리터럴 값에서만 작동합니다.


이것은 연산자의 정확성에 따르지 않을 수 있습니다. 그래도 필요한지 확실하지 않습니까? staxlang.xyz/…
다나

@ dana : 좋은 지적입니다. 나는 그것을 고려하지 않았다. 수정에는 약간의 바이트가 소요될 수 있으므로 해당 동작을 변경하기 전에 설명을 기다릴 것입니다.
재귀

3

배쉬, 97 바이트

IFS=''
read S
read O
A=`echo "$O"|tr "$S" 0-9`
printf %0.f `bc<<<"(${A[@]##0})+0.5"`|tr 0-9 "$S"

우리가 둥글기보다는 잘릴 수 있다면 더 적을 수 있습니다. 또한 Bash는 0으로 시작하는 숫자를 8 진수로 해석하기 때문에 선행 0을 처리하기 까다 롭습니다 (테스트 사례 # 2에서와 같이).


골프에 "bc"와 "tr"과 같은 유틸리티를 사용하는 것에 대한 합의는 무엇입니까?
0:08에

1
나는 전문가는 아니지만 이러한 유형의 답변은 일반적으로 "bash + coreutils"와 같은 형식으로 제출된다고 생각합니다.
Giuseppe

@Giuseppe tr는 coreutils의 일부 bc이지만 그렇지는 않습니다. 그럼에도 불구하고 bc매우 일반적인 도구입니다. 이 답변의 다른 모든 명령은 bash입니다.
rexkogitans

-7 '0-9'로 '0123456789'을 감소 CM의 대답 @에서 도난 바이트
spuck

T를 정의하는 것은 더 이상 유리하지 않습니다. $T보다 1 바이트 만 짧아 0-9두 번만 사용하며 8 바이트를 사용하여 정의합니다.
ruds

2

, 94 90 바이트

육각 덤프

00000000: 53d0 80d6 d800 d3d0 80a0 1f20 8047 53a0  SÐ.ÖØ.ÓÐ. . .GS 
00000010: 1753 d080 d3d0 80a0 5e20 800a a181 8100  .SÐ.ÓÐ. ^ ..¡...
00000020: 40a0 5f52 cac3 4da0 6580 53d0 80a0 5d20  @ _RÊÃM e.SÐ. ] 
00000030: 8089 205f a065 205f 2080 0aa1 8181 0123  .. _ e _ ..¡...#
00000040: 0058 0020 800a a181 8102 40a0 6550 84a0  .X. ..¡...@ eP. 
00000050: 5d20 652e dce2 b02b dc64                 ] e.Üâ°+Üd

자바 스크립트

`${Math.round(
  eval(
    b.replace(
      /./g,
      c => ~(i = a.indexOf(c)) ? i : c
    ).replace(
      /\b0+/g,
      ''
    )
  )
)}`.replace(
  /\d/g,
  i => a[i]
)

설명

이 프로그램은 암시 적으로 입력의 첫 번째와 두 번째 줄을 변수로 문자열로 할당 ab각각 .

c줄의 각 문자bi 에서 찾은 문자 의 해당 색인 으로 a, 또는 찾을 수없는 경우 해당 문자 로 바뀝니다 .

그런 다음 0결과 문자열에서 경계가 앞에 오는 하나 이상의 각 시퀀스를 제거 합니다. 이것은 방지하기 위해eval()0 8 진 리터럴로 시작하는 일련의 숫자를 평가하지 것 입니다.

eval()및 이후 Math.round()에 결과는 문자열로 다시 강제 변환되고 각 숫자 문자 i는 줄의 해당 문자로 바뀝니다.a 색인i .

테스트 사례

데모

abcdefghij
abcd + efg + hij

bdgi

데모

abcdefghij
abc + def - ghij

-gedc

데모

qwertyuiop
qwerty / uiop

e

데모

%y83l;[=9|
(83l * 9) + 8%

y9|8



1

, 14 바이트

⍘UV⭆η⎇№θι⌕θιιθ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 참고 : 식은 Python 3 의미에 따라 평가되므로 0이 아닌 숫자의 선행 0은 불법입니다. 설명:

   ⭆η           Map over expression's characters and join
        ι       Current character
      №θ        Count matches in first input
     ⎇          If non-zero
         ⌕θι    Replace with position in first input
            ι   Otherwise keep character unchanged
 UV             Evaluate as Python 3
⍘            θ  Convert to base using first input as digits

불행히도 주요 0사례는 Python에서 작동하지 않으며 테스트 사례에 있습니다.
Jonathan Allan

0

파이썬 3 , 137 바이트

문자를 사용 str.translate하고 str.maketrans바꾸는 정규식이 아닌 접근법 . 선행 0을 다듬는 데 많은 문자를 잃었습니다 ...

lambda s,t,d='0123456789',e=str.translate,m=str.maketrans:e(str(round(eval(' '.join(c.lstrip('0')for c in e(t,m(s,d)).split())))),m(d,s))

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



0

볼프람 언어 (수학) , 121 바이트

두 개의 인수로 순수한 함수를 정의합니다. 일부 기능이 반복되므로 몇 문자를 저장하기 위해 변수에 저장합니다. 이 코드는 단순히 문자열을 대체 한 다음 ToExpressionWolfram 커널을 사용한 표현식을 평가하는 데 사용 됩니다.

(r=Thread[StringPartition[#,1]->(t=ToString)/@Range[0,9]];u[(u=StringReplace)[#2,r]//ToExpression//Round//t,Reverse/@r])&

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


0

루아 , 162 (151) 150 바이트

  • load대신에 사용하려는 아이디어 덕분에 -11 바이트function(...) end
  • 줄 바꿈을 생략하여 -1 바이트
l,p=...print(((math.ceil(load('return '..p:gsub('.',load'n=l:find(...,1,1)return n and n-1'))()-0.5)..''):gsub('%d',load'c=...+1 return l:sub(c,c)')))

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

루아는 세계에서 가장 짧은 것은 아니지만 (특히 큰 키워드로 인해 매우 힘들게 만듭니다), 만드는 것은 꽤 재미있었습니다. 인수로 입력하고 결과를 인쇄하는 전체 프로그램.

설명

소개

l,p=...

인수의 값을 변수에 지정하십시오. 우리의 사전 l과 표현은p 입니다.

다음 식은 이상한 실행 순서가 있기 때문에 이해하기가 어렵 기 때문에 단계별로 설명하겠습니다.

일반 숫자로 변환

p:gsub('.',
load'n=l:find(...,1,1)return n and n-1')

표현식 문자열에서 교체 수행 : 각 기호를 가져와 함수에 전달load 여기서 일반 선언보다 짧아짐).

함수는를 사용하여 전달 된 심볼에 대한 dict 문자열에서 발생 위치를 찾습니다 find. ...우리가 load현재의 상징 인 vaarg 함수 (임의의 어떤 것이 든)에있는 첫 번째 (그리고 유일한) 논쟁 입니다. find특수 기호를 무시 하려면 다음 인수가 필요합니다 ( 부울로 변환 될 때 1와 같이 평가되는 짧은 값임 true) : 시작 위치 (여기서는 기본값 임) 및 plain실제로 패턴 처리를 사용하지 않습니다. 이러한 프로그램이 없으면 세 번째 테스트 사례 %에서 특별 하지 않아 실패합니다 .

일치하는 것이 발견되면 Lua 문자열 (및 배열 btw)이 1을 기준으로 1을 뺍니다. 일치하는 것이 없으면 아무것도 반환하지 않으므로 교체가 수행되지 않습니다.

해결

math.ceil(load('return '..ABOVE)()-0.5)

return식 앞에 결과를 반환하고, 루아 함수로 컴파일하여 계산하고, 반올림을 수행하여 계산합니다 ( 방법은 다른 방식으로 짧아졌습니다).

결국 우리는 우리의 문제에 대한 수치 적 해결책을 얻었고, 그것을 다시 변환하는 것만 남아 있습니다.

다시 미치게 만들기

(ABOVE..'')
:gsub('%d',load'c=...+1 return l:sub(c,c)')

첫 번째 줄은 숫자를 문자열로 변환하는 짧은 방법이므로 이제 문자열 메서드를 짧게 호출 할 수 있습니다. 그렇게하자!

이제 gsub모든 것을 다시 광기로 대체하기 위해 다시 부름을 받았습니다. 이 시간 %d.함수가 숫자 만 처리 할 수 ​​있고 처리해야하므로 대체 패턴 대신 사용됩니다 ( .음수에는 오류가 발생 함). 이 시간 함수 ( load바이트를 저장하기 위해 다시 사용) 1는 먼저 첫 번째 (및 유일한) vaargument에 추가 하여 dict 문자열의 위치로 변환 한 다음 해당 위치에서 문자를 반환합니다.

후 레이, 거의 다 왔어!

극적인 피날레 또는 대괄호가 중요한 이유

print((ABOVE))

어쨌든 왜 두 쌍의 괄호가 필요합니까? 이제 막판에 대해 이야기 할 시간입니다… 하나의 함수가 한 번의 호출에서 적은 값을 반환 할 수 있다는 것입니다 ( 더 많은 예제 는 이 메타 질문 을 보십시오 ).

여기에서 마지막 gsub으로 두 가지 값을 반환했습니다. 필요한 응답 문자열과 교체 횟수 (실제로 자릿수이지만 누가 신경 쓰는지). 내부 쌍이 아닌 경우 문자열과 숫자가 모두 인쇄되어 우리를 망칠 수 있습니다. 여기에서 2 바이트를 희생하여 두 번째 결과를 생략하고 마침내이 광기 공장의 제품을 인쇄합니다.


글쎄, 난 처음부터 골프와 거의 같은 설명을 즐겼습니다, 당신이 여기에 무슨 일이 일어나기를 바랍니다.


참고 : 모든 테스트 사례를 통과하지만 다른 경우에는 잘못 반올림됩니다. 하나를 찾으면 고칠 것입니다.
발은
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.