Uzayda ve Zamanda


10

Giriş:

Üç uzay boyutları için: Genelde biz genellikle dört boyutun konuşmak x, yve z; ve bir kez boyut. Ancak bu meydan uğruna, biz de üçe zaman boyutunu ayıracağız: past, present, ve future.

Giriş:

İki giriş listesi. Biri tamsayı x,y,zkoordinatları, diğeri tamsayı yıl içerir.

Çıktı:

Seçtiğiniz dört farklı ve sabit çıkıştan biri. Bir çıktı göstermek için space; biri çıktıyı gösterir time; biri çıktıyı gösterir both space and time; biri çıktıyı belirtmek için neither space nor time.

Tam sayı gruplarının farklılıkları her üç boyut için de 0 değilse, üç alan boyutunun hepsine gittiğimizi göstereceğiz.
Geçmişte en az bir yıl, gelecekte en az bir yıl ve cari yıla (en azından bir yıl) eşitse, üç zaman boyutunun hepsine gittiğimizi göstereceğiz.

Misal:

Girdi:
Koordinatlar listesi: [{5,7,2}, {5,3,8}, {-6,3,8}, {5,7,2}]
Yıl listesi:[2039, 2019, 2018, 2039, 2222]

Çıktı: için
sabitspace

Neden? Koordinatlar . Hepsi aynı olmadığından, uzay boyutundan geçtik . Koordinatlar . Hepsi aynı olmadığından, uzay boyutundan da geçtik . Koordinatlar . Hepsi aynı olmadığından, uzay boyutundan da geçtik . Cari yıl . Bundan önce hiç yıl yok, bu yüzden zaman boyutunu ziyaret etmedik . Yıl listesinde bir hediye var , bu yüzden zaman boyutunu ziyaret ettik . Yukarıda birden fazla yıl vardır ( ), bu yüzden zaman boyutunu da ziyaret ettik .
x[5,5,-6,5]x
y[7,3,3,7]y
z[2,8,8,2]z
2018past
2018present
2018[2039, 2019, 2039, 2222]future

Her üç spaceboyutu da ziyaret ettiğimiz için , ancak üç boyuttan yalnızca ikisi time, çıktı yalnızca (sabit) olacaktır space.

Zorluk kuralları:

  • Dört olası durum için herhangi bir dört ayrı ve sabit çıkış kullanabilirsiniz.
  • Giriş herhangi bir makul biçimde olabilir. Koordinatlar listesi tuples, 3 boyutlu iç listeler / diziler, dizeler, nesneler, vb.
  • x,y,zKoordinatların tamsayı olacağını varsayabilirsiniz , bu nedenle kayan nokta ondalıklarını işlemenize gerek yoktur. Herhangi x, yve / veya zkoordinatları da, negatif değerler olabilir.
  • Giriş listelerini önceden sipariş veremezsiniz. Giriş listeleri, test senaryolarında gösterilen sırada olmalıdır.
  • Tüm yıl değerlerinin aralıkta olacağını varsayabilirsiniz [0,9999]; ve tüm koordinatların aralıkta olduğunu varsayabilirsiniz [-9999,9999].
  • Dilinizin geçerli yılı almanın HERHANGİ bir yolu yoksa, ancak yine de bu zorluğu yapmak istiyorsanız, bunu ek girdi olarak alabilir ve yanıtınızı (rakip olmayan) olarak işaretleyebilirsiniz .

Genel kurallar:

  • Bu , bayt en kısa cevap kazanır.
    Kod golf dillerinin, kod yazmayan dillerle yanıt göndermenizi engellemesine izin vermeyin. 'Herhangi bir' programlama dili için olabildiğince kısa bir cevap bulmaya çalışın.
  • Varsayılan I / O kuralları ile cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyonlar / yöntem, uygun parametreler ve dönüş tipi, tam programlar ile kullanılabilir. Çağrınız.
  • Standart Boşluk Doldurma yasaktır.
  • Mümkünse, lütfen kodunuz için bir test içeren bir bağlantı ekleyin (örn. TIO ).
  • Ayrıca, cevabınız için bir açıklama eklemeniz şiddetle tavsiye edilir.

Test senaryoları:

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

Hangi yıllarla başa çıkabilmemiz gerekiyor?
Shaggy

@Shaggy Meydan açıklamasına ekleyeceğim. [0,9999]iyi (ve [-9999,9999]koordinatlar için de iyi.
Kevin Cruijssen

Dang, fikirlerimden biri gidiyor!
Shaggy

@Shaggy Meraktan, hangi menzili umuyordunuz?
Kevin Cruijssen

3
Cari yılı girdi olarak alabilir miyiz? (Bazı diller bu yıl egBF'yi alamaz, diğerleri bunu yalnızca başka bir dilde kod değerlendirerek yapabilir - örneğin Jelly; diğerleri, belki de çok sayıda, bu golfçüyü de bulacaktır)
Jonathan Allan

Yanıtlar:


2

05AB1E , 15 bayt

Çıktı bir listedir [space, time]nerede 1 için standları xve 0 için standlarıno x

ø€Ë_Psžg.SÙg3Q)

Çevrimiçi deneyin!

açıklama

    ø                 # 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

Benden açık +1. Hazırladığım 16 byter ile aynı, -.±bunun yerine .S(dolayısıyla +1 bayt ..) ve (çift) yerine kullandım)
Kevin Cruijssen

