컴퓨터 수리를 미루도록 도와주세요!


23

이 도전은 실제적이고 비극적 인 영감에 의해 당신에게 가져옵니다. 최근에 키보드의 숫자 행이 약간 산발적이었습니다. 키는 1-9때때로 작동하지만 다른 경우에는 결과가 없습니다. 열렬한 프로그래머로서 이것은 끔찍합니다! (그 느낌표를 참조하십시오. 그것이 그들이 지금 일하고 있음을 아는 방법입니다.) 종종 숫자 자체뿐만 아니라 기호도 필요합니다!@#$%^&*(절반도 완전히 효과가 없습니다! C 프로그래머로서 랩톱을 수정하기 위해 바쁜 일정을 피하는 데 시간을 허비하지 않고 문제를 해결하는 데 더 관심이있었습니다. 지난 몇 주 동안 천천히, 내 코드의 모든 숫자 리터럴이 16 진수로 바뀌어 숫자를 복사하여 붙여 넣기 위해 사냥을 할 필요가 없습니다. 그러나 키가 없으면 일부 숫자를 입력하기가 쉽지 않습니다 1-9. 예를 들어, 숫자 1는 단순히 16 진수로 쓰여질 수 없으며 1코드 에서을으로 바꾸는 것에 의지했습니다 0xF - 0xE. 영향을받는 유일한 키는 1-9내가 좋아하는 심볼 전체를 사용을 유지하므로, +, -,와 /. 그러나 곱셈이나 괄호는 사용할 수 없습니다.*그리고 (자주 끊어집니다. 이것은 당신의 도전으로 이어집니다.

입력

nstdin 또는 해당 언어에 해당 하는 정수 입니다. 원하는 경우 정수 앞에 새 줄이나 다른 공백 문자가 올 수 있습니다. 또는 명령 행 인수를 통해 입력을받을 수도 있습니다.

프로그램은 음의 입력에 올바르게 응답해야하며 최소 32 비트 부호있는 정수를 처리 할 수 ​​있어야합니다.

산출

프로그램은 n하나 이상의 16 진수 값의 합계, 차이 또는 나눗셈으로 숫자를 쓸 수있는 가장 짧은 방법 (공백이 아닌 문자로)을 관찰 가능한 형태로 출력해야 합니다. 이 문제를 해결하는 방법은 여러 가지가 있으며 다른 길이보다 동일한 길이의 출력을 선호 할 필요는 없습니다.

출력 형식이어야 다음의 16 진수 값 인 숫자 만 함유 한 기호 중의 하나이다 . 하자 정수 나누기,하지 부동 소수점을 설명합니다.A % A % A...A0xA-F a-f%-+//

( n분할 결과는 먼저 왼쪽에서 오른쪽으로 나눗셈을 평가 한 다음 더하기와 빼기를 왼쪽에서 오른쪽으로 평가할 때 결과로 표시 됩니다.)

테스트 사례

입출력

  1. 1

    0xF - 0xE(또는 0xF-0xE또는 0xB-0xA또는 0xd - 0xc또는 0xF/0xF)

  2. 15

    0xF

  3. 255

    0xFF

  4. 30

    0xF + 0xF

채점 및 규칙

이것은 코드 골프입니다. 예비 점수는 소스 파일의 바이트 수입니다.

1-9소스 에서 숫자 를 사용할 수 없습니다 .

당신 !@#$%^&*(은 당신의 소스에서 기호 를 사용할 수 있지만 각각의 점수에 +20의 페널티가 있습니다.

프로그램이 n사람이 읽을 수있는 출력 형식을 생성하는 한 인수로 사용 되는 함수로 프로그램이 대체 될 수 있습니다 . 함수의 반환 값은 출력으로 계산되지 않습니다.

표준 허점 은 허용되지 않습니다.

최저 점수가 이깁니다! 행운을 빕니다!

나는 형식화 / 질문 / 명확한 무언가를 잘못 했습니까? 알려주세요! 이 사이트에 대한 첫 번째 제출입니다!


정수 크기에 상한이 있습니까? 또한 음수가 임의의 정밀도 (예 : 32 비트)로 표시됩니까?
FryAmTheEggman

@FryAmTheEggman 명확히하기 위해 원본 게시물을 편집했습니다. 입력이 음수 일 수 있으며 프로그램은 32 비트 이상의 입력에 올바르게 응답해야합니다. 감사!
BrainSteel


나에게 꽤 고체 사양 등이 외모, 당신은 몇 가지 피드백을 원하신다면하지만, 나는 그것을 게시 권하고 싶습니다 샌드 박스 당신이 피드백을 얻을 수 있도록 (미래의 도전에 대한) 하기 전에 당신이 메인에 게시하고 사람들이 작업을 시작 .
Martin Ender 2019

1
정수 또는 부동 소수점 나누기?
edc65

답변:


5

JavaScript 287 (187 + 20 * 5) 295 (195 + 20 * 5) 338 (198 + 20 * 7)

