ผ่านอวกาศและเวลา


10

บทนำ:

โดยทั่วไปเรามักจะพูดถึงสี่มิติ: สามมิติพื้นที่สำหรับx, yและz; และมิติหนึ่งครั้ง เพื่อประโยชน์ของความท้าทายนี้ แต่เราจะแยกมิติเวลาเป็นสามเช่นกัน: past, และpresentfuture

การป้อนข้อมูล:

สองรายการอินพุต หนึ่งที่มีx,y,zพิกัดจำนวนเต็มและหนึ่งปีที่มีจำนวนเต็ม

เอาท์พุท:

หนึ่งในสี่เอาต์พุตที่แตกต่างและคงที่ตามที่คุณต้องการ หนึ่งที่จะบ่งบอกถึงการส่งออกspace; หนึ่งเพื่อบ่งชี้เอาท์พุทtime; หนึ่งเพื่อบ่งชี้เอาท์พุทboth space and time; neither space nor timeและเป็นหนึ่งเพื่อบ่งชี้ถึงการส่งออก

เราจะระบุว่าเราไปที่มิติพื้นที่ทั้งสามถ้าความแตกต่างของจำนวนเต็ม - ทูเปิลไม่ใช่ 0 สำหรับทั้งสามมิติ
เราจะระบุว่าเราไปสู่มิติเวลาทั้งสามถ้ามีอย่างน้อยหนึ่งปีในอดีตอย่างน้อยหนึ่งปีในอนาคตและอย่างน้อยหนึ่งปีเท่ากับปีปัจจุบัน (ดังนั้นในปัจจุบัน)

ตัวอย่าง:

อินพุต:
รายการพิกัด:รายการ[{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

เนื่องจากเราเคยไปทั้งสามspaceมิติ แต่มีเพียงสองในสามtimeมิติที่ส่งออกจะเป็น space(คงที่สำหรับ)

กฏท้าทาย:

  • คุณสามารถใช้เอาต์พุตที่แตกต่างและคงที่สี่แบบสำหรับสถานะที่เป็นไปได้สี่สถานะ
  • อินพุตอาจอยู่ในรูปแบบที่สมเหตุสมผล รายการพิกัดสามารถเป็น tuples, รายการภายใน / อาร์เรย์ของขนาด 3, สตริง, วัตถุ, ฯลฯ รายชื่อปีอาจเป็นรายการของวัตถุวันที่แทนจำนวนเต็มเช่นกันหากเป็นประโยชน์ต่อจำนวนไบต์ของคุณ
  • คุณสามารถสมมติว่าx,y,zพิกัดจะเป็นจำนวนเต็มดังนั้นไม่จำเป็นต้องจัดการทศนิยมทศนิยม ใด ๆx, yและ / หรือzพิกัดสามารถเป็นค่าลบแม้ว่า
  • คุณไม่สามารถรับคำสั่งซื้อล่วงหน้าได้ รายการอินพุตควรอยู่ในลำดับที่แสดงในกรณีทดสอบ
  • คุณสามารถสันนิษฐานได้ว่าทุกค่าปีจะอยู่ในช่วง[0,9999]; [-9999,9999]และคุณสามารถสมมติพิกัดทั้งหมดที่อยู่ในช่วง
  • ถ้าภาษาของคุณไม่ได้มีวิธีการใดที่จะดึงปีปัจจุบัน แต่คุณจะยังคงชอบที่จะทำสิ่งที่ท้าทายนี้คุณอาจจะใช้มันเป็น input เพิ่มเติมและทำเครื่องหมายคำตอบของคุณเป็น(ที่ไม่ใช่การแข่งขัน)

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ
    อย่าปล่อยให้ภาษารหัสกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานใช้สำหรับคำตอบของคุณด้วยกฎ 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]พิกัดจะปรับเช่นกัน.
เควิน Cruijssen

แดงมีหนึ่งในความคิดของฉัน!
Shaggy

@Shaggy จากความอยากรู้คุณคาดหวังอะไรในช่วงนี้บ้าง?
Kevin Cruijssen

3
ขอให้เราใส่ปีปัจจุบันเป็นอินพุทได้ไหม (บางภาษาไม่สามารถรับปีปัจจุบันเช่น BF ได้ แต่คนอื่นทำได้โดยการประเมินโค้ดในภาษาอื่น - เช่นเยลลี่; คนอื่น ๆ อาจจะพบนักเล่นกอล์ฟคนนี้ด้วย)
Jonathan Allan

คำตอบ:


2

05AB1E , 15 ไบต์

เอาท์พุทเป็นรายการ[space, time]ที่1หมายถึงxและ0หมายถึงno 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 byte .. ) และ(คู่) แทน)
Kevin Cruijssen

