Hazine Haritası Çizim Bot


14

Arkadaşlarınız için bir hazine avı düzenliyorsunuz. İşleri daha kolay yürütmek için, değerli nesneleri sakladığınız tüm konumların bir haritasını çizmek istiyorsunuz.

Giriş

0 0Sol üst köşeden olmak üzere (negatif olmayan) x ve y koordinatından oluşan bir nokta listesini gösteren herhangi bir giriş biçimine izin verilir (Not: Cevabınızda 1 tabanlı dizine ekleme de kullanabilirsiniz, lütfen ). Misal:

1 2
3 0
0 1

Meydan okuma

İşleviniz veya programınız, her bir konumu gösteren xişaretin çıktıda y + 1 satırında ve x + 1 sütununda bulunduğu bir harita oluşturabilmelidir . İşaretlenmemiş konumlar bir ile gösterilir . Harita ayrıca köşelerin +s, dikey çizgilerin |s ve yatay çizgilerin s olduğu bir çerçeveden oluşur -. Çözümünüz mümkün olan en küçük çerçevenin çıktısını almalıdır. Yukarıda verilen girdi örneği için harita:

+----+
|   x|
|x   |
| x  |
+----+

Olası Test Durumları


"0 0"
=>
+-+
|x|
+-+

"0 10
 5 5
 10 0"
=>
+-----------+
|          x|
|           |
|           |
|           |
|           |
|     x     |
|           |
|           |
|           |
|           |
|x          |
+-----------+

""
=>
++
++

"0 0
 0 2
 2 0"
=>
+---+
|x x|
|   |
|x  |
+---+

Tabii ki, bu , yani en düşük bayt sayısına sahip çözüm kazanıyor! Çözümünüzün açıklamaları teşvik edilir.


Gerçekten değil, ama gerçekten başka bir giriş biçimi hakkında düşünemedim. Ama eğer meydan okumaya faydası olursa bunu değiştirmeye hazırım.
racer290

Kare olmayan haritalar olabilir mi?
FrownyFrog

4
@ racer290 Şöyle bir şey söylemenizi öneririmthe input is a list of locations (e.g. nested list, list of tuples, space & newline separated, separate inputs, ect.)
dzaima

1
Çıktı 2d karakter dizisi olabilir mi?
ovs

2
X ve y koordinatlarını iki ayrı argüman olarak alan bir işlev gönderebilir miyim?
ბიმო

Yanıtlar:


7

J , 37 34 bayt

0<@|:' x'{~((i.@]e.#.~)1+>./) ::#:

Çevrimiçi deneyin!

                       1+>./          maximum for each coordinate + 1
             i.@]                     make an array with these dimensions filled with 0..x*y
                                      /* if the input is empty, 
                                         1+>./ is negative infinity
                                         and i.@] throws an error  */
                   #.~                mixed base conversion of input
                 e.                   replace the elements of i.@]
                                        with 1 if it's present in the
                                        converted input, 0 otherwise
           (                ) ::      if there's an error do the other thing instead
                                #:    "to binary", for empty input this returns a 0x0 matrix
0<@|:' x'{~                           index into character string, transpose and put in a box

1
Çıktı biçimlendirmesinin önerdiğimden daha iyi olduğunu düşünüyorum;)
racer290 19:03

Neden bu ::emptykadar ayrıntılı? Ne işe yarar? Neden 1 bayt kadar basitleştirilemiyor? (J hakkında hiçbir bilgim yok)
Magic Octopus Urn

Ben olmadan TIO üzerinde koştu :: boş ve işe benziyordu (J ya da bilmiyorum)
Quintec

Aslında :: empty “” girdi durumunu ele alıyor gibi görünüyor
Quintec

@MagicOctopusUrn Gerçekten boş bir kutu çıkarmanın daha kısa bir yolunu bilmiyorum, varsayılan olarak 1 satır yüksekliğinde.
FrownyFrog

4

JavaScript (ES6), 150 bayt

Girdi [x,y]biçiminde 1 dizinli koordinatların bir listesi olarak alır . Bir dize döndürür.

a=>(g=w=>y<h?' |-+x'[4*a.some(a=>a+''==[x,y])|2*(-~y%h<2)|++x%w<2]+[`
`[x=x<w?x:+!++y]]+g(w):'')((M=i=>Math.max(2,...a.map(a=>a[i]+2)))(x=y=0),h=M(1))

Çevrimiçi deneyin!


4

Haskell , 127123 bayt

Bu, x koordinatlarının bir listesini ve karşılık gelen y koordinatlarının (!)bir listesini alan operatörü tanımlar :

x!y|l<-'+':('-'<$m x)++"+"=unlines$l:['|':[last$' ':['x'|(i,j)`elem`zip x y]|i<-m x]++"|"|j<-m y]++[l];m x=[1..maximum$0:x]

