Розкладіть число з біт-xor без цифр 0, 3, 7


20

Виклик

Напишіть функцію або програму, яка приймає додатне десяткове число, назвіть її A і виведіть два додатних числа, B і C , таким чином:

  • A == B bitxor C
  • B і C не повинні містити жодного з цифр 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, якщо вони є частиною стандартних бібліотек мови або можуть бути встановлені через де-юре менеджер пакунків мови.

  5. Функція повинна бути швидкою. Це повинно зайняти не більше 20 секунд , щоб працювати на досить сучасний комп'ютер , коли годували 100-значне число, і не більше ніж на 2 секунди при подачі на 10-значне число.

  6. Функція / програма повинна підтримувати введення щонайменше до 100 цифр .

    • Якщо функція / програма може підтримувати лише цілі числа до N <100 цифр, до остаточного показника буде штраф + 10 × (100 / N - 1) байт. Це спонукає гольфістів підтримувати ширший діапазон номерів, навіть якщо імпорт може бути багатослівним.
  7. Немає обмежень щодо подання входів / виходів, якщо вони чітко відображаються в десятковому зображенні.

    • Функція може вводити та виводити рядки / BigInts, якщо вбудованих цілих типів недостатньо.
    • Вхід може надходити з параметра функції, аргументу командного рядка або STDIN.
    • Функція може повернути результат або просто надрукувати результат безпосередньо в STDOUT.
    • Однак підписане переповнення у вході / виході заборонено.
    • Орієнтовні відповіді не приймаються, введення / виходи повинні бути точними.

Оцінка балів

Це . Найкоротше рішення виграти в байтах.

Існує штраф, якщо програма може підтримувати лише цифри менше 100 цифр:

  • 64-бітні цілі числа (19 цифр) = +42 байти
  • 63-бітні цілі числа (18 цифр) = +45 байт
  • 53-бітні цілі числа (15 цифр) = +56 байт
  • 31/32-бітні цілі числа (9 цифр) = +101 байт

2
Ви впевнені, що таке розкладання завжди можливе? Ви можете намалювати мені доказ?
Джон Дворак

Тоді хтось блокує 1, 5, 9 у запитанні 95 цитат про фільми .
jimmy23013

3
100 цифр? це означає, що Python виграє одразу, оскільки це єдина тут часто використовувана мова, яка підтримує довільні точні цілі числа. Чому б не 19 цифр, що вписується в ціле число 64, але не підписане? (2 ^ 64 = 18 446 744 073 709 551 616)
Рівень річки Св.

5
@steveverrill Mathematica ... GolfScript ... CJam ...
Мартін Ендер

1
І Java (
мусив це

Відповіді:


2

CJam, 70 байт

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

Спробуйте в Інтернеті.

Випадково вибирає цілі числа, поки не знайде збіг. Це ледве відповідає межі 20 секунд для 64-бітових цілих чисел (за допомогою інтерпретатора Java), тому я додав 42 до фактичної кількості байтів.

Приклад виконання

$ cjam t <<< 7777777777; echo
2695665494
6161166119

10

Лист звичайний, 240 224 183 173 169 байт

Звичайний Лісп - трохи багатослівний для гольфу. Однак, це розкладає 100-значні числа на секунду та 200-значні цілі числа менше ніж за десять секунд, тому немає необхідності в штрафних санкціях. Алгоритм детермінований.

(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)

В якості бонусу я включаю версію коду, яка поступово будує рішення зверху вниз. Він може керувати 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

Python 2, 103 + 42 = 145 байт

Python в основному підтримує bigint, але ця програма значно перевищує 20 секунд для 100-значного числа. Однак він розкладає 64-бітні цілі числа приблизно за 2 секунди.

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цикл для спроб випадкових значень - ви можете просто зателефонувати знову. Не потребуючи структури управління, ви можете згортати функцію на alambda і трикомпонентної: 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

Python 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. Я думаю, що тут є ядро ​​ідеї, але це не очевидно.
Кіт Рендалл

@KeithRandall: Так, це як 999… 999 + 1, але, враховуючи вибір {1,2,4,5,6,8,9}, знайдуться деякі з них, які не вплинуть на високі цифри. (наприклад 997^2 == 999). Внутрішня whileпетля робить виснаження, щоб знайти вибір, який зберігає високі цифри.
kennytm

правильно, але тоді не очевидно (мені щонайменше), що напевно є цифра, яка буде працювати.
Кіт Рендалл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.