Через простір і час


10

Вступ:

Загалом , ми зазвичай говоримо про чотири вимірах: три виміри простору для x, yі z; і один часовий вимір. Заради цього завдання однак, ми розділимо часу вимірювання в трьох , а також: past, present, і future.

Вхід:

Два вхідні списки. Один, що містить цілі x,y,zкоординати, і один, що містить цілі роки.

Вихід:

Один із будь-яких чотирьох чітких та постійних результатів на ваш власний вибір. Один для позначення виходу space; один для позначення виходу time; один для позначення виходу both space and time; і один, щоб вказати вихід neither space nor time.

Ми вкажемо, що ми перейшли до всіх трьох розмірів простору, якщо відмінності цілих чисел-кортежів не дорівнюють 0 для всіх трьох вимірів.
Ми вкажемо, що ми перейшли до всіх трьох часових вимірів, якщо в минулому є принаймні один рік, принаймні один рік у майбутньому і принаймні один рік, що дорівнює поточному року (так у теперішньому).

Приклад:

Введення: Список
координат: [{5,7,2}, {5,3,8}, {-6,3,8}, {5,7,2}]
Список років:[2039, 2019, 2018, 2039, 2222]

Вихід:
Постійний дляspace

Чому?
Ці xкоординати [5,5,-6,5]. Оскільки вони не однакові, ми пройшли xкосмічний вимір.
Ці yкоординати [7,3,3,7]. Оскільки вони не однакові, ми також пройшли yкосмічний вимір.
Ці zкоординати [2,8,8,2]. Оскільки вони не однакові, ми також пройшли zкосмічний вимір.
Поточний рік є 2018. До цього немає років, тому ми не відвідували pastчасовий вимір.
У списку року 2018присутній подарунок, тому ми відвідали presentчасовий вимір.
Є кілька років вище 2018( [2039, 2019, 2039, 2222]), тому ми також відвідали futureчасовий вимір.

Оскільки ми відвідали всі три spaceвиміри, але лише два з трьох timeвимірів, вихід буде лише (константа для) space.

Правила виклику:

  • Ви можете використовувати будь-які чотири чіткі та постійні виходи для чотирьох можливих станів.
  • Введення може бути в будь-якому розумному форматі. Список координат може бути кортежами, внутрішніми списками / масивами розміром 3, рядками, об’єктами тощо. Список років може бути списком об’єктів дати замість цілих чисел, а також, якщо це принесе користь вашому рахунку байтів.
  • Ви можете припустити, що x,y,zкоординати будуть цілими числами, тому не потрібно обробляти десятки з плаваючою комою. Будь-який з x, yі / або zкоординат можуть бути негативними значеннями, хоча.
  • Ви не можете приймати попередньо замовлені списки вхідних даних. Списки введення повинні бути в порядку, відображеному в тестових випадках.
  • Ви можете припустити, що значення року будуть в діапазоні [0,9999]; і ви можете припустити, що всі координати знаходяться в діапазоні [-9999,9999].
  • Якщо у вашій мові немає жодного способу отримання поточного року, але ви все ще хочете зробити це завдання, ви можете взяти це як додатковий внесок і позначити свою відповідь як (неконкурентна) .

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам з кодовим гольфом відштовхувати вас від публікації відповідей з мов, що не кодують гольф. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Для вашої відповіді застосовуються стандартні правила з правилами вводу / виводу за замовчуванням , тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу повернення. Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду (тобто TIO ).
  • Також настійно рекомендується додавати пояснення до своєї відповіді.

Тестові приклади:

Coordinates-input: [{5,7,2}, {5,3,8}, {-6,3,8}, {5,7,2}]
Years-input:       [2039, 2019, 2018, 2039, 2222]
Output:            space

Coordinates-input: [{0,0,0}, {-4,-4,0}, {-4,2,0}]
Years-input:       [2016, 2019, 2018, 2000]
Output:            time

Coordinates-input: [{-2,-2,-2}, {-3,-3,-3}]
Years-input:       [2020, 1991, 2014, 2018]
Output:            both

Coordinates-input: [{5,4,2}, {3,4,0}, {1,4,2}, {9,4,4}]
Years-input:       [2020, 1991, 2014, 2017, 2019, 1850]
Output:            neither

Який діапазон років нам потрібен, щоб мати можливість впоратися?
Кудлатий

@Shaggy Я додам це до опису виклику. [0,9999]добре (і [-9999,9999]для координат це також добре.
Кевін Круїссен

Данг, там іде одна з моїх ідей!
Кудлатий

@Shaggy З цікавості, на який діапазон ви сподівалися?
Кевін Кройсейсен

3
Чи можемо ми взяти поточний рік як внесок? (Деякі мови не можуть отримати поточний рік, наприклад, BF, інші можуть зробити це, лише оцінивши код іншою мовою - наприклад, Jelly; інші, можливо, багато, знайдуть і цього гольфіста)
Джонатан Аллан

Відповіді:


2

05AB1E , 15 байт

Вихідні дані - це список, [space, time]де позначається 1,x а 0 - дляno x

ø€Ë_Psžg.SÙg3Q)

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