Çevrimiçi deneyin!

Ungolfed / Açıklama

Yardımcı işlevi mbir liste bekler ve dizinleri (1 tabanlı) maksimuma kadar döndürür, eğer liste boşsa döndürür []:

m x | null x    = []
    | otherwise = [1 .. maximum x]

Asıl operatör (!), tüm koordinatları aşarak ve yeni satırlarla birleştirilen bir veya xkarakter seçerek sadece bir liste kavramadır :

x ! y
  -- construct the top and bottom line
  | l <- "+" ++ replicate (maximum (0:x)) '-' ++ "+"
  -- join the list-comprehension with new-lines
  = unlines $ 
  -- prepend the top line
      [l]
  -- the actual map:
    -- begin the line with | and add the correct chars for each coordinate
      ++ [ "|" ++ [ if (i,j) `elem` zip x y then 'x' else ' '
    -- "loop" over all x-coordinates
                 | i <- m x
                 ]
    -- end the line with a |
           ++ "|"
    -- "loop" over all y-coordinates
         | j <- m y
         ]
  -- append the bottom line
      ++ [l]

3

Tuval , 22 bayt

ø╶{X;┤╋}l|*eL┤-×+e:└∔∔

Burada deneyin!

1 endeksli giriş alır.

Sonunda yaşlarım için can sıkıcı bir hata düzeltmeye karar verdi ve bu 21 bayt aşağı golf .

Açıklama (tek aralık için yarı ASCII-bağlantılı):

ø╶{X;┤╋}l|*eL┤-×+e:└++  full program, implicitly outputting ToS at the end
ø                       push an empty Canvas - the map
 ╶{    }                for each array in the input array
   X                      push "X"
    ;┤                    and push the two coordinates separately on the stack
      ╋                   and overlap the "X" there in the map
        l               get the vertical length of the map
         |*             repeat "|" vertically that many times
           e            encase the map in two of those vertical bars
            L           get the horizontal length of the map
             ┤          subtract 2 (leave place for the "+"es)
              -×        repeat "-" that many times
                +e      encase that line in "+"es
                  :└    push a copy of that below the map
                    ++  and join the 3 items vertically

3

Piton 2 , 151 140 138 bayt

Jo King sayesinde -2 bayt.

Giriş 1 dizinli.

m=input()
w,h=map(max,zip((0,0),*m))
b=['+'+'-'*w+'+']
M=b+['|'+' '*w+'|']*h+b
for x,y in m:M[y]=M[y][:x]+'x'+M[y][x+1:]
print'\n'.join(M)

Çevrimiçi deneyin!


1 tabanlı indeksleme kullandığınızdan şüpheleniyorum, lütfen yanıtta belirtildiği şekilde cevabınıza bir not bırakın.
racer290

2

Kömür , 37 bayt

≔E²⁺²⌈Eθ§λιηB⊟⮌η⊟ηFθ«J⊟⮌ι⊟ιx

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. 1 endeksli. Açıklama:

¿¬LθUR²+«

2x2'lik bir dikdörtgen çizerek özel durum boş girişi +.

≔E²⁺²⌈Eθ§λιη

Girişi aktarın, her sütunun maksimum sayısını (şimdi sıra) alın ve Kömür koordinatlarında kutu boyutunu almak için 2 ekleyin.

B⊟⮌η⊟η

Kutuyu çizin.

Fθ«

Her bir koordinatın üzerinden geçin.

J⊟⮌ι⊟ι

Konumuna atla.

x

Bir çarpı işareti.


Boş girdi için başarısız gibi görünüyor: tio.run/…
wastl

@wastl Teşekkürler, bir çözüm buldum.
Neil

2

Stax , 32 31 24 bayt

╩╠ee%╙æM■↓^⌐╧ΩΓ¡c¥èf¢○ [

Çalıştır ve hata ayıkla

0 tabanlı indeksleri [y, x]çiftler dizisi olarak alır .

Açıklama:

zs'X&|<cM%'-*'+|S]s{'||Smn++m Unpacked program, implicit input
zs                            Tuck empty array under input
  'X                          Push "X"
    &                         Assign element at all indices (create map)
                                As the indexing arrays are an array of arrays, treat them as a path to navigate a multidimensional array.
                                Extend array if needed.
     |<                       Left-align all to the length of the longest.
       cM%                    Copy, transpose, length (width)
          '-*                 Repeat "-"
             '+|S             Surround with "+"
                 ]s           Make a singleton and tuck it below the map
                   {    m     Map:
                    '||S        Surround with "|"
                         n++  Surround with the above/below border (built above)
                            m Map:
                                Implicit output

1
Güzel yapılmış. |SSurround talimatından biraz daha fazla kilometre ve izleyen bir stenografi haritası alabilirsiniz. ( m) Surround yığından alır ave alır bve üretir b+a+b. Ve satırlar üzerinde yineleme yapmak ve çıktı üretmek miçin final yerine kullanabilirsiniz |J. Örneğin
özyinelemeli

1
Bir şey daha: Eğer yerini alabilir z]n+H%ile cM%. Bu, harita genişliğini alan ancak boş haritalar için özel bir durum içeren parçadır. Haritayı ölçmeden önce değiştirirseniz, özel durum kaybolur.
özyinelemeli

