Парадокс подорожі у часі


17

Чоловік має два пристрої.

  • Машина часу - Він може керувати цією машиною, думаючи. Це дозволяє йому переходити з будь-якого моменту часу до іншого моменту часу в минулому чи майбутньому (або навіть теперішній момент часу) взагалі за короткий час. Зауважте, що якщо він подорожує в минуле з B до A, то всі нормальні події (машини часу, виключені генератори) від A до B повинні повторюватися точно так само. Потім від точки B він повертається назад до точки А. Таким чином, одночасне подорож створює нескінченну петлю.
  • Генератор - Усвідомивши цю проблему, він створює іншу машину. Він помічає, що, хоча всі фізичні події повторюються в циклі, його думки можуть бути різними. Отже, ця машина була розроблена так, щоб керуватися думкою також. Машина може бути використана в будь-який час для забезпечення альтернативного майбутнього (але не минулого) стосовно часу, яким він користувався.

Приклад

Я поясню всі деталі, використовуючи довгий приклад.

1000 T+250 250 T+0 500 T-200 100 T-50 125 A 225 T-400 500 A 100 T-200 150 T-25 100 T+100 50 A 25
  • Проходить 1000 років. Зараз 1000 рік.
  • Він подорожує від 1000 до 1250 року.
  • Проходить 250 років. Зараз 1500 рік.
  • Він подорожує від 1500 до 1500. Це не має ефекту (і його можна нехтувати).
  • Проходить 500 років. Зараз це 2000 рік
  • Він подорожує з 2000 по 1800 рік.
  • Проходить 100 років. Зараз 1900 рік.
  • Він подорожує з 1900 по 1850 рік.
  • Проходить 125 років: Однак цього разу, коли він перебуває в циклі, справи йдуть інакше. 50 років проходять з 1850 по 1900 рік. Він закінчується циклом назад до 1850 року. Ще 50 років проходить з 1850 по 1900 рік. Проходить 25 років, і це 1875 рік, таким чином, виповнюється 125 років.
  • Він використовує генератор. Зараз існує альтернативне майбутнє на 1875 рік, в якому він зараз знаходиться. Минуле не змінилося.
  • Проходить 225 років. Зараз це 2100 рік.
  • Він подорожує з 2100 до 1700.
  • 500 років проходять: 175 років з 1700 по 1875 проходять нормально. Ні, він знову не стикається з генератором, а це означає, що тепер було створено третє майбутнє після 1875 року. 325 років проходять нормально, роблячи це 2200 роком.
  • Використання альтернатора зараз не має ефекту (і його можна ігнорувати), оскільки існує лише одне майбутнє до 2200, яке ще не було визначене.
  • Проходить 100 років. Зараз це 2300.
  • Він подорожує з 2300 до 2100.
  • 150 років проходять: 100 років з 2100 до 2200 проходять нормально. Друге майбутнє створюється з 2200. Проходить 50 років, і це вже 2250 рік.
  • Він повинен пройти з 2250 по 2225 рік. Однак зараз існує два 2225 за два різні строки. Отже, це призводить до парадоксу, оскільки ми не можемо визначити, до якого моменту він дістанеться. (Ми не будемо вважати, що він іде на більш пізні терміни) Отже, це припиняє наше моделювання.
  • Все, що далі 100 T+100 50 A 25, повністю ігнорується, оскільки стався парадокс і наше моделювання перестало працювати.

Підказка: Якщо ви намагаєтесь зрозуміти приклад, уявіть собі час, як дорога, яку ви копаєте по землі. Якщо ви подорожуєте часом, ви створюєте телепортатор. Якщо ви використовуєте генератор, ви копаєте новий шлях у стіну існуючого шляху.

Парадокс