Пояснення

    ø                 # zip space coordinates
     €Ë               # for each axis, check that all values are equal
       _              # logical negation
        P             # product (1 for space, 0 for no space)
         s            # put the time list on top of the stack
          žg.S        # compare each with the current year
              Ù       # remove duplicates
               g3Q    # check if the length is 3
                  )   # wrap the space and time values in a list

Очевидний +1 від мене. Те саме, що я підготував 16-байтний, за винятком того, що я використав -.±замість .S(звідси +1 байт ..) і (пара) замість)
Кевін Круїссен

@KevinCruijssen: Я дуже хочу інший спосіб Ùg3Q, який вважається найбільшим злодієм байтів, але я не впевнений, що це можливо: /
Emigna

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


6

Perl 6 , 47 46 байт

-1 байт завдяки nwellnhof

{Set(@^b X<=>Date.today.year)>2,max [Z==] @^a}

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

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

Пояснення

{                                            }  # Anonymous code block
     @^b X         # Map each element of the year list to:
          <=>      # Whether it is smaller, equal or larger than
             Date.today.year  # The current year
 Set(                       )    # Get the unique values
                             >2  # Is the length larger than 2?
                               ,
                                    [Z  ] @^a   # Reduce by zipping the lists together
                                max       # And return if any of them are
                                      ==  # All equal

3

Japt, 22 байти

Приймає введення як 2D-масив цілих чисел для розмірів простору та 1D-масив цілих чисел для років. Виходи 2лише для простору, лише 1для часу, і 3для обох, і 0для жодного.

yâ mÊeÉ Ñ+!Jõ kVmgKi¹Ê

Спробуй це

                           :Implicit input of 2D-array U=space and array V=time
y                          :Transpose U
 â                         :Deduplicate columns
   m                       :Map
    Ê                      :  Lengths
     e                     :All truthy (not 0) when
      É                    :  1 is subtracted
        Ñ                  :Multiply by 2
           J               :-1
            õ              :Range [-1,1]
              k            :Remove all the elements present in
               Vm          :  Map V
                 g         :    Signs of difference with
                  Ki       :    The current year
                    ¹      :End removal
                     Ê     :Length
         +!                :Negate and add first result

2

Japt , 25 байт

Я на 100% впевнений, що це не найкращий підхід, і все ж шукаю коротший спосіб зробити це: c

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

[Uyâ e_ʦ1ÃV®-Ki)gÃâ Ê¥3]

[Uyâ e_ʦ1ÃV®-Ki)gÃâ Ê¥3]   Full Program, U = Space, V = Time
                            -- U = [[-2,-2,-2], [-3,-3,-3]]
                            -- V = [2020, 1991, 2014, 2018]
[                       ]   Return array containing....
 Uyâ                        Transpose Space coords 
                            -- U = [[-2,-3], [-2,-3], [-2,-3]]
                            and map Z   
      _ʦ1                  Z length greater than 1?
                            -- U = [true, true, true]
     e                      return true if all Z are true   
                            -- U = true
          V®                Map each time
            -Ki)            Subtract current year   
                            -- V = [2,-27,-4,0]
                gà         get sign (-1,0,1)
                            -- V = [1,-1,-1,0]
                   â        unique elements
                            -- V = [1,-1,0]
                     ʥ3    return true if length == 3
                            -- V = true

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


Гм, я думаю, це не вдається на тестовій виставці, яку ви вказали за посиланням? ( транспортує, приймає унікальні предмети та переносить назад , тому ви, ймовірно, захочете зробити це Uy e_â ʦ1Ãзамість)
ETHproductions

Тільки бачачи це зараз, схоже, ви, можливо, опублікували його до мого (на моєму телефоні, тому не можу сказати належним чином). Якщо це так, дайте мені знати, якщо ви хочете, щоб мої були подібні, і я видалю його.
Кудлатий

@ETHproductions, здається, працює. Я також âвикористовував eметод у своїй першій спробі, перш ніж перенести його yна примху, щоб побачити, чи він спрацює.
Кудлатий

@Shaggy Добре, що я буду проклятий, він насправді спрацьовує ... але чому він не переводить його в цьому випадку?
ETHproductions

1
@Shaggy О, шановний, код, який перевіряє, чи слід його повернути назад, перевіряє, чи не для кожного qв картографованому транспонованому масиві typeof q instanceof Array... яка зручна помилка: P Здогадайтесь, я не можу це виправити зараз до випуску 1.4.6 ...
ETHproductions

2

JavaScript (ES6), 104 100 байт

(space)(time)1230

24% коду витрачається на з'ясування того, у якому році ми ... \ o /

s=>t=>2*s[0].every((x,i)=>s.some(b=>x-b[i]))|t.some(y=>(s|=(y/=(new Date).getFullYear())>1?4:y+1)>6)

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

Прокоментував