6 개의 허용 된 16 진수 (0xA ~ 0xF)와 3 개의 허용 된 연산자의 가능한 모든 조합을 확인하는 기능입니다. 요청에 따라 팝업을 통해 출력하고 값을 반환하지 않습니다.

[]를 사용하여 쉼표로 구분 된 표현식을 그룹화했지만 루프 및 함수 호출을위한 5 7 열린 괄호를 피할 수 없었습니다 .
숫자를 피하기 위해 1,2,3에 대한 변수 A, B, C가 있습니다 (이는 코드를 더 모호하게 만듭니다)

'('를 피하기 위해 수정 된 코드 편집 . ifs 및 명시 적 RegExp 생성 제거

주의 :이 기능은 엄청나게 느리므로 FireFox 스크립트의 시간 제한을 초과합니다 (90과 같은 작은 입력의 경우에도).

가능한 모든 표현을 열거하기 위해 3에서 시작하여 영원히 올라가는 숫자를 사용합니다. 숫자 인코딩 :
0,1,2는 연산자 +,-, /
4 ~ 9는 16 진수 A입니다 ..F
3은 허용되지 않습니다.
각 숫자는 /3|[0-2]{2}/숫자 3을 피하기 위해 정규 표현식 으로 확인 하고 숫자 2는 연속 연산자를 갖습니다. 또한 추적 및 주요 연산자를 피하십시오-코드 참조)

결과 문자열은 0xA + 0xA - 0xD유효한 자바 스크립트 와 같은 것이므로 eval을 사용하여 평가합니다. Unfortunatley '/'연산자는 JavaScript에서 부동 소수점이며 정수가 아니므로 결과가 최종 결과를 정수로 변환하는 올바른 이벤트 캐스트인지 100 % 확신하지 못합니다 (그러나 작은 반올림 오류는 '*'로 증폭된다)

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,j=0;j?x-~~eval(L):A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',L='',w='0x')?j='':j)
      c>C?w+=' ABCDEF'[c-C]:[L+=w,w=' '+'+-/'[c]+' 0x']
  }
  alert(L)
}

다른 것

이제 더 재밌어요. 나는 eval call을 피하기 위해 지나치게 단순화 된 expressionr parser를 사용했으며 재미있게도 훨씬 빠릅니다.

파서는 실제로 단순화됩니다. 실제 파서 V와 O는 보류중인 값 스택과 보류중인 연산자 스택을 포함하는 배열이어야합니다. 여기서 V는 단일 보류 값 (및 반환 값)이고 O는 최대 2 자의 문자열입니다. P는 '-+ /'=> '112'에 대한 연산자 우선 순위 테이블을 포함합니다.

이 점수는 275 + 4 * 20 => 355입니다

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,D=A+C,j=0,P=''+A+A+B;j?x-V:A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',v=V=O=L='',w='0x')?j='':j)
      c>C?
        w+='ABCDEF'[v<<=D,v+=D+A-~c,c-D]
      :[
          P[O[0]]>=P[c]?[v=O>A?V/v|0:O>0?V+v:V-v,O=c]:O=c+O,
          L+=w,w=' '+'-+/'[c]+' 0x',V=v,v=0
      ]
  }
  alert(L)
}

테스트 에서 파이어 폭스 / 방화 광 콘솔, 복귀와 변경 알림 (더 많은 사용 가능)

;[0, 1, 15, 255, 30].forEach(x=>console.log(x,F(x)))

0 0A -0xA
1 0xA / 0xA
15 0xF
255 0xFF
30 0xF + ​​0xF

조금 덜 분명하지만 (인내심을 가지십시오)

;[16,40, 51, 62, 73, 84, 95].forEach(x=>console.log(x,F(x)))

16 0xBA / 0xB
40 0xA + 0xF + ​​0xF
51 0xDD-0xAA
62 0xEA-0xAC
73 0xA + 0xEA-0xAB
84 0xFE-0xAA
95 0xA + 0xFF-0xAA


3

파이썬 2 : 185 바이트 + 2 * 20 = 225

진지한 대답을하기에는 너무 길다. 그러나 아직 답변이 없으므로 어쨌든 게시하겠습니다.

from itertools import product as p
n=input()
l=t=0
while~l:
 l=-~l
 for i in p("0xABCDEF+-/",repeat=l):
  j=""
  for k in i:j+=k
  try:exec"t="+j
  except:0
  if t==n:print j;l=~0;break

product허용되는 문자의 모든 다른 배열을 만듭니다. exec그것을 해독하려고합니다. 이것은 슬프게도 예외를 반환하므로 긴 try - catch블록입니다. 결과가 양호하고 인쇄되어 존재합니다.

함수 호출 중 중괄호로 인해 2 배의 패널티.


2
이 답변에는 몇 가지 문제가있을 수 있습니다. (1) 016 진 리터럴이 아닙니다. (2) 파이썬에서 음수를 포함하는 나눗셈은 C에서와 다른 결과를 제공합니다.
feersum
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.