W przestrzeni i czasie

10

Wprowadzenie:

Generalnie zazwyczaj mówią o czterech wymiarach: trzy wymiary przestrzeni dla x, yoraz z; i jeden wymiar czasowy. Przez wzgląd na to wyzwanie, jednak my podzielić na trzy wymiar czasu także: past, present, i future.

Wejście:

Dwie listy wejściowe. Jedna zawiera x,y,zwspółrzędne całkowite , a druga zawiera lata całkowite.

Wynik:

Jedno z czterech dowolnych i stałych wyników według własnego wyboru. Jeden do wskazania wyniku space; jeden do wskazania wyniku time; jeden do wskazania wyniku both space and time; i jeden do wskazania wyniku neither space nor time.

Wskażemy, że poszliśmy do wszystkich trzech wymiarów przestrzeni, jeśli różnice liczb całkowitych nie są równe 0 dla wszystkich trzech wymiarów.
Wskażemy, że poszliśmy do wszystkich trzech wymiarów czasowych, jeśli minął co najmniej jeden rok w przeszłości, co najmniej jeden rok w przyszłości i co najmniej jeden rok równy bieżącemu rokowi (tak jak obecnie).

Przykład:

Dane wejściowe:
lista współrzędnych: lista [{5,7,2}, {5,3,8}, {-6,3,8}, {5,7,2}]
lat:[2039, 2019, 2018, 2039, 2222]

Wyjście:
Stała dlaspace

Dlaczego?
Te xwspółrzędne są [5,5,-6,5]. Ponieważ nie wszystkie są takie same, przeszliśmy przez xwymiar kosmiczny.
Te ywspółrzędne są [7,3,3,7]. Ponieważ nie wszystkie są takie same, przeszliśmy również przez ywymiar kosmiczny.
Te zwspółrzędne są [2,8,8,2]. Ponieważ nie wszystkie są takie same, przeszliśmy również przez zwymiar kosmiczny.
Obecny rok to 2018. Nie ma lat wcześniej, więc nie odwiedziliśmy pastwymiaru czasu.
Na 2018liście rocznej jest prezent, więc odwiedziliśmy presentwymiar czasowy.
Istnieje wiele lat powyżej 2018( [2039, 2019, 2039, 2222]), więc odwiedziliśmy również futurewymiar czasu.

Ponieważ odwiedziliśmy wszystkie trzy spacewymiary, ale tylko dwa z trzech timewymiarów, wynikiem będzie tylko (stała dla) space.

Zasady konkursu:

  • Możesz użyć dowolnych czterech różnych i stałych wyników dla czterech możliwych stanów.
  • Dane wejściowe mogą mieć dowolny rozsądny format. Lista współrzędnych może być krotkami, wewnętrznymi listami / tablicami o rozmiarze 3, łańcuchami, obiektami itp. Lista lat może być listą obiektów daty zamiast liczb całkowitych, jeśli przydałaby się twoja liczba bajtów.
  • Możesz założyć, że x,y,zwspółrzędne będą liczbami całkowitymi, więc nie musisz obsługiwać miejsc po przecinku. Którekolwiek z x, yi / lub zwspółrzędne mogą być ujemne, choć.
  • Nie można pobrać list wejściowych w przedsprzedaży. Listy wejściowe powinny być w kolejności wyświetlanej w przypadkach testowych.
  • Możesz założyć, że wszystkie wartości roku będą w zakresie [0,9999]; i możesz założyć, że wszystkie współrzędne są w zakresie [-9999,9999].
  • Jeśli twój język nie ma ŻADNEGO sposobu na odzyskanie bieżącego roku, ale nadal chcesz wykonać to wyzwanie, możesz wziąć to jako dodatkowy wkład i oznaczyć swoją odpowiedź jako (niekonkurującą) .

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki kod-golfowe zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły z domyślnymi regułami We / Wy , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i typem zwracanych, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem kodu (tj. TIO ).
  • Zalecane jest również dodanie wyjaśnienia do odpowiedzi.

Przypadki testowe:

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
Kevin Cruijssen
źródło
Jakiego zakresu lat potrzebujemy, aby sobie poradzić?
Kudłaty
@Shaggy dodam go do opisu wyzwania. [0,9999]jest w porządku (i [-9999,9999]dla współrzędnych też jest w porządku.
Kevin Cruijssen
Dang, idzie jeden z moich pomysłów!
Kudłaty
@Shaggy Z ciekawości, na jaki zakres liczyłeś?
Kevin Cruijssen
3
Czy możemy wziąć bieżący rok jako wkład? (Niektóre języki nie mogą uzyskać bieżącego roku egBF, inne mogą to zrobić tylko poprzez ocenę kodu w innym języku - np. Jelly; inne, być może wiele, również znajdzie tego golfa)
Jonathan Allan

Odpowiedzi:

2

05AB1E , 15 bajtów

Dane wyjściowe to lista, w [space, time]której 1 oznacza, xa 0 oznaczano x

ø€Ë_Psžg.SÙg3Q)

Wypróbuj online!

Wyjaśnienie

    ø                 # 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