@KevinCruijssen: Gerçekten Ùg3Qen büyük bayt hırsızı gibi hissettirecek başka bir yol istiyorum , ancak bunun mümkün olduğundan emin değilim: /
Emigna

Daha kısa tbh yapılabileceğinden şüpheliyim. Birkaç 4 bayt alternatif düşünebilirim ve bir şey êve bitsel işlem ya da delta veya başka bir şey yapmaya çalışıyorum , ancak 3 bayt alternatif bulamıyorum.
Kevin Cruijssen

6

Python 2 , 111 109 bayt

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

Çevrimiçi deneyin!


T'yi sıralamadan önce neden bir set yapıyorsunuz?
Black Owl Kai

4
@BlackOwlKai Aksi takdirde [1: -1] tarafından kaldırılan iki giriş geçmişte / gelecekte olmayabilir
Poon Levi

6

Perl 6 , 47 46 bayt

Nwellnhof sayesinde -1 bayt

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

Çevrimiçi deneyin!

İki liste alan ve bir grup boolean döndüren anonim kod bloğu, ilk öğe zamanla seyahat edip etmediğiniz, ikincisi uzayda seyahat etmediğiniz.

açıklama

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

Girdileri, uzay boyutları için 2D tamsayılar ve yıllar için 1D tamsayılar dizisi olarak alır. 2Yalnızca alan için, yalnızca 1zaman için, 3hem ikisi için hem de ikisi için çıktılar 0.

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

Dene

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

Bunun en iyi yaklaşım olmadığından% 100 eminim, yine de bunu yapmanın daha kısa bir yolunu arıyorum: c

Bir demet boolean döndürür. Birincisi uzayda seyahat ediyorsanız, ikincisi zamanında seyahat ederseniz

[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

Çevrimiçi deneyin!


Uhm, bence bu bağlantıda verdiğiniz test çantasında başarısız oluyor ( aktarır, benzersiz öğeler alır ve geriUy e_â ʦ1Ã
aktarır

Sadece şimdi görmek, benimkinden önce yayınlamış olabilir gibi görünüyor (telefonumda düzgün söyleyemem). Eğer öyleyse, benimkine benzerlikler verilip verilmediğini bana bildirin, ben de silerim.
Shaggy

@ETHproductions, işe yarıyor gibi görünüyor . Ben âiçinde etaşımadan önce, benim de ilk denemede yöntemle yişe misin diye bir heves.
Shaggy

@Shaggy Peki ben karardım, aslında işe yarıyor ... ama neden bu durumda geri dönmüyor?
ETHproductions

1
@Shaggy Ah canım, geri qtranspoze olup olmadığını kontrol eden kod , eşlenmiş transpoze dizideki her biri için olup olmadığını kontrol eder , typeof q instanceof Array... ne uygun bir hata: P Sanırım 1.4.6 serbest bırakana kadar şimdi düzeltemiyorum ...
ETHproductions

2

JavaScript (ES6), 104 , 100 bayt

(space)(time)1230

Kodun% 24'ü hangi yılda olduğumuzu anlamaya harcanıyor ... \ 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)

Çevrimiçi deneyin!

Yorumlananlar

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

Başarısızconsole.log(f([[5,4,2], [3,4,0], [1,4,2], [9,4,4]])([2020])) // neither
l4m2

@ l4m2 Hmm. 1 baytlık maliyetle sabitlendi. Başımın üstünden 99 baytlık bir çözüm düşünemiyorum.
Arnauld

1

R , 106 , 105 bayt

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

Çevrimiçi deneyin!

Giriş:

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

Şuna eşit bir tamsayı değeri çıktılayın:

 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

Toplu, 353 bayt

@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

Not: Virgüller, Toplu işteki bağımsız değişken ayırıcılar olduğundan, uzay koordinatlarını girmek için alıntı yapmanız gerekir;

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

explantion:

@echo off

İstenmeyen çıkışı kapatın.

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

İki bit maskesi oluşturun ve aynı zamanda mevcut yılı çıkarın. (YYYY-AA-GG yerel ayarlarında %date:~,4%aynı bayt sayısı için kullanılır.)

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

Tüm argümanları gözden geçirin. ~Nedenleri değerleri ayrı parametreler bölünebilir koordinatı.

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

Bit maskelerinin tam olarak ayarlanıp ayarlanmadığını kontrol edin ve uygun sonucu alın.

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

Bunun bir çift koordinat mı yoksa bir koordinat mı ve bir yıl mı olduğunu görün.

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

Bir koordinatsa, boşluk bitmaskesini ilgili boşluk boyutunun ziyaret edilip edilmediğine göre güncelleyin.

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

Bir yılsa, zaman bit maskını ilgili zaman boyutunun ziyaret edilip edilmediğine göre güncelleyin.


1

Java 10, 154 bayt

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

İade 1için uzay , 2için zaman , 3için hem , 0için ne . Burada çevrimiçi deneyin .

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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.