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

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

Ó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!


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

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

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!


Uhm, acho que isso falhou no testcase que você forneceu no link? ( yâ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()

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

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.


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
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.