@recursive Surround gibi bir şey arıyordum, ancak yanlış anahtar kelimeleri aradım
wastl

Bu operasyona doğal olarak ne denir? Bir sonraki kişinin bulabilmesi için dokümana ekleyebilirim.
özyinelemeli

@recursive Ne olduğunu hatırlamıyorum ve doğal olarak şimdi surround olarak adlandırırdım
wastl

2

R , 133125122 bayt

function(m)cat(z<-c("+",rep("-",u<-max(m[,1])),"+","
"),rbind("|",`[<-`(matrix(" ",u,max(m[,2])),m,"x"),"|","
"),z,sep="")

Çevrimiçi deneyin!

1 endeksli. Bir matrisi argüman olarak alır. DigEmAll sayesinde 8 bayt kaydedildi, Giuseppe sayesinde 3 teşekkürler! Açıklama (kodun önceki sürümü):

function(m){                           #x and y are the 1st and 2nd col of m
s=matrix(32,u<-max(m[,1]),max(m[,2]))  #s (treasure map) has dim max(x), max(y) 
s[m]=120                               #place the X's on the map
cat(                                   #print:
    z<-c("+",rep("-",u),"+","\n"),     #the top line
    intToUtf8(rbind(124,s,124,13)),    #the map
    z,                                 #the bottom line.
    sep="")
}


Parantezleri[<- çıkarmak için doğrudan kullanarak 122 bayt .
Giuseppe

@Giuseppe gerçekten! Bir yol olması gerektiğini biliyordum.
JayCe

1

[y, x] biçiminde alınan koordinatlar

JavaScript (node.js) , 191 184 bayt

c=f=a=>{a.map(([y,x])=>(c[M<++y?M=y:y]=c[y]||[])[m<++x?m=x:x]="x",M=m=0)
m++
M++
s=""
for(i=0;i<=M;s+=`
`,i++)for(j=0;j<=m;j++)s+=(c[i]||0)[j]||(j%m?i%M?" ":"-":i%M?"|":"+") 
return s}

Çevrimiçi deneyin!


Sanırım yanlışlıkla x- ve y-koordinatlarını bir yere takas
ettiniz

@ racer290 daha spesifik olabilir misiniz?
DanielIndie

Çözümünüzü denerken, test durumlarında x koordinatını değiştirmenin, koordinatın dikey yönünde bir değişikliğe yol açtığını buldum. Sanırım hata ilk sırada ( a.map(([y,x]))
racer290

ancak x test
senaryolarında

2
Çözümünüzde önce y koordinatını mı alıyorsunuz? Sanırım cevabınıza bir not bırakmak daha iyi olur.
racer290

1

JavaScript, 180 bayt

F = 

s=>s.map(([x,y])=>(t[y]=t[Y<y?Y=y:y]||[])[X<x?X=x:x]='x',t=[X=Y=0])&&[...t,0].map((_,y)=>[...Array(X+2)].map((_,x)=>[(t[y]||0)[x]||' ',...'-|+'][!(y%~Y)+2*!(x%~X)]).join``).join`
`


console.log(F([[1,11],[6,6],[11,1]]))


1

Java 10, 238223 bayt

c->{var r="";int w=0,h=0,x,y;for(var l:c){w=(x=l.get(0))>w?x:w;h=(y=l.get(1))>h?y:h;}for(w++,h++,x=-1;++x<=w;r+="\n")for(y=-1;++y<=h;)r+=x%w+y%h<1?"+":x%w<1?"-":y%h<1?"|":(c+"").contains("["+x+", "+y+"]")?"x":" ";return r;}

1 indeksli koordinatlar.

Çevrimiçi deneyin.

Açıklama:

c->{                      // Method with 2D Lists as parameter and String return-type
  var r="";               //  Result-String, starting empty
  int w=0,h=0,            //  Width and height, starting at 0
      x,y;                //  Temp x,y coordinates
  for(var l:c){           //  Loop over the Inner Lists containing the coordinates
    w=(x=l.get(0))>w?x:w; //   Determine width based on max x-coordinate
    h=(y=l.get(1))>h?y:h;}//   Determine height based on max y-coordinate
  for(w++,h++,            //  Increase both the width and height by 1
      x=-1;++x<=w;        //  Loop `x` in the range [0, width]
      r+="\n")            //    After every iteration: append a new-line to the result
    for(y=-1;++y<=h;)     //   Inner loop `y` in the range [0, height]
      r+=                 //    Append the following character to the result-String:
        x%w+y%h<1?        //    If it's one of the corners:
          "+"             //     Append "+"
        :x%w<1?           //    Else-if it's the top or bottom row:
          "-"             //     Append "-"
        :y%h<1?           //    Else-if it's the right or left column:
          "|"             //     Append "|"
        :(c+"").contains("["+x+", "+y+"]")? 
                          //    Else-if the current `x,y` is part of the input-coordinates
          "x"             //     Append "x"
        :                 //    Else:
          " ";            //     Append " "
  return r;}              //  Return the result-String

rwhxy; lcwxlgetw? xg; hylgeth? yh; forwhxxwr. foryyhrxwyh? xwyhcxy? xr.
Sihirli Ahtapot Urn

@MagicOctopusUrn Tüm değişkenleri ve get/ foriçin ne adlandırıyorsunuz ? : S XD
Kevin Cruijssen

1

C (GCC) , 246 234 bayt

Öneri için ceilingcat'e teşekkürler.

Sıfır endekslendi. İşlev bir koordinat ve arabellek listesi alır, maksimum x ve y değerlerini bulur, arabelleği boşluklarla doldurur, çerçeveyi oluşturur ve ardından 'x'leri çizer.

f(int*a,char*c){int*b=a,x,y=x=-1,i=0;for(;~*b;*++b>y?y=*b:0,++b)*b>x?x=*b:0;for(x+=4,y+=3,memset(c,32,x*y);++i<x;c[i]=c[y*x-i]=45);for(i=0;i<y;c[x*++i-1]=10*(i<=y))c[x*i]=c[x*i+x-2]=i&&y/i?124:43;for(b=a;~*b;b+=2)c[*b+1-~b[1]*x]='x';}

Çevrimiçi deneyin!


alt sıradaki hatayı düzeltin 235 bayt
ceilingcat

1

05AB1E , 44 42 bayt

ζεZ}>`UX'-×'+.ø©,F'|NVXF¹YN‚.å„ xè}'|J,}®,

Çevrimiçi deneyin!


 ζεZ}>`                                     # Push the max of X and Y to the stack +1.
       UX                                   # Store the max X.
         '-×'+.ø©,                          # Print the top border.
                  F                     }   # From 0 to Y...
                   '|                       # Push left border.
                     NV                     # Store current Y in Y.
                       XF          }        # From 0 to X...
                         ¹                  # Push input.
                          YN‚               # Group current X and Y.
                             .å             # Exists in original input ? 1 : 0
                               „ xè         # Exists ? 'X' : ' '
                                    '|J,    # Right border, join, print.
                                         ®, # Print bottom border.

X ve Y tersine çevrilebilir, bunun önemli olup olmadığını bilmiyordum.


Sanırım bunu daha az byte'm var, ama göreceğiz ... Hayır.

ζεZ}>`D'-×'+.øUð×'|.øs.D)X.ø©svy>`s®sUXès'xsǝXǝ}

