時空を超えて


10

前書き:

3つの空間次元について:一般的に、我々は通常、4次元の話xyz。1つの時間ディメンション。しかし、この挑戦のために、我々としても3への時間ディメンションを分割します:pastpresent、とfuture

入力:

2つの入力リスト。1つは整数x,y,z座標を含み、もう1つは整数年を含みます。

出力:

自分で選択した4つの異なる一定の出力の1つ。1つは出力を示しますspace。1つは出力を示しますtime。1つは出力を示しますboth space and time。1つは出力を示しますneither space nor time

3つの次元すべてについて整数タプルの差が0でない場合は、3つの空間次元すべてに行ったことを示します。
過去に少なくとも1年、将来に少なくとも1年、および現在の年に等しい少なくとも1年がある場合(現在の場合)、3つの時間ディメンションすべてに移動したことを示します。

例:

入力:
座標リスト:[{5,7,2}, {5,3,8}, {-6,3,8}, {5,7,2}]
年リスト:[2039, 2019, 2018, 2039, 2222]

出力:
定数space

どうして?座標です。それらはすべて同じではないので、空間の次元を調べました。座標です。それらはすべて同じではないため、空間の次元も調べました。座標です。それらはすべて同じではないため、空間の次元も調べました。 現在の年はです。これまでに年はないので、時間ディメンションを訪問しませんでした。 あり、我々は訪問しなかったので、年のリストに存在するには、時間ディメンションを。()の 上には複数の年があるので、時間の次元にも行きました。
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

3つのspace次元すべてを訪れましたが、3つの次元のうちの2つだけを訪れたのでtime、出力は(の定数)のみになりますspace

チャレンジルール:

  • 4つの可能な状態には、4つの異なる一定の出力を使用できます。
  • 入力は適切な形式にすることができます。座標リストは、タプル、サイズ3の内部リスト/配列、文字列、オブジェクトなどにすることができます。年数のリストは、バイト数に役立つ場合は整数の代わりに日付オブジェクトのリストにすることもできます。
  • x,y,z座標は整数になると想定できるため、浮動小数点10進数を処理する必要はありません。いずれもxy及び/又はz座標は、しかし、負の値とすることができます。
  • 入力リストを事前に注文することはできません。入力リストは、テストケースに表示される順序である必要があります。
  • すべての年の値が範囲内になると想定できます[0,9999]。すべての座標が範囲内にあると想定できます[-9999,9999]
  • 現在の年を取得する方法が言語にない場合でも、このチャレンジを実行したい場合は、追加の入力としてそれを受け取り、回答を(非競合)とマークすることができます。

一般的なルール:

  • これはなので、バイト単位の最短の回答が優先されます。
    コードゴルフ言語では、コードゴルフ言語以外の言語で回答を投稿しないようにしないでください。「あらゆる」プログラミング言語について、可能な限り短い答えを考え出すようにしてください。
  • デフォルトのI / Oルールを使用した回答には標準ルールが適用されるため、STDIN / STDOUT、関数/メソッドを適切なパラメーターで使用し、戻り値の型の完全なプログラムを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテスト(TIOなど)のリンクを追加してください。
  • また、回答の説明を追加することを強くお勧めします。

テストケース:

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

処理できるようにする必要があるのは何年ですか?
Shaggy、

@Shaggyチャレンジの説明に追加します。[0,9999]でも問題あり[-9999,9999]
ません

ダン、私のアイデアの1つがあります。
Shaggy

@Shaggy好奇心から、どの範囲を望んでいましたか?
Kevin Cruijssen、2018年

3
現在の年を入力として使用できますか?(いくつかの言語は現在の年egBFを取得できません、他は他の言語でコードを評価することによってのみそれを行うことができます-例:ゼリー;他の、おそらく多くの人もこのゴルファーを見つけるでしょう)
ジョナサンアラン

回答:


2

05AB1E、15バイト

