숫자 0, 3, 7없이 비트 xor로 숫자를 분해합니다


20

도전

양의 십진수를 취하는 함수 또는 프로그램을 작성하고 A 라고 부르고 두 개의 양수 BC를 출력하십시오 .

  • A == B bitxor C
  • BC 는 10 진수로 숫자 0, 3 또는 7을 포함하지 않아야합니다.

>>> decompose(3)
1, 2
>>> decompose(7)
1, 6
>>> decompose(718)
121, 695
>>> decompose(99997)
2, 99999
>>> decompose(4294967296)
4294968218, 922
>>> decompose(5296080632396965608312971217160142474083606142654386510789497504098664630388377556711796340247136376)
6291484486961499292662848846261496489294168969458648464915998254691295448225881546425551225669515922,
1191982455588299219648819556299554251659915414942295896926425126251962564256469862862114191986258666

분해가 고유하지 않기 때문에 함수 / 프로그램은 제공된 예제와 동일한 결과를 출력 할 필요가 없습니다.

매우 상세한 규칙

  1. 제출은 완전한 기능 또는 프로그램 의 형태로 이루어져야합니다 . import성명서 최종 점수에 반영됩니다.

  2. 입력 A에 항상 0, 3 또는 7 이상의 숫자가 포함되어 있다고 가정 할 수 있습니다 .

  3. 분해가 항상 존재한다고 가정 할 수 있습니다.

  4. BigInt가 언어의 표준 라이브러리의 일부이거나 언어의 jure 패키지 관리자를 통해 설치할 수있는 경우 BigInt를 사용할 수 있습니다 .

  5. 기능이 빨라야합니다. 그것은 이하 소요됩니다 20 초 10 자리 숫자를 공급하는 경우 더 이상 이초보다 100 자리 숫자를 공급하고, 때 합리적으로 현대 컴퓨터에서 실행할 수 있습니다.

  6. 기능 / 프로그램은 100 자리 이상의 입력을 지원해야합니다 .

    • 함수 / 프로그램이 N <100 자리까지의 정수만 지원할 수있는 경우 최종 점수에 + 10 × (100 / N-1) 바이트 의 페널티부과 됩니다. 이것은 수입이 장황하더라도 골퍼가 더 넓은 범위의 숫자를 지원하도록 권장하기위한 것입니다.
  7. 입력 / 출력이 10 진수로 명확하게 표시 되는 한 입 / 출력 의 표시에는 제한없습니다 .

    • 내장 정수 유형이 충분하지 않은 경우 함수는 문자열 / BigInts를 입력 및 출력 할 수 있습니다.
    • 입력은 함수 매개 변수, 명령 행 인수 또는 STDIN에서 올 수 있습니다.
    • 이 함수는 결과를 반환하거나 STDOUT에 직접 결과를 인쇄 할 수 있습니다.
    • 그러나 입력 / 출력의 부호있는 오버플로는 허용되지 않습니다.
    • 대략적인 답변은 용납되지 않으며 입력 / 출력은 정확해야합니다.

채점

이것은 입니다. 바이트 단위의 최단 솔루션이 승리합니다.

프로그램이 100 자리 미만의 숫자 만 지원할 수있는 경우 위약금이 부과됩니다.

  • 64 비트 정수 (19 자리) = +42 바이트
  • 63 비트 정수 (18 자리) = +45 바이트
  • 53 비트 정수 (15 자리) = +56 바이트
  • 31/32 비트 정수 (9 자리) = +101 바이트

2
그러한 분해가 항상 가능합니까? 증거를 스케치 해 줄 수 있습니까?
John Dvorak

95 Movie Quotes 질문 에서 누군가 1, 5, 9를 차단하십시오 .
jimmy23013

3
100 자리? 그것은 파이썬이 여기서 가장 일반적으로 사용되는 언어이기 때문에 임의의 정밀 정수를 지원하기 때문에 곧바로 승리한다는 것을 의미합니다. 64 자리 부호없는 정수에 맞는 19 자리 숫자가 아닌 이유는 무엇입니까? (2 ^ 64 = 18446744 073709551616)
Level River St

