Através do espaço e do tempo

10

Introdução:

Em geral, normalmente falam de quatro dimensões: três dimensões espaciais para x, ye z; e uma dimensão de tempo. Por causa deste desafio, no entanto, vamos dividir a dimensão de tempo em três bem: past, present, e future.

Entrada:

Duas listas de entrada. Uma contendo x,y,zcoordenadas inteiras e uma contendo anos inteiros.

Resultado:

Uma das quatro saídas distintas e constantes de sua própria escolha. Um para indicar a saída space; um para indicar a saída time; um para indicar a saída both space and time; e um para indicar a saída neither space nor time.

Vamos indicar que fomos para as três dimensões espaciais se as diferenças das tuplas inteiras não forem 0 para todas as três dimensões.
Indicaremos que atingimos as três dimensões temporais se houver pelo menos um ano no passado, pelo menos um ano no futuro e pelo menos um ano igual ao ano atual (portanto, no presente).

Exemplo:

Entrada:
lista de coordenadas : lista de [{5,7,2}, {5,3,8}, {-6,3,8}, {5,7,2}]
anos:[2039, 2019, 2018, 2039, 2222]

Saída:
Constante paraspace

Por quê?
As xcoordenadas são [5,5,-6,5]. Como eles não são todos iguais, passamos pela xdimensão espacial.
As ycoordenadas são [7,3,3,7]. Como eles não são todos iguais, também passamos pela ydimensão espacial.
As zcoordenadas são [2,8,8,2]. Como eles não são todos iguais, também passamos pela zdimensão espacial.
O ano atual é 2018. Não há anos antes disso, então não visitamos a pastdimensão do tempo.
Há um 2018presente na lista de anos, então visitamos a presentdimensão do tempo.
Há vários anos acima 2018( [2039, 2019, 2039, 2222]), também visitamos a futuredimensão do tempo.

Como visitamos todas as três spacedimensões, mas apenas duas das três timedimensões, a saída será apenas (a constante para) space.

Regras do desafio:

  • Você pode usar quaisquer quatro saídas distintas e constantes para os quatro estados possíveis.
  • A entrada pode estar em qualquer formato razoável. A lista de coordenadas pode ser tuplas, listas internas / matrizes de tamanho 3, seqüências de caracteres, objetos etc. A lista de anos pode ser uma lista de objetos de data em vez de números inteiros, bem como se isso beneficiaria sua contagem de bytes.
  • Você pode assumir que as x,y,zcoordenadas serão inteiras; portanto, não é necessário manipular decimais de ponto flutuante. Qualquer um dos x, y, e / ou zcoordenadas podem ser valores negativos, no entanto.
  • Você não pode levar as listas de entrada encomendadas. As listas de entrada devem estar na ordem exibida nos casos de teste.
  • Você pode assumir que todos os valores do ano estarão no intervalo [0,9999]; e você pode assumir que todas as coordenadas estão no intervalo [-9999,9999].
  • Se o seu idioma não tiver QUALQUER maneira de recuperar o ano atual, mas você ainda quiser fazer esse desafio, considere-o como uma entrada adicional e marque sua resposta como (não concorrente) .

Regras gerais:

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação.
  • As regras padrão se aplicam à sua resposta com as regras de E / S padrão , para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
  • As brechas padrão são proibidas.
  • Se possível, adicione um link com um teste para o seu código (ou seja, TIO ).
  • Além disso, é altamente recomendável adicionar uma explicação para sua resposta.

Casos de teste:

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
fonte
Com que intervalo de anos precisamos ser capazes de lidar?
Shaggy
@ Shagy Vou adicioná-lo à descrição do desafio. [0,9999]é bom (e [-9999,9999]para as coordenadas é bem assim.
Kevin Cruijssen
Dang, lá vai uma das minhas idéias!
Shaggy
@ Shaggy Por curiosidade, que faixa você estava esperando?
21718 Kevin Kevin Krijssen em
3
Podemos tomar o ano atual como insumo? (Algumas línguas não pode obter o egBF ano em curso, outros só podem fazê-lo através da avaliação de código em outro idioma - por exemplo, Jelly, outros, talvez muitos, vai encontrar este Golfier também)
Jonathan Allan

Respostas:

2

05AB1E , 15 bytes

Saída é uma lista em [space, time]que 1 representa xe 0 representano x

ø€Ë_Psžg.SÙg3Q)

Experimente online!

Explicação

    ø                 # 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
