Attraverso lo spazio e il tempo


10

Introduzione:

In generale si parla di solito quattro dimensioni: tre dimensioni spaziali per x, ye z; e una dimensione temporale. Per il bene di questa sfida però, ci divideremo la dimensione temporale in tre così: past, present, e future.

Ingresso:

Due liste di input. Uno contenente x,y,zcoordinate intere e uno contenente anni interi.

Produzione:

Una delle quattro uscite distinte e costanti di tua scelta. Uno per indicare l'uscita space; uno per indicare l'uscita time; uno per indicare l'uscita both space and time; e uno per indicare l'output neither space nor time.

Indicheremo che siamo andati a tutte e tre le dimensioni dello spazio se le differenze delle tuple intere non sono 0 per tutte e tre le dimensioni.
Indicheremo che siamo passati a tutte e tre le dimensioni temporali se c'è almeno un anno in passato, almeno un anno in futuro e almeno un anno uguale all'anno in corso (quindi nel presente).

Esempio:

Input:
Elenco coordinate : Elenco [{5,7,2}, {5,3,8}, {-6,3,8}, {5,7,2}]
anni:[2039, 2019, 2018, 2039, 2222]

Uscita:
costante perspace

Perché?
Le xcoordinate sono [5,5,-6,5]. Dal momento che non sono tutti uguali, abbiamo attraversato la xdimensione dello spazio.
Le ycoordinate sono [7,3,3,7]. Dal momento che non sono tutti uguali, abbiamo anche attraversato la ydimensione dello spazio.
Le zcoordinate sono [2,8,8,2]. Dal momento che non sono tutti uguali, abbiamo anche attraversato la zdimensione dello spazio.
L'anno corrente è 2018. Non ci sono anni prima, quindi non abbiamo visitato la pastdimensione temporale.
C'è un 2018regalo nella lista degli anni, quindi abbiamo visitato la presentdimensione temporale.
Sono trascorsi più anni 2018( [2039, 2019, 2039, 2222]), quindi abbiamo anche visitato la futuredimensione temporale.

Dal momento che abbiamo visitato tutte e tre le spacedimensioni, ma solo due delle tre timedimensioni, l'output sarà solo (la costante per) space.

Regole della sfida:

  • È possibile utilizzare quattro uscite distinte e costanti per i quattro stati possibili.
  • L'input può essere in qualsiasi formato ragionevole. L'elenco delle coordinate può essere tuple, elenchi interni / matrici di dimensione 3, stringhe, oggetti, ecc. L'elenco degli anni può essere un elenco di oggetti data anziché numeri interi se ciò andrebbe a vantaggio del conteggio dei byte.
  • Puoi presumere che le x,y,zcoordinate saranno numeri interi, quindi non è necessario gestire i decimali in virgola mobile. Qualsiasi del x, y, e / o zcoordinate possono essere valori negativi, però.
  • Non è possibile prendere le liste di input preordinate. Gli elenchi di input devono essere nell'ordine visualizzato nei casi di test.
  • Puoi presumere che tutti i valori dell'anno saranno compresi nell'intervallo [0,9999]; e puoi supporre che tutte le coordinate siano nell'intervallo [-9999,9999].
  • Se la tua lingua non ha NESSUN modo di recuperare l'anno in corso, ma ti piacerebbe comunque fare questa sfida, puoi prenderla come input aggiuntivo e contrassegnare la tua risposta come (non competitiva) .

Regole generali:

  • Questo è , quindi vince la risposta più breve in byte.
    Non lasciare che le lingue di code-golf ti scoraggino dal pubblicare risposte con lingue non codegolfing. Prova a trovare una risposta il più breve possibile per "qualsiasi" linguaggio di programmazione.
  • Le regole standard si applicano alla tua risposta con le regole I / O predefinite , quindi puoi utilizzare STDIN / STDOUT, funzioni / metodo con i parametri corretti e tipo di ritorno, programmi completi. La tua chiamata.
  • Le scappatoie predefinite sono vietate.
  • Se possibile, aggiungi un link con un test per il tuo codice (ad es. TIO ).
  • Inoltre, si consiglia vivamente di aggiungere una spiegazione per la risposta.

Casi test:

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

Di quali anni abbiamo bisogno per essere in grado di gestire?
Shaggy,

@Shaggy Lo aggiungerò alla descrizione della sfida. [0,9999]va bene (e anche [-9999,9999]per le coordinate va bene.
Kevin Cruijssen

Dang, ecco una delle mie idee!
Shaggy,

@Shaggy Per curiosità, che gamma speravi?
Kevin Cruijssen,

3
Possiamo considerare l'anno in corso come input? (Alcune lingue non riescono a ottenere l'anno in corso, ad esempio BF, altre possono farlo solo valutando il codice in un'altra lingua - ad esempio Jelly; altre, forse molte, troveranno anche questo golfista)
Jonathan Allan,

Risposte:


2

05AB1E , 15 byte

L'output è un elenco in [space, time]cui 1 sta per xe 0 sta perno x

ø€Ë_Psžg.SÙg3Q)