Припустимо, A, B і C - це три моменти часу (одна за одною). Парадокс, як кажуть, стався iff:

  • ви перебуваєте в точці C, в точці B існує генератор, в точці B існує більше, ніж одне майбутнє (і ви знаходитесь в одній з них), і ви намагаєтеся отримати доступ до будь-якої точки між B і C за допомогою подорожі в часі.
  • ви перебуваєте в точці А, в точці В існує генератор, в точці В є більше майбутнього, і ви намагаєтеся отримати доступ до точки С (після В) за допомогою подорожі в часі.

Вхідні дані

Серія подій, аналогічна прикладу. (Формат гнучкий.)

Вихідні дані

Кореневе значення / фальси, що вказує на те, чи стався парадокс.

Виклик

Найкоротший код (у байтах) виграє.


як flexibleце format?
кіт

@ GlennRanders-Pehrson О, я зрозумів, що ти мав на увазі. Відредаговано.
ghosts_in_the_code

2
@sysreq Будь-які додаткові розділові знаки (пробіли, коми, дужки тощо) дозволені. Будь-який символ (и), дозволений (-ла), можна розмежувати між часом руху та генератором. Будь-які символи, дозволені для використання замість + та - (рух вперед / назад). Числа можуть бути в будь-якій базі (двійкові, десяткові тощо). Події будуть введені лише в тому ж порядку. Жодних фактичних чисел року не надаватиметься, ви повинні припустити, що починається з нуля (або будь-яке інше ціле число) і самостійно з’ясувати фактичні номери року (якщо вам потрібно).
ghosts_in_the_code

це допомогло б мені, якби було кілька невеликих прикладів замість одного великого, але я все-таки проголосував!
яскравий

Відповіді:


4

Ruby, 510 460 байт

p=[0];w=[n=x=0]
i=gets.split.map{|s|
if x!=1
if s[0]=="A"
w<<n
else
if s[0..1]=="T+"
t=n
q=s[2..-1].to_i
if w[-1]==t||(w[-1]>t&&w[-1]<n+q)
w<<w[-1]
n+=q
else
n+=(t<p[-1]&&n+q>p[-1])?q%(p[-1]-n):q
end
elsif s[0..1]=="T-"
t=n
p<<n
n-=s[2..-1].to_i
x=(x==0&&w[-1]>0&&t>w[-1]&&n>w[-1])?1:0
else
t=n
q=s.to_i
if w[-1]==t||(w[-1]>t&&w[-1]<n+q)
w<<w[-1]
n+=q
else
n+=(t<p[-1]&&n+q>p[-1])?q%(p[-1]-n):q
end
end
end
else
break
end}
p x

Вхідні дані

Як на приклад

Вихідні дані

0 = Парадокс немає, 1 = Парадокс

Зразок

Наведений зразок введення: 1000 T+250 250 T+0 500 T-200 100 T-50 125 A 225 T-400 500 A 100 T-200 150 T-25 100 T+100 50 A 25 повертається 1, вказуючи на парадокс.

Примітки

Це не тільки перша вправа на я спробую, але це також перша програма Ruby, яку я написав. Отже, це, можливо, може бути і коротшим.

Коротке пояснення

p: Infinite loops
w: Alternate timelines
n: Now (regardless of timeline)
x: Paradox

Нескінченні петлі відбуватимуться лише під час подорожі вперед у часі. Я радий за будь-які відгуки - особливо, якщо це вказує на кращий спосіб вирішити це.


Чи можете ви надати деякі вибіркові вхідні / вихідні дані?
Аддісон Кримп

@VoteToClose - Окрім даних, наданих у запитанні, я можу створити більше зразкових даних, якщо потрібно?
Петро Аболін

О, боже, я цілком пропустив ту частину "Зразка". Я ідіот. +1
Addison Crump

3
Усі thenелементи не потрібні і їх можна видалити. Крім того, ви повинні використовувати {...}замість того, do...endщоб зберегти більше символів. mapекономить байт eachі splitрозділяє на пробіл за замовчуванням. Перші чотири рядки ініціалізації можна скоротити до p=[];w=[n=x=0].
Дверна ручка