s => t =>              // s[] = space array; t[] = time array
  2 *                  // the space flag will be doubled
  s[0].every((x, i) => // for each coordinate x at position i in the first entry of s[]:
    s.some(b =>        //   for each entry b in s[]:
      x - b[i]         //     if we've found b such that b[i] != x, the coordinate is valid
    )                  //   end of some()
  )                    // end of every()
  |                    // bitwise OR with the time flag
  t.some(y =>          // for each year y in t[]:
    (s |=              //   update the bitmask s (initially an array, coerced to 0)
      ( y /=           //     divide y
        (new Date)     //     by the current year (this is safe as long as no time-travel
        .getFullYear() //     machine is available to run this it at year 0)
      ) > 1 ?          //   if the result is greater than 1:
        4              //     do s |= 4 (future)
      :                //   else:
        y + 1          //     do s |= y + 1; y + 1 = 2 if both years were equal (present)
                       //     otherwise: y + 1 is in [1, 2), which is rounded to 1 (past)
    ) > 6              //   set the time flag if s = 7
  )                    // end of some()

Збійconsole.log(f([[5,4,2], [3,4,0], [1,4,2], [9,4,4]])([2020])) // neither
l4m2

@ l4m2 Hмм. Фіксується вартістю 1 байт. Я не можу придумати 99-байтне рішення у верхній частині голови.
Арнольд

1

R , 106 , 105 байт

function(s,t)all((x<-apply(s,1,range))[1,]-x[2,])-2*all((-1:1)%in%sign(as.POSIXlt(Sys.Date())$ye+1900-t))

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

Вхід:

s : matrix of space coordinates (3 x N)
t : vector time years 

Виведіть ціле значення, яке дорівнює:

 1 : if traveled through space only
-2 : if traveled through time only
-1 : if traveled through space and time
 0 : if traveled neither through space nor time

1

Пакетна, 353 байти

@echo off
set/as=t=0,y=%date:~-4%
for %%a in (%*) do call:c %~1 %%~a
if %s%==7 (if %t%==7 (echo both)else echo space)else if %t%==7 (echo time)else echo neither
exit/b
:c
if "%6"=="" goto g
if %1 neq %4 set/as^|=1
if %2 neq %5 set/as^|=2
if %3 neq %6 set/as^|=4
exit/b
:g
if %4 lss %y% (set/at^|=1)else if %4==%y% (set/at^|=2)else set/at^|=4

Примітка. Оскільки коми є роздільниками аргументів у Batch, для введення координат простору вам потрібно навести цитати, наприклад

spacetime "5,7,2" "5,3,8" "-6,3,8" "5,7,2" 2000 2002

Пояснення:

@echo off

Вимкніть небажаний вихід.

set/as=t=0,y=%date:~-4%

Створіть дві бітові маски, а також витягніть поточний рік. (У YYYY-MM-DD локалі використовують %date:~,4%для одного і того ж числа байтів.)

for %%a in (%*) do call:c %~1 %%~a

Проведіть петлю над усіма аргументами. У ~причинах значення координат повинні бути розділені на окремі параметри.

if %s%==7 (if %t%==7 (echo both)else echo space)else if %t%==7 (echo time)else echo neither
exit/b

Перевірте, чи повністю встановлені бітові маски та видайте відповідний результат.

:c
if "%6"=="" goto g

Подивіться, чи це пара координат чи координата і рік.

if %1 neq %4 set/as^|=1
if %2 neq %5 set/as^|=2
if %3 neq %6 set/as^|=4
exit/b

Якщо це координата, то оновіть космічну бітову маску відповідно до того, чи був відвіданий відповідний просторовий вимір.

:g
if %4 lss %y% (set/at^|=1)else if %4==%y% (set/at^|=2)else set/at^|=4

Якщо це рік, то оновіть маску часу відповідно до того, чи був відвіданий відповідний часовий вимір.


1

Java 10, 154 байти

s->t->{int y=java.time.Year.now().getValue(),c=0,d=1,i=3;for(;i-->0;d*=c,c=0)for(var l:s)c=l[i]!=s[0][i]?1:c;for(int a:t)c|=a>y?4:a<y?1:2;return c/7*2+d;}

Повертає 1для простору , 2для часу , 3для обох , 0для ні . Спробуйте його онлайн тут .

Безголівки:

s -> t -> { // lambda taking two parameters in currying syntax
            // s is int[][], t is int[]; return type is int

    int y = java.time.Year.now().getValue(), // the current year
        c = 0, // auxiliary variable used for determining both space and time
        d = 1, // initally, assume we have moved in all three space dimensions
        i = 3; // for iterating over the three space dimensions

    for(; i -- > 0; d *= c, c = 0) // check all coordinates for each dimension, if we have not moved in one of them, d will be 0
        for(var l : s) // check the whole list:
            c = l[i] != s[0][i] ? 1 : c; // if one coordinate differs from the first, we have moved

    for(int a : t) // look at all the years; c is 0 again after the last loop
        c |= a > y ? 4 : a < y ? 1 : 2; // compare to the current year, setting a different bit respectively for past, present and future

    return c / 7 // if we have been to past, the present and the future ...
           * 2   // ... return 2 ...
           + d;  // ... combined with the space result, otherwise return just the space result
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.