Melalui Ruang dan Waktu

10

Pengantar:

Secara umum biasanya kita berbicara tentang empat dimensi: tiga dimensi ruang untuk x, ydan z; dan satu dimensi waktu. Demi tantangan ini namun, kami akan membagi dimensi waktu menjadi tiga juga: past, present, dan future.

Memasukkan:

Dua daftar masukan. Satu berisi bilangan bulat x,y,zkoordinat, dan satu berisi bilangan bulat tahun.

Keluaran:

Satu dari empat keluaran berbeda dan konstan pilihan Anda sendiri. Satu untuk menunjukkan output space; satu untuk menunjukkan output time; satu untuk menunjukkan output both space and time; dan satu untuk menunjukkan output neither space nor time.

Kami akan menunjukkan kami pergi ke ketiga dimensi ruang jika perbedaan bilangan bulat-tupel bukan 0 untuk ketiga dimensi.
Kami akan menunjukkan bahwa kami pergi ke ketiga dimensi waktu jika setidaknya ada satu tahun di masa lalu, setidaknya satu tahun di masa depan, dan setidaknya satu tahun sama dengan tahun saat ini (jadi di masa sekarang).

Contoh:

Input: Daftar
koordinat: [{5,7,2}, {5,3,8}, {-6,3,8}, {5,7,2}]
Daftar tahun:[2039, 2019, 2018, 2039, 2222]

Output:
Konstan untukspace

Mengapa?
The xkoordinat [5,5,-6,5]. Karena mereka tidak semuanya sama, kami telah melalui xdimensi ruang.
The ykoordinat [7,3,3,7]. Karena mereka tidak semuanya sama, kami juga telah melewati ydimensi ruang.
The zkoordinat [2,8,8,2]. Karena mereka tidak semuanya sama, kami juga telah melewati zdimensi ruang.
Tahun ini adalah 2018. Tidak ada tahun sebelum ini, jadi kami tidak mengunjungi pastdimensi waktu.
Ada 2018hadiah dalam daftar tahun, jadi kami mengunjungi presentdimensi waktu.
Ada beberapa tahun di atas 2018( [2039, 2019, 2039, 2222]), jadi kami juga mengunjungi futuredimensi waktu.

Karena kami telah mengunjungi ketiga spacedimensi, tetapi hanya dua dari tiga timedimensi, hasilnya hanya akan (konstanta untuk) space.

Aturan tantangan:

  • Anda dapat menggunakan empat output berbeda dan konstan untuk empat kemungkinan kondisi.
  • Input dapat dalam format apa pun yang masuk akal. Daftar koordinat dapat berupa tupel, daftar bagian dalam / array ukuran 3, string, objek, dll. Daftar tahun mungkin merupakan daftar objek tanggal bukan bilangan bulat juga jika akan menguntungkan byte-count Anda.
  • Anda dapat mengasumsikan x,y,zkoordinatnya bilangan bulat, jadi tidak perlu menangani desimal floating point. Namun, salah satu dari x,, ydan / atau zkoordinat dapat berupa nilai negatif.
  • Anda tidak dapat mengambil daftar input yang sudah dipesan sebelumnya. Daftar input harus dalam urutan yang ditampilkan dalam kasus uji.
  • Anda dapat mengasumsikan semua nilai tahun akan berada dalam kisaran [0,9999]; dan Anda dapat mengasumsikan semua koordinat berada dalam kisaran [-9999,9999].
  • Jika bahasa Anda tidak memiliki cara APA PUN untuk mengambil kembali tahun ini, tetapi Anda masih ingin melakukan tantangan ini, Anda dapat menganggapnya sebagai input tambahan dan menandai jawaban Anda sebagai (tidak bersaing) .

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda dari memposting jawaban dengan bahasa yang bukan kode. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa pun'.
  • Aturan standar berlaku untuk jawaban Anda dengan aturan I / O default , sehingga Anda diizinkan untuk menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda (yaitu TIO ).
  • Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.

Kasus uji:

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
sumber
Berapa rentang tahun yang kita butuhkan untuk bisa mengatasinya?
Shaggy
@ Shaggy Saya akan menambahkannya ke deskripsi tantangan. [0,9999]baik-baik saja (dan [-9999,9999]untuk koordinat juga baik-baik saja
Kevin Cruijssen
Sial, ada satu ide saya!
Shaggy
@ Shaggy Karena penasaran, kisaran apa yang Anda harapkan?
Kevin Cruijssen
3
Bisakah kita mengambil tahun ini sebagai masukan? (Beberapa bahasa tidak bisa mendapatkan tahun berjalan misalnya BF, yang lain hanya bisa melakukannya dengan mengevaluasi kode dalam bahasa lain - misalnya Jelly; yang lain, mungkin banyak, akan menemukan pegolf ini juga)
Jonathan Allan

Jawaban:

2

05AB1E , 15 byte

Output adalah daftar di [space, time]mana 1 berarti xdan 0 berartino x

ø€Ë_Psžg.SÙg3Q)

Cobalah online!

Penjelasan

    ø                 # 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