2
Я знаю, що минуло 3,5 років (лол ..), але я думаю, ви можете пограти в поточний код до 288 байт (не зовсім впевнено, оскільки я не знаю Рубі занадто добре). Однак у вашому поточному коді не враховуються парадокси з часом вперед (другий пункт в описі ОП).
Кевін Круїссен

3

05AB1E , 93 92 86 82 байт

ðU0V#vyAQiYˆðUëy.ïiYy+DX˜såàiXD€нY@Ïн©θ-®¥OÄ%®θY-YOVëVëYy¦+©¯@àXðʘà*i1q}XY®Ÿª{U®V

Введення в тому ж форматі, що і в описі виклику, за винятком того, що генератор Aє abcdefghijklmnopqrstuvwxyzзамість того, щоб зберегти байти.
Виходи, 1якщо стався парадокс, або сам вхід, якщо ні (лише 1триє в 05AB1E, все інше - фальси).

На основі моєї відповіді на Java 10 .

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

Або спробуйте в режимі он-лайн за допомогою доданих ліній налагодження ( TODO: Створіть належний тестовий набір із усіма тестовими кейсами одразу .. ):
- Тестовий випадок із парадоксам зворотнього проходження часу: Спробуйте в Інтернеті.
- Тестовий випадок із парадоксами руху в часі: спробуйте в Інтернеті.
- Тестовий випадок без парадоксу подорожі часом: спробуйте в Інтернеті.

Пояснення:

ðU                         # Set variable `X` (time-travels) to a space character " "
0V                         # Set variable `Y` (current year) to 0
#                          # Split the (implicit) input by spaces
 v                         # And loop over each event `y`:
  yAQi                     #  If the current event `y` is an alternator ("abcdefghijklmnopqrstuvwxyz"):
      Yˆ                   #   Add the current year `Y` to alternators-list `GB`
      ðU                   #   And reset variable `X` to " "
  ëyi                    #  Else-if the current event `y` is an integer:
       Yy+                 #   Calculate the current year `Y` plus the integer `y`
          D                #   Duplicate `Y+y`
           X˜såài          #   If this `Y+y` is within any of the time-travel ranges:
                 X €н      #    Get the starting positions of each time-travel
                     Y@    #    Check for each starting position if the current year `Y` is >= it
                  D    Ï   #    And only leave the time-travel ranges for which this is truthy
                        н  #    Then pop and push the first one
                         © #    Store this time-travel range in variable `r` (without popping)
                 θ         #    Pop and only leave the time-travel destination
                  -        #    Subtract it from the `Y+y` we duplicated
                       %   #    And modulo it with:
                   ®¥OÄ    #     The absolute distance of the time-travel `r`
                 ®θ        #    Then push the time-travel destination again
                   Y-      #    And subtract the current year `Y`
                 YO        #    Then sum these two and the current year `Y` together
                   V       #    And pop and store it as new year `Y`
       ë                   #   Else (`Y+y` is not within any time-travel ranges)
        V                  #    Simply pop and store the duplicated `Y+y` as new year `Y`
  ë                        #  Else (the current event `y` is a time-travel)
    y¦                     #   Remove the leading "T"
   Y  +                    #   And add the value to the current year `Y`
       ©                   #   Store this value in variable `r`
        ¯@à                #   Check if any alternator in list `GB` is >= this value
           XðÊ˜à           #   Check if there are any time-travels
                *i  }      #   And if both are truhy:
                  1        #    Push a 1
                   q       #    Stop the program
                           #    (after which the top of the stack is output implicitly)
    Y®Ÿ                    #   Create a list in the range [current year `Y`, new year `r`]
   X   ª                   #   Append it to the time-travels `X`
        {                  #   And then sort these time-travels
         U                 #   After which we pop and store it as updated `X`
   ®V                      #   And then set `Y` to the new year `r`
                           # (if we haven't reached `q`, the (implicit) input is output instead)

3

Java 10, 498 485 478 байт

import java.util.*;s->{var a=new Stack<Long>();var m=new TreeMap<Long,Long>();long p=0,c=0,t,v,k;o:for(var S:s.split(" "))if((t=S.charAt(0))>65){var b=S.charAt(1)>44;v=new Long(S.substring(2));for(var A:a)p=A>c+(b?-v:v)|m.size()<1?p:1;if(v>0)m.put(c,b?c-v:c+v);c+=b?-v:v;}else if(t>64){a.add(c);m.clear();}else{t=new Long(S);e:for(var e:m.entrySet())if((k=e.getKey())>=c){for(v=c;v<=c+t;)if(a.contains(v++))break e;c=(v=e.getValue())+(c+t-v)%(k-v);continue o;}c+=t;}return p>0;}

Введіть (поки що) в тому ж форматі, що і в описі завдання.

-13 байт завдяки @BenjaminUrquhart .
-7 байт завдяки @ceilingcat .

Спробуйте в Інтернеті або спробуйте в режимі он-лайн із доданими налагодженнями .

Пояснення:

import java.util.*;            // Required import for the List and TreeMap
s->{                           // Method with String parameter and boolean return-type
  var a=new Stack<Long>();     //  Create a List for the alternators
  var m=new TreeMap<Long,Long>();
                               //  Create a sorted Map for the time-travels
  long p=0,                    //  Paradox-flag, initially 0
       c=0,                    //  Current year, initially 0
       t,v,k;                  //  Temp-values, uninitialized
  o:for(var S:s.split(" "))    //  Loop over the input substrings split by space:
    if((t=S.charAt(0))>65){    //   If the first character is a 'T':
      var b=S.charAt(1)>44;    //    Check if the second character is a '-'
      v=new Long(S.substring(2));
                               //    Convert the String-value to a number
      for(long A:a)            //    Loop over the alternators
        p=A>                   //     If an alternator is larger than:
            c+                 //      The current year, plus
              (b?              //      If we travel backwards in time:
                 -v            //       Subtract the value
                :              //      Else (we travel forward in time):
                 v)            //       Add the value
          |m.size()<1?         //     Or if no previous time-travels occurred:
           p                   //      Leave the paradox-flag the same
          :                    //     Else:
           1;                  //      Set the paradox-flag to 1
      if(v>0)                  //     If the value is not 0 (edge-case for "T+0")
        m.put(c,b?c-v:c+v);    //      Add the from-to time-travel to the Map
      c+=b?-v:v;}              //     Increase/decrease the year accordingly
    else if(t>64){             //   Else-if the character is an 'A':
      a.add(c);                //    Add the current year to the alternators-list
      m.clear();}              //    And empty the time-travel Map
    else{                      //   Else (it's a number)
      t=new Long(S);           //    Convert the String to a number
      e:for(var e:m.entrySet())//    Loop over the time-travels:
        if((k=e.getKey())      //     If the time-travel starting point is
                         >=c){ //     larger than or equal to the current year
          for(v=c;v<=c+t;)     //      Loop from the current year to the year+number:
            if(a.contains(v++))//       If the alternator-list contains any of these years
              break e;         //        Stop the time-travel loop
          c=                   //      Set the current year to:
             (v=e.getValue())  //       The time-travel destination
             +                 //       Plus:
              (c+t             //        The current year plus the number
                  -v)          //        minus the time-travel destination
                     %(k-v);   //        Modulo the time-travel from-to distance
          continue o;}         //      And then continue the outer input-loop
      c+=t;}                   //    Increase the current year by the number 
  return p>0;}                 //  Return whether the paradox-flag is 1

Чому б не використовувати Long?
Бенджамін

1
@BenjaminUrquhart Добре запитання .. Спочатку мій Список і карта були введені в сирому вигляді, тому вони intбули коротшими, але це дало помилки з парами ключових значень карт-Введення. Не думав про те, щоб змінити все на Лонг після цього .. Дякую за -13!
Кевін Круїссен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.