5
@steveverrill Mathematica ... GolfScript ... CJam ...
마틴 엔더

1
그리고 Java (그렇게 말해야 함)
Ypnypn

답변:


2

CJam, 70 바이트

ri:Q{;Qmr_Q^`1$`+730`&}g_Q^p

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

일치하는 것을 찾을 때까지 무작위로 정수를 선택합니다. 이것은 64 비트 정수 (Java 인터프리터 사용)의 20 초 제한을 거의 준수하지 않으므로 실제 바이트 수에 42를 추가했습니다.

예제 실행

$ cjam t <<< 7777777777; echo
2695665494
6161166119

10

CL의, 240 224 183 173 169 바이트

커먼 리스프는 골프에 대한 자세한 설명입니다. 그러나 이것은 100 초 숫자를 1 초 미만으로 분해하고 200 자리 정수를 10 초 미만으로 분해하므로 벌칙이 필요하지 않습니다. 알고리즘은 결정적입니다.

(defun s(z)(and #1=(some(lambda(q)(position q(format()"~a"z)))"037")(+ z(floor z(expt 10 #1#)))))
(defun d(x)(do((y x(or(s y)(s #3=(logxor x y))(return`(,y,#3#)))))(())))

기능 사이의 줄 바꿈은 인쇄상의 목적으로 만 사용됩니다. 100 자리 기준 입력으로 테스트 실행 :

(time (d 5296080632396965608312971217160142474083606142654386510789497504098664630388377556711796340247136376))
took 677,000 microseconds (0.677000 seconds) to run.
      20,989 microseconds (0.020989 seconds, 3.10%) of which was spent in GC.
During that period, and with 8 available CPU cores,
     671,875 microseconds (0.671875 seconds) were spent in user mode
           0 microseconds (0.000000 seconds) were spent in system mode
 54,221,104 bytes of memory allocated.
(1864921261592819619661568919418981552559955289196969112566252282429216186594265918444566258544614425
 5891958562486995519825158818455999516899524658151445485616155916296966645869599949958954491929662561)

보너스로 솔루션 하향식을 점차적으로 빌드하는 코드 버전을 포함시키고 있습니다. 10 초 이내에 1000 자리 숫자를 관리 할 수 ​​있지만 추가 코드로 인해 골프에서 경쟁 할 수는 없습니다.

(defun decompose (x)
  (flet ((s (z)
           (mapcan #'(lambda (c) (and #1=(position c #2=(format () "~a" z))
                                 (list (- (length #2#) #1# 1))))
                   '(#\0 #\3 #\7))))
    (do ((y x (let ((p (nconc (s y) (s #3=(logxor x y)))))
                (or p (return`(,y,#3#)))
                (+ y (expt 10 (apply #'max p))))))
        (nil))))

* (time (decompose (parse-integer (make-string 1000 :initial-element #\7))))
took 9,226,000 microseconds (9.226000 seconds) to run.
        90,966 microseconds (0.090966 seconds, 0.99%) of which was spent in GC.
During that period, and with 8 available CPU cores,
     9,234,375 microseconds (9.234375 seconds) were spent in user mode
             0 microseconds (0.000000 seconds) were spent in system mode
 487,434,560 bytes of memory allocated.
(8889898889152488921298888992819221914229899249999918899888899888888889999989141219898898888988988898888888888899142442899924898918898898988988895189988898888924192198992454114198911989191888889898888918888988988998888891421118891899122898888998989898888898988898888999988918888898889189918889888888899888989219188898998888988892119889198888988888894888912188898989952999888888888898899998988898889228918998949999998898898991141888898999988912121292118899889998989899999892889941898888911888898889118998898888911889889888891452888998889288921141888888942189888899988891918889118888888888989892198899199914111188988889421111188889118888918989988912989999998989891119888898888888892621229888988888999619888952462219889189899998899888889989898891118989218888888898962988891188899888888888999888888888888888888888891269188921288888888998898899214191188888888898992188998898889919888889989889899988892115549998888898889218899988998911898989199918898918988898888891889888989119899888889888998918889112189998
 4184469818464841952189561886965821566229261221619858498284264289194458622668559698924621446851546256444641488616184155821914881485164244662156846141894655485889656891849662551896595944656451462198891289692696856414192264846811616261884188919426294584158925218559295881946496911489245664261126565546419851585441144861859822815144162828551969425529258169849412525611662488849586554989254181228254465226521648916188265491499166186964881248156451994924294646681548996645996894665198811511522424996844864211629888924642289925565591484541149414914699289441561496451494562955652129199261462268846144518142486845251946444998812988291119592418684842524648484689261441456645518518812265495165189812912919529151991611962525419626921619824496626511954895189658691229655648659252448158451924925658586522262194585891859285841914968868466462442488528641466655911199816288496111884591648442984864269495264612518852292965985888414945855422266658614684922884216851481646226111486498155591649619266595911992489425412191)
* (apply #'logxor *)
7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777

2

파이썬 2, 103 + 42 = 145 바이트

Python은 기본적으로 bigint를 지원하지만이 프로그램은 100 자리 숫자의 경우 20 초를 훨씬 초과합니다. 그러나 약 2 초 안에 64 비트 정수를 분해합니다.

from random import *
def d(a):
 b=c=0
 while set(`b`+`c`)&set('037'):
    b=randint(1,a);c=a^b
 return b,c

1
임의성을 사용하는 영리한 아이디어. 함수를 정의하는 경우 while임의의 값을 계속 시도하기 위해 루프가 필요하지 않습니다 . 함수를 다시 호출하면됩니다. 제어 구조가 필요하지 않으면 함수를 a lambda및 삼항으로 축소 할 수 있습니다 from random import* d=lambda a,b=0:set(`b`+`a^b`)&set(\'037\')and d(a,randint(1,a))or(b,a^b). 함수를 사용하지 않는 것이 더 나을 수도 있습니다.
xnor

재귀를 고려했지만 많은 숫자 (11 자리조차도)에 스택 오버플로가 발생합니다.
레미

1

파이썬 3 (132 바이트)

(이것은 더 나은 솔루션을 자극하기위한 것입니다. ASCII 영화의 원래 문제를 해결할 때 내 솔루션입니다.)

def d(a):
 l=len(str(a));s=int('1'*l);u=10**(l-1)
 while u:
  while set(str(s)+str((a^s)//u))&set('037'):s+=u
  u//=10
 print(s,a^s)

십진수 시스템에서 비트 xor의 동작은 매우 복잡하지만 한 가지 주요 관찰 사항 이 있습니다. 낮은 자릿수를 수정해도 높은 자릿수에는 영향을 미치지 않습니다 . 따라서 우리는 하향식으로 작업 할 수 있습니다. 상위 숫자를 0, 3, 7에서 자유롭게 만든 다음 정수가 풀릴 때까지 다음 자리에서 작업하십시오. 이를 통해 우리는 선형 시간으로 실행할 수 있으며, 천 자리 숫자 처리는 1 초 이내에 완료 될 수 있습니다. (Common Lisp 솔루션은 내가 믿는 것과 동일한 기술을 사용하고 있습니다.)


그러나 낮은 자릿수를 고정하면 높은 자릿수에 영향을 줄 수 있습니다 . 예를 들어 997^8 == 1005. 나는 여기에 아이디어의 핵심이 있다고 생각하지만 분명하지 않습니다.
Keith Randall

@KeithRandall : 그렇습니다. 999… 999 + 1과 같습니다. 그러나을 선택 {1,2,4,5,6,8,9}하면 높은 숫자에 영향을 미치지 않는 것들이있을 것입니다. (예 :) 997^2 == 999. 내부 while루프는 높은 숫자를 유효하게 유지하는 선택을 찾기 위해 고갈을 수행합니다.
kennytm

그렇습니다. 그러나 적어도 작동 할 숫자가 있는지는 분명하지 않습니다.
Keith Randall
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.