sumber
Jelas +1 dari saya. Sama seperti byter 16 yang saya siapkan, kecuali bahwa saya menggunakan -.±alih-alih .S(maka byte +1) dan (berpasangan) sebagai ganti)
Kevin Cruijssen
@KevinCruijssen: Saya benar-benar ingin cara lain untuk dilakukan Ùg3Q, yang terasa seperti pencuri byte terbesar, tapi saya tidak yakin itu mungkin: /
Emigna
Saya ragu itu bisa dilakukan tbh lebih pendek. Saya dapat memikirkan beberapa alternatif 4-byte, dan telah mencoba melakukan sesuatu dengan êdan beberapa operasi bitwise atau delta atau sesuatu, tetapi saya tidak dapat menemukan alternatif 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*

Cobalah online!

TFeld
sumber
Mengapa Anda membuat T satu set sebelum menyortir?
Black Owl Kai
4
@BlackOwlKai Kalau tidak, dua entri yang dihapus oleh [1: -1] mungkin tidak di masa lalu / masa depan
Poon Levi
6

Perl 6 , 47 46 byte

-1 byte terima kasih kepada nwellnhof

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

Cobalah online!

Blok kode anonim yang mengambil dua daftar dan mengembalikan sejumlah boolean, dengan elemen pertama adalah apakah Anda melakukan perjalanan dalam waktu, dan yang kedua adalah apakah Anda tidak melakukan perjalanan di luar angkasa.

Penjelasan

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

Japt, 22 byte

Mengambil input sebagai 2D-array integer untuk dimensi ruang dan 1D-array integer selama bertahun-tahun. Output 2untuk ruang saja, hanya 1waktu, 3untuk keduanya dan 0untuk keduanya.

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

Cobalah

                           :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
sumber
2

Japt , 25 byte

Saya 100% yakin ini bukan pendekatan terbaik, masih mencari cara yang lebih singkat untuk melakukan ini: c

Mengembalikan tuple boolean. Yang pertama adalah jika Anda bepergian dalam ruang dan yang kedua jika Anda bepergian dalam waktu

[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

Cobalah online!

Luis felipe De jesus Munoz
sumber
Uhm, saya pikir ini gagal pada testcase yang Anda berikan di tautan? ( transposisi, ambil item unik, dan transpos ulang , jadi Anda mungkin ingin melakukannya Uy e_â ʦ1Ã)
ETHproduksi
Hanya melihat ini sekarang, sepertinya Anda mungkin telah mempostingnya sebelum saya (di ponsel saya jadi tidak bisa mengatakan dengan benar). Jika demikian, beri tahu saya jika Anda ingin saya diberi kesamaan dan saya akan menghapusnya.
Shaggy
@ ETHproduksi, sepertinya berhasil. Saya memiliki âdalam emetode pada percobaan pertama saya, juga, sebelum pindah ke ypada kemauan untuk melihat apakah itu akan berhasil.
Shaggy
@ Shaggy Yah saya akan terkutuk, itu benar-benar berfungsi ... tapi mengapa itu tidak ditransformasikan kembali dalam kasus ini?
ETHproduksi
1
@Shaggy Oh sayang, kode yang memeriksa apakah akan mengembalikannya memeriksa apakah untuk setiap qdalam array yang dipetakan yang dipetakan, typeof q instanceof Array... sungguh bug yang mudah: P Tebak saya tidak bisa memperbaikinya sekarang sampai melepaskan 1.4.6 ...
ETHproduksi
2

JavaScript (ES6), 104 100 byte

Mengambil input sebagai (space)(time). Kembali1untuk waktu ,2untuk ruang ,3untuk keduanya atau0untuk keduanya .

24% dari kode dihabiskan untuk mencari tahu di tahun mana kita berada ... \ 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)

Cobalah online!

Berkomentar

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
sumber
Gagalconsole.log(f([[5,4,2], [3,4,0], [1,4,2], [9,4,4]])([2020])) // neither
14m2
@ l4m2 Hmm. Diperbaiki dengan biaya 1 byte. Saya tidak dapat memikirkan solusi 99-byte dari atas kepala saya.
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))

Cobalah online!

Memasukkan :

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

Output nilai integer sama dengan:

 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
menggali semua
sumber
1

Batch, 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

Catatan: Karena koma adalah pemisah argumen dalam Batch, untuk memasukkan koordinat ruang yang Anda perlu kutip, mis

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

Penjelasan:

@echo off

Matikan output yang tidak diinginkan.

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

Siapkan dua bitmasks dan ekstrak tahun ini. (Di YYYY-MM-DD digunakan %date:~,4%untuk jumlah byte yang sama.)

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

Simpulkan semua argumen. The ~penyebab nilai koordinat untuk dipecah menjadi parameter yang terpisah.

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

Periksa apakah bitmasks sepenuhnya diatur dan hasilkan output yang sesuai.

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

Lihat apakah ini pasangan koordinat atau koordinat dan setahun.

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

Jika itu adalah koordinat maka perbarui bitmask ruang berdasarkan apakah dimensi ruang yang relevan dikunjungi.

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

Jika setahun, perbarui bitmask waktu berdasarkan apakah dimensi waktu yang relevan dikunjungi.

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

Pengembalian 1untuk ruang , 2untuk waktu , 3untuk keduanya , 0untuk keduanya . Cobalah online di sini .

Tidak Disatukan:

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
}
Ketidakseimbangan
sumber