Provalo online!

Spiegazione

    ø                 # 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 evidente da parte mia. Lo stesso del 16-byte che ho preparato, tranne che ho usato -.±invece di .S(quindi il +1 byte ..) e (coppia) invece di)
Kevin Cruijssen

@KevinCruijssen: Voglio davvero un altro modo di fare Ùg3Q, che sembra il più grande ladro di byte, ma non sono sicuro che sia possibile: /
Emigna

Dubito che si possa fare in breve. Mi vengono in mente alcune alternative a 4 byte e ho provato a fare qualcosa con êqualche operazione bit a bit o delta o qualcosa del genere, ma non riesco a trovare alcuna alternativa a 3 byte.
Kevin Cruijssen,

6

Python 2 , 111 109 byte

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

Provalo online!


Perché fai un set T prima di ordinare?
Black Owl Kai,

4
@BlackOwlKai Altrimenti le due voci rimosse da [1: -1] potrebbero non essere nel passato / futuro
Poon Levi

6

Perl 6 , 47 46 byte

-1 byte grazie a nwellnhof

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

Provalo online!

Blocco di codice anonimo che accetta due elenchi e restituisce una tupla di valori booleani, con il primo elemento che indica se hai viaggiato nel tempo e il secondo è se non hai viaggiato nello spazio.

Spiegazione

{                                            }  # 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 byte

Accetta input come una matrice 2D di numeri interi per le dimensioni dello spazio e una matrice 1D di numeri interi per gli anni. Output 2solo per lo spazio, solo 1per il tempo, 3per entrambi e 0per nessuno dei due.

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

Provalo

                           :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 byte

Sono sicuro al 100% che questo non è l'approccio migliore, sto ancora cercando un modo più breve per farlo: c

Restituisce una tupla di booleani. Il primo è se hai viaggiato nello spazio e il secondo se hai viaggiato nel 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

Provalo online!


Uhm, penso che questo fallisca nel testcase che hai fornito nel link? ( traspone, prende oggetti unici e traspone indietro , quindi probabilmente vorrai farlo Uy e_â ʦ1Ã)
ETHproductions

Vedendolo solo ora, sembra che tu possa averlo pubblicato prima del mio (sul mio telefono, quindi non posso dirlo correttamente). Se è così, fammi sapere se vuoi che il mio abbia le somiglianze e lo cancellerò.
Shaggy,

@ETHproductions, sembra funzionare. Ho avuto anche âil emetodo al mio primo tentativo, prima di spostarlo per yun capriccio per vedere se avrebbe funzionato.
Shaggy,

@Shaggy Beh, sarò dannato, in realtà funziona ... ma perché non traspone in questo caso?
ETHproductions

1
@Shaggy Oh, caro, il codice che controlla se trasporlo indietro controlla se per ogni qnell'array trasposto mappato, typeof q instanceof Array... che bug conveniente: P Immagino che non posso risolverlo ora fino al rilascio di 1.4.6 ...
ETHproductions

2

JavaScript (ES6), 104 100 byte

(space)(time)1230

Il 24% del codice viene speso per capire in quale anno siamo ... \ 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)

Provalo online!

Commentate

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 Hmm. Risolto al costo di 1 byte. Non riesco a pensare a una soluzione a 99 byte dalla parte superiore della mia testa.
Arnauld,

1

R , 106 , 105 byte

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

Provalo online!

Input:

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

Emette un valore intero pari 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

Lotto, 353 byte

@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: poiché le virgole sono separatori di argomenti in Batch, per inserire le coordinate dello spazio è necessario citare quindi ad es

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

explantion:

@echo off

Disattiva l'uscita indesiderata.

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

Imposta due maschere di bit ed estrai anche l'anno corrente. (In AAAA-MM-GG le localizzazioni usano %date:~,4%per lo stesso numero di byte.)

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

Ripassa tutti gli argomenti. I ~valori delle coordinate vengono suddivisi in parametri separati.

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

Controlla se le maschere di bit sono completamente impostate e genera il risultato appropriato.

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

Verifica se si tratta di una coppia di coordinate o una coordinata e un anno.

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

Se è una coordinata, aggiorna la maschera di bit spaziale a seconda che sia stata visitata la dimensione spaziale rilevante.

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

Se è un anno, aggiorna la maschera di bit temporale a seconda che sia stata visitata la dimensione temporale rilevante.


1

Java 10, 154 byte

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

Restituisce 1per spazio , 2per tempo , 3per entrambi , 0per nessuno dei due . Provalo online qui .

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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.