fonte
Óbvio +1 de mim. O mesmo como o 16-Byter I preparado, excepto que utilizado -.±em vez de .S(daí a um byte ..) e (par), em vez de)
Kevin Cruijssen
@KevinCruijssen: Eu realmente quero outra maneira de fazer Ùg3Q, que parece o maior ladrão de bytes, mas não tenho certeza de que seja possível: /
Emigna
Duvido que possa ser feito mais curto tbh. Posso pensar em algumas alternativas de 4 bytes e tentar fazer algo com êalguma operação bit a bit ou deltas ou algo assim, mas não consigo encontrar nenhuma alternativa de 3 bytes.
9138 Kevin Crijssen em
6

Python 2 , 111 109 bytes

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

Experimente online!

TFeld
fonte
Por que você faz de T um conjunto antes de classificar?
Coruja preta Kai
4
@BlackOwlKai Caso contrário, as duas entradas removidos por [1: -1] pode não ser no passado / futuro
Poon Levi
6

Perl 6 , 47 46 bytes

-1 byte graças a nwellnhof

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

Experimente online!

Bloco de código anônimo que pega duas listas e retorna uma tupla de booleanos, com o primeiro elemento sendo você viajando no tempo e o segundo sendo se você não viajou no espaço.

Explicação

{                                            }  # 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
Brincadeira
fonte
3

Japonês, 22 bytes

Recebe entrada como uma matriz 2D de números inteiros para as dimensões do espaço e uma matriz 1D de números inteiros para os anos. Saídas 2apenas para espaço, somente 1para tempo, 3para ambos e 0para nenhum.

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

Tente

                           :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
Shaggy
fonte
2

Japt , 25 bytes

Tenho 100% de certeza de que essa não é a melhor abordagem, ainda procurando uma maneira mais curta de fazer isso: c

Retorna uma tupla de booleanos. A primeira é se você viajou no espaço e a segunda se você viajou no tempo

[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

Experimente online!

Luis felipe De jesus Munoz
fonte
Uhm, acho que isso falhou no testcase que você forneceu no link? ( Transpõe, leva itens exclusivos, e transpõe para trás , então você provavelmente vai querer fazer Uy e_â ʦ1Ãem vez disso)
ETHproductions
Só de ver isso agora, parece que você pode ter postado antes do meu (no meu telefone, portanto, não posso dizer direito). Se assim for, deixe-me saber se você quer o meu, dadas as semelhanças e eu vou excluí-lo.
Shaggy
@ETHproductions, parece funcionar. Também âusei o emétodo na minha primeira tentativa, antes de movê-lo ypor um capricho para ver se funcionaria.
Shaggy
@ Shaggy Bem, eu vou ser amaldiçoado, ele realmente funciona ... mas por que não transpõe de volta neste caso?
ETHproductions
11
@ Shaggy Oh, meu Deus, o código que verifica se deve transpor novamente verifica se todos qos vetores na matriz transposta mapeada typeof q instanceof Array... que bug conveniente: P Acho que não posso corrigi-lo agora até liberar o 1.4.6 ...
ETHproductions
2

JavaScript (ES6), 104 100 bytes

(space)(time)1 1230 0 .

24% do código é gasto para descobrir em que ano estamos ... \ 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)

Experimente online!

Comentado

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
fonte
Falha ao ligarconsole.log(f([[5,4,2], [3,4,0], [1,4,2], [9,4,4]])([2020])) // neither
l4m2 12/11/18
@ l4m2 Hmm. Corrigido ao custo de 1 byte. Não consigo pensar em uma solução de 99 bytes em cima da minha cabeça.
Arnauld
1

R , 106 , 105 bytes

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

Experimente online!

Entrada :

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

Emita um valor inteiro igual a:

 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
fonte
1

Lote, 353 bytes

@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

Nota: Como vírgulas são separadores de argumentos no Lote, para inserir as coordenadas do espaço, é necessário citar, por exemplo,

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

Explicação:

@echo off

Desligue a saída indesejada.

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

Configure duas máscaras de bits e também extraia o ano atual. (Nos locais AAAA-MM-DD, use %date:~,4%a mesma contagem de bytes.)

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

Repita todos os argumentos. As ~causas valores de coordenadas de ser dividido em parâmetros separados.

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

Verifique se as máscaras de bits estão totalmente definidas e produza o resultado apropriado.

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

Veja se este é um par de coordenadas ou uma coordenada e um ano.

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

Se for uma coordenada, atualize a máscara de bits do espaço de acordo com a dimensão espacial relevante que foi visitada.

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

Se for um ano, atualize a máscara de tempo de acordo com a dimensão de tempo relevante que foi visitada.

Neil
fonte
1

Java 10, 154 bytes

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

Retorna 1para espaço , 2para tempo , 3para ambos , 0para nenhum . Experimente online aqui .

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
}
OOBalance
fonte