1
Çok değil, ama ilk değiştirerek 1 byte kaydedebilirsiniz Fiçin Lvsilme, NVve değişim Yiçin y. 41 bayt
Kevin Cruijssen

1
Tarafından belirtildiği gibi @Emigna sohbet , εZ}olabilir €à.
Kevin Cruijssen

Mobil bu düzenleme nefret pc yakın kadar bekleyecek.
Sihirli Ahtapot Urn

1
@KevinCruijssen Ývdeğil Lv, ama yine de iyi bir düzenleme :).
Sihirli Ahtapot Urn

Ah, haklısın. Ývyerine Lv. Benim hatam.
Kevin Cruijssen

0

C (GCC) , 229 220 216 bayt

Tavan kedisi sayesinde -9 bayt .

Sıfır endekslendi. Koordinatları sayı listesi olarak alır, çift sayı X ve tek sayı Y'dir.

X,Y,i,j,k,x,z;f(l,n)int*l;{for(X=Y=0,i=n*=2;i--;X=fmax(l[i],X))Y=fmax(l[i--],Y);n&&X++-Y++;for(--i;i++<Y;puts(""))for(j=-1;j<=X;z=i<0|i==Y,putchar(j++<0|j>X?z?43:'|':x?z?45:32:'x'))for(x=k=n;k--;)x*=l[k--]-i|l[k]-j;}

Çevrimiçi deneyin!


@ceilingcat Şerefe!
gastropner

for(n&&X++-Y++;i<=Y;i+=puts(""))Bunun yerine önern&&X++-Y++;for(--i;i++<Y;puts(""))
ceilingcat
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.