숫자 0, 3, 7없이 비트 xor로 숫자를 분해합니다 있다고 가정 할

도전

양의 십진수를 취하는 함수 또는 프로그램을 작성하고 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 바이트


답변

CJam, 70 바이트

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

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

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

예제 실행

$ cjam t <<< 7777777777; echo
2695665494
6161166119

답변

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, 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

답변

파이썬 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 솔루션은 내가 믿는 것과 동일한 기술을 사용하고 있습니다.)