@KevinCruijssen: ฉันต้องการอีกวิธีหนึ่งที่จะทำÙg3Qซึ่งรู้สึกเหมือนขโมยไบต์ที่ใหญ่ที่สุด แต่ฉันไม่แน่ใจว่าเป็นไปได้: /
Emigna

ฉันสงสัยว่ามันสามารถทำได้สั้นลง ฉันสามารถคิดถึงทางเลือก 4 ไบต์บางอย่างและพยายามทำบางสิ่งบางอย่างกับêการดำเนินการระดับบิตหรือเดลตาหรือบางอย่าง แต่ฉันไม่สามารถหาทางเลือก 3 ไบต์ได้
Kevin Cruijssen

6

Python 2 , 111 109 ไบต์

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

ลองออนไลน์!


ทำไมคุณต้องตั้ง T ก่อนที่จะเรียงลำดับ?
Black Owl Kai

4
@BlackOwlKai ไม่เช่นนั้นสองรายการที่ถูกลบโดย [1: -1] อาจไม่ได้อยู่ในอดีต / อนาคต
Poon Levi

6

Perl 6 , 47 46 ไบต์

-1 ไบต์ต้องขอบคุณ nwellnhof

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

ลองออนไลน์!

บล็อคโค้ดแบบไม่ระบุชื่อที่ใช้สองรายการและคืนค่า tuple ของ booleans ด้วยองค์ประกอบแรกคือไม่ว่าคุณจะเดินทางในเวลาและที่สองคือว่าคุณไม่ได้เดินทางในอวกาศ

คำอธิบาย

{                                            }  # 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 ไบต์

รับอินพุตเป็นอาเรย์สองมิติของจำนวนเต็มสำหรับมิติพื้นที่และอาร์เรย์ 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% ว่านี่ไม่ใช่วิธีที่ดีที่สุด แต่ยังคงมองหาวิธีที่สั้นกว่านี้:

ส่งคืน tuple ของ booleans อย่างแรกคือถ้าคุณเดินทางในอวกาศและที่สองถ้าคุณเดินทางในเวลา

[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

ลองออนไลน์!


อืมฉันคิดว่าสิ่งนี้จะล้มเหลวใน testcase ที่คุณระบุไว้ในลิงค์หรือไม่ (การสลับรายการใช้รายการพิเศษและการแปลงกลับดังนั้นคุณอาจต้องการทำUy e_â ʦ1Ãแทน)
ETHproductions

เห็นเฉพาะตอนนี้ดูเหมือนว่าคุณอาจโพสต์ไว้ก่อนฉัน (บนโทรศัพท์ของฉันดังนั้นจึงไม่สามารถบอกได้อย่างถูกต้อง) ถ้าเป็นเช่นนั้นแจ้งให้เราทราบหากคุณต้องการให้ฉันได้รับความคล้ายคลึงกันและฉันจะลบมัน
ปุย

@ETHproductions ดูเหมือนว่าจะใช้งานได้ ผมมีâอยู่ในeวิธีการในครั้งแรกของฉันเกินไปก่อนที่จะย้ายไปyในราชประสงค์เพื่อดูว่ามันควรที่จะทำงาน
Shaggy

@Shaggy ดีฉันจะถูกสาปมันใช้งานได้จริง ... แต่ทำไมมันไม่ไขว้เขวกลับในกรณีนี้
ETHproductions

1
@Shaggy โอ้ที่รักรหัสที่ตรวจสอบว่าจะเปลี่ยนมันกลับมาตรวจสอบว่าสำหรับทุกคนqในอาร์เรย์ transposed แมปtypeof q instanceof Array... สิ่งที่เป็นข้อผิดพลาดที่สะดวก: P Guess ฉันไม่สามารถแก้ไขได้ในขณะนี้จนกว่าจะปล่อย 1.4.6 ...
ETHproductions

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

1

R , 106 , 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

หมายเหตุ: เนื่องจากเครื่องหมายจุลภาคเป็นตัวคั่นอาร์กิวเมนต์ในแบทช์เพื่อป้อนพิกัดอวกาศที่คุณต้องอ้างแล้วเช่น

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

explantion:

@echo off

ปิดเอาต์พุตที่ไม่ต้องการ

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

ตั้งค่า bitmasks สองรายการและแยกปีปัจจุบัน (ในโลแคล 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

ตรวจสอบว่า bitmasks ได้รับการตั้งค่าอย่างเต็มที่และส่งออกผลลัพธ์ที่เหมาะสม

: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

หากเป็นพิกัดให้อัปเดต bitmask space ตามว่ามิติพื้นที่พิเศษที่เกี่ยวข้องนั้นถูกเยี่ยมชมหรือไม่

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

หากเป็นปีให้อัปเดต bitmask เวลาตามมิติเวลาที่เกี่ยวข้อง


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สำหรับค่า ลองออนไลน์ได้ที่นี่ที่นี่

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
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.