Emigna
źródło
Oczywiste +1 ode mnie. Tak samo jak 16-bajtowy, który przygotowałem, tyle że użyłem -.±zamiast .S(stąd +1 bajt ..) i (parę) zamiast)
Kevin Cruijssen
@KevinCruijssen: Naprawdę chcę zrobić inny sposób Ùg3Q, który wydaje mi się największym złodziejem bajtów, ale nie jestem pewien, czy to możliwe: /
Emigna,
Wątpię, że da się to zrobić krócej. Mogę wymyślić kilka 4-bajtowych alternatyw i próbowałem coś zrobić z êoperacją bitową, deltami lub czymś innym, ale nie jestem w stanie znaleźć żadnej 3-bajtowej alternatywy.
Kevin Cruijssen
6

Python 2 , 111 109 bajtów

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

Wypróbuj online!

TFeld
źródło
Dlaczego tworzysz zestaw T przed sortowaniem?
Black Owl Kai
4
@BlackOwlKai W przeciwnym razie dwa wpisy usunięte przez [1: -1] mogą nie być w przeszłości / przyszłości
Poon Levi
6

Perl 6 , 47 46 bajtów

-1 bajt dzięki nwellnhof

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

Wypróbuj online!

Anonimowy blok kodu, który pobiera dwie listy i zwraca krotkę booleanów, z których pierwszym jest to, czy podróżowałeś w czasie, a drugim - czy nie podróżowałeś w przestrzeni.

Wyjaśnienie

{                                            }  # 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
Jo King
źródło
3

Japt, 22 bajty

Pobiera dane wejściowe jako tablicę liczb całkowitych 2D dla wymiarów przestrzeni i tablicę liczb całkowitych 1D na lata. Dane wyjściowe 2tylko dla przestrzeni, tylko 1dla czasu, 3dla obu i 0dla żadnego.

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

Spróbuj

                           :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
Kudłaty
źródło
2

Japt , 25 bajtów

Jestem w 100% pewien, że nie jest to najlepsze podejście, wciąż szukam krótszego sposobu na zrobienie tego: c

Zwraca krotkę booleanów. Pierwszy dotyczy podróży w kosmosie, a drugi podróży w czasie

[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

Wypróbuj online!

Luis Felipe De Jesus Munoz
źródło
Uhm, myślę, że to się nie powiedzie w przypadku testu podanego w linku? ( transponuje, bierze unikatowe przedmioty i transponuje z powrotem , więc prawdopodobnie będziesz chciał to zrobić Uy e_â ʦ1Ã)
ETHproductions
Widząc to teraz, wygląda na to, że mogłeś to opublikować przed moim (na moim telefonie, więc nie mogę poprawnie powiedzieć). Jeśli tak, daj mi znać, jeśli chcesz moje ze względu na podobieństwa, a ja je usunę.
Kudłaty
@ETHproductions, wydaje się, że działa. Miałem âw emetodzie na mojej pierwszej próbie, też, przed przeniesieniem go yna kaprys, aby zobaczyć, gdyby to działało.
Kudłaty
@ Shaggy Cóż, zostanę przeklęty, to faktycznie działa ... ale dlaczego nie transponuje się z powrotem w tym przypadku?
ETHprodukcje
1
@ Shaggy Ojej, kod, który sprawdza, czy przenieść go z powrotem, sprawdza, czy dla każdego qz mapowanych transponowanych macierzy typeof q instanceof Array... co za wygodny błąd: P Chyba nie mogę go teraz naprawić, dopóki nie wypuszczę 1.4.6 ...
ETHprodukcje
2

JavaScript (ES6), 104 100 bajtów

(space)(time)12)3)0

24% kodu wydaje się na ustalenie, w którym roku jesteśmy ... \ 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)

Wypróbuj online!

Skomentował

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()
Arnauld
źródło
Fail onconsole.log(f([[5,4,2], [3,4,0], [1,4,2], [9,4,4]])([2020])) // neither
l4m2,
@ l4m2 Hmm. Naprawiono kosztem 1 bajtu. Nie mogę wymyślić 99-bajtowego rozwiązania z mojej głowy.
Arnauld,
1

R , 106 , 105 bajtów

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

Wypróbuj online!

Wejście :

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

Podaj wartość całkowitą równą:

 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
digEmAll
źródło
1

Partia, 353 bajtów

@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

Uwaga: Ponieważ przecinki są separatorami argumentów w pakiecie, w celu wprowadzenia współrzędnych przestrzeni należy podać np

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

Wyjaśnienie:

@echo off

Wyłącz niechciane wyjście.

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

Skonfiguruj dwie maski bitowe, a także wyodrębnij bieżący rok. (W ustawieniach regionalnych RRRR-MM-DD należy używać %date:~,4%tej samej liczby bajtów.)

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

Pętla nad wszystkimi argumentami. Do ~przyczyn wartości współrzędnych być podzielone na oddzielne parametry.

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

Sprawdź, czy maski bitowe są w pełni ustawione, i wyślij odpowiedni wynik.

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

Sprawdź, czy jest to para współrzędnych, czy współrzędna i rok.

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

Jeśli jest to współrzędna, zaktualizuj maskę bitową przestrzeni zgodnie z tym, czy odwiedzono odpowiedni wymiar przestrzenny.

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

Jeśli to rok, zaktualizuj maskę bitową zgodnie z tym, czy odwiedzono odpowiedni wymiar czasu.

Neil
źródło
1

Java 10, 154 bajtów

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;}

Zwraca 1za przestrzeń , 2za czas , 3za obie , 0za żadną . Wypróbuj online tutaj .

Nie golfowany:

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
}
OOBalance
źródło