Сквозь пространство и время


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

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

6

Python 2 , 111 109 байт

lambda S,T:(min(map(len,map(set,zip(*S))))>1,date.today().year in sorted(set(T))[1:-1])
from datetime import*

Попробуйте онлайн!


Почему вы делаете набор перед сортировкой?
Чёрная Сова Кай

4
@BlackOwlKai В противном случае две записи, удаленные с помощью [1: -1], могут не быть в прошлом / будущем
Poon Levi

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 байта

Вводит в виде двумерного массива целых чисел для пространственных измерений и одномерного массива целых чисел за годы. Выходы 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()

Fail onconsole.log(f([[5,4,2], [3,4,0], [1,4,2], [9,4,4]])([2020])) // neither
l4m2

@ l4m2 Хм. Исправлено по стоимости 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

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

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

Explantion:

@echo off

Отключить нежелательный вывод.

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

Установите две битовые маски, а также извлеките текущий год. (В локалях ГГГГ-ММ-ДД используется %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 для одного . Попробуйте это онлайн здесь .

Ungolfed:

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.