出力はリストである1つのためのスタンドと0がの略[space, time]xno x

ø€Ë_Psžg.SÙg3Q)

オンラインでお試しください!

説明

    ø                 # 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。私は使用したこと以外は、調製16 byter同様の-.±代わりに.S(..したがって+1バイト)との代わりに(一対))
ケビンCruijssen

@KevinCruijssen:私は本当に別の方法を望んでいますÙg3Q。これは最大のバイト泥棒のように感じますが、それが可能かどうかは
わかり

私はそれが短いtbhで行うことができるとは思えません。いくつかの4バイトの代替案を考えて、êビット単位の演算やデルタなどで何かをしようとしていましたが、3バイトの代替案を見つけることができません。
Kevin Cruijssen、2018年


6

Perl 6の47の 46バイト

nwellnhofのおかげで-1バイト

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

オンラインでお試しください!

2つのリストを取り、ブール値のタプルを返す匿名コードブロック。最初の要素は時間内に移動したかどうか、2番目の要素は空間内に移動していないかどうかです。

説明

{                                            }  # 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バイト

空間次元の整数の2D配列と年の整数の1D配列として入力を受け取ります。2スペースのみ、1時間のみ、3両方の出力、および両方の出力0

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

それを試してみてください

                           :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バイト

私はこれが最善のアプローチではないことを100%確信していますが、これを行うためのいくつかの短い方法を探しています:c

ブール値のタプルを返します。1つ目は宇宙を旅行した場合、2つ目は時間を旅行した場合

[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

オンラインでお試しください!


ええと、リンクで提供したテストケースでは失敗すると思いますか?(転置し、固有のアイテムを取り、逆転置するので、おそらくUy e_â ʦ1Ã代わりに行う必要があります)
ETHproductions

今だけこれを見て、あなたのようなルックスが前にそれを掲載している可能性がある鉱山(私の携帯電話にそれほど適切に伝えることはできません)。もしそうなら、あなたが私の類似点を与えられて私が欲しいかどうか知らせてください、そして私はそれを削除します。
Shaggy、

@ETHproductions、それは動作するようです。それがうまくいくかどうかを確認するために気まぐれに移動する前に、私も最初の試みでメソッドâ内にいました。ey
Shaggy、

@Shaggyまあ、私は酷評されるでしょう、それは実際に機能します...しかし、なぜこの場合、それは転置しないのですか?
ETHproductions 2018年

1
@Shaggyああ、それを転置するかどうかをチェックするコードqは、マップされた転置配列のすべてについてチェックするtypeof q instanceof Array... ...便利なバグ:P 1.4.6をリリースするまで、今は修正できないと思う...
ETHproductions 2018年

2

JavaScript(ES6)、104 100バイト

(space)(time)1230

コードの24%は、私たちが何年にいるのかを理解するのに費やされています... \ 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)

オンラインでお試しください!

コメントしました

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

フェールオンconsole.log(f([[5,4,2], [3,4,0], [1,4,2], [9,4,4]])([2020])) // neither
l4m2

@ l4m2うーん。1バイトのコストで固定。私の頭の上にある99バイトのソリューションは考えられません。
Arnauld 2018年

1

R106、105バイト

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

オンラインでお試しください!

入力:

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

次と等しい整数値を出力します。

 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

バッチ、353バイト

@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

注:カンマはBatchの引数の区切り文字であるため、空間座標を入力するには、引用する必要があります。

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

外植:

@echo off

不要な出力をオフにします。

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

2つのビットマスクを設定し、現在の年も抽出します。(YYYY-MM-DDロケール%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

それが年である場合、関連する時間ディメンションが訪問されたかどうかに従って時間ビットマスクを更新します。


1

Java 10、154バイト

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

戻り値1のためのスペース2のための時間3のための両方0のためでもありませんこちらからオンラインでお試しください。

非ゴルフ:

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
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.