Xây dựng cho tôi một thành phố


34

Các lập trình viên luôn cố gắng san phẳng các mảng thành các thực thể 1 chiều nhàm chán và điều đó làm tôi buồn.

Nhiệm vụ của bạn là hủy kết nối một chuỗi ký tự tùy ý, xuất ra một tòa nhà chọc trời thành phố đáng yêu.

Hãy xem xét chuỗi: aaabbbbbccqrrssstttttttPPw

Nó trông tốt hơn nhiều như thế này:

            tt
            tt
  bb        tt
  bb        tt
aabb      sstt
aabbcc  rrssttPP
aabbccqqrrssttPPww

(Ok, vâng, các chữ cái được nhân đôi để làm cho nó trông giống thành phố hơn - đường chân trời).

Lấy một chuỗi đầu vào, nhân đôi từng phần của các ký tự trùng khớp (không nhất thiết phải là chữ cái) và xây dựng cho tôi một thành phố!

Mã byte ngắn nhất giành chiến thắng.

Tôi thực sự nghĩ rằng tôi có các yêu cầu đóng đinh, nhưng để trả lời một số câu hỏi:

  • nó phải ở trên mặt đất
  • bạn có thể có thêm bầu trời nếu bạn muốn (dẫn các dòng trống, khoảng trống xung quanh) - nhưng không phải giữa các tòa nhà
  • các chữ cái có thể được sử dụng lại bên trong chuỗi (cùng kiến ​​trúc, vị trí khác nhau)
  • các chữ cái được coi là ASCII, nhưng sẽ có nhiều sự tinh tế hơn cho những người hỗ trợ mã hóa bổ sung (UTF8, v.v.)

3
Chúng ta có thể xuất cảnh quan thành phố xoay 90 độ không?
Okx

6
Nhân vật sẽ bao giờ lặp lại một lần nữa tức là aaabbbbaa?
TheLethalCoder

14
@Okx bạn đã bao giờ thấy một thành phố xoay 90 độ, trông sẽ rất ngớ ngẩn! ;)
Tom


10
Chào mừng bạn đến với trang web! Đối với các thử thách trong tương lai, tôi khuyên bạn nên đăng chúng trước trong Sandbox nơi bạn có thể nhận phản hồi từ cộng đồng trước khi đăng lên dưới dạng thử thách.
Dada

Câu trả lời:


11

05AB1E , 6 byte

γ€DζR»

Hãy thử trực tuyến!

Trong phiên bản mới hơn thử thách, ζđã được thêm vào để thay thế.Bø

05AB1E , 8 byte

γ€D.BøR»

Giải trình:

γ            Convert into a list of consecutive equal elements
 €D          Duplicate each element
   .B        Squarify; pad each element with spaces so that they are the length of the longest element
     ø       Transpose
      R      Reverse (otherwise the city would be upside-down)
       »     Join by newlines

Hãy thử trực tuyến!


1
Thật thú vị, Jelly z⁶dành cho .Bø... nhưng nó cũng Œgx'2dành cho γ€D> _>
Erik the Outgolfer

γ.BD)ø˜øR»là những gì tôi có mà không cần tìm kiếm, €Dlà cách tốt hơn; Tôi cảm thấy như cả hai chúng ta đều thiếu giải pháp 1 byte để sao chép nội tuyến.
Bạch tuộc ma thuật Urn

3
@MagicOctopusUrn Đợi đã, bạn đã giải quyết thử thách mà không cần nhìn vào nó?
Okx

@Okx Chà, thật khôn ngoan khi không nhìn vào các câu trả lời trước đây vì toàn bộ niềm vui chơi golf có thể bị cắt đứt.
Erik the Outgolfer

@EriktheOutgolfer Đó là một trò đùa, và ý tôi là anh ấy đã giải quyết nó mà không cần nhìn vào nội dung của thử thách.
Okx

6

CJam , 23 byte

qe`::*:__:,:e>f{Se[}zN*

Hãy thử trực tuyến!

Giải trình:

qe`::*:__:,:e>f{Se[}zN* Accepts (multi-line?) input
q                       Take all input
 e`::*                  Split into groups of equal elements
      :_                Duplicate each
        _:,:e>          Push maximal length without popping
              f{Se[}    Left-pad each to that length with space strings (NOT space chars, although not a problem here)
                    z   Zip
                     N* Join with newlines

Ồ, một câu trả lời của CJam> _>
Ông Xcoder

6

Thạch , 9 byte

Œgx'2z⁶ṚY

Hãy thử trực tuyến!

Giải trình:

Œgx'2z⁶ṚY  Main Link
Œg         Group runs of equal elements
  x        Repeat
   '              the lists
    2                       twice without wrapping
     z⁶    Zip (transpose), filling in blanks with spaces
       Ṛ   Reverse the whole thing so it's upside-down
        Y  Join by newlines

1
Bạn có thể thêm một lời giải thích xin vui lòng milord? Tôi không thể hiểu chuyện gì đang xảy ra ở đây: o
Nathan


@HyperNeutrino Lời giải thích tuyệt vời ...
Erik the Outgolfer

Chỉ cần chắc chắn, nó là chính xác? : P
HyperNeutrino

@HyperNeutrino Chà, đó hoàn toàn không phải là ý định ', mà là lặp lại chính danh sách đó chứ không phải các mục bên trong chúng, nhưng nói chung là tốt. :)
Erik the Outgolfer

6

Python 3 , 155 136 134 132 byte

-19 byte nhờ @LeakyNun
-2 byte nhờ @officialaimm
-1 byte nhờ @Wondercricket

s=input()+'+'
k=' '*len(s)
a=[]
c=b=''
while s:
 while c in b:b+=c;c,*s=s
 a+=b+k,b+k;b=c
for r in[*zip(*a)][:0:-1]:print(*r,sep='')

Hãy thử trực tuyến!



5

Java 8, 412 400 330 324 312 319 byte

-6 byte nhờ VisualMelon
-12 byte nhờ Kevin Cruijssen
nhưng +19 byte vì tôi quên bao gồm các nhập khẩu trong số byte.

import java.util.*;x->{Map m=new HashMap(),n;int l=x.length(),i=l,v,y,h=0,d=1;char c,k;for(;i-->0;m.put(c,d=m.get(c)!=null?d+1:1),h=d>h?d:h)c=x.charAt(i);for(y=h;y>0;y--){n=new HashMap(m);for(i=0;i<l;i++)if(n.get(k=x.charAt(i))!=null){v=(int)m.get(k);System.out.print((y>v?"  ":k+""+k)+(i==l-1?"\n":""));n.remove(k);}}}

Hãy thử trực tuyến!


1
Chơi golf Java và C # (bộ phận của tôi) rất vui! Giữ ở đó! Chưa được thử nghiệm, nhưng tôi nghĩ bạn có thể lưu một vài byte bằng cách điều chỉnh lại các vòng lặp: bạn có thể gán trước i=0, hoặc tốt hơn i=l, và đếm ngược for(;i-->0;h=d>h?d:h)(và nhét h=bit vào đó). Việc đếm ngược tương tự cũng sẽ làm việc cho vòng lặp bên trong. Bên trong ifcũng không cần niềng răng {}. Và luôn luôn mệt mỏi <=hoặc >=, bạn có thể xoay ternary xung quanh >và lưu một byte.
VisualMelon

Cảm ơn, tôi có thể loại bỏ 6 byte mã khác nhờ các mẹo của bạn. Chà, tôi nghĩ rằng tôi sẽ ở lại với Java Golfing vì tôi thực sự thích nó;).
Twometer

1
Chào mừng đến với PPCG! Tôi e rằng bạn sẽ phải tăng số đếm byte lên tới 329 (+19 byte do yêu cầu import java.util.*;cho MapHashMap, nhập khẩu là một phần của số đếm byte và -1 bằng cách xóa dấu chấm phẩy, không phải là dấu chấm phẩy một phần của số byte).
Kevin Cruijssen


1
Tóm tắt các thay đổi: HashMap<>HashMap; Map n=,nn=; m.put(c,d=m.get(c)!=null?d+1:1);bên trong vòng lặp for để thoát khỏi dấu ngoặc; k=x.charAt(i)bên trong if(n.get(k)!=null)để thoát khỏi dấu ngoặc đơn và dấu chấm cho vòng lặp. Một lần nữa, chào mừng và câu trả lời tuyệt vời! +1 từ tôi. Ngoài ra, trong trường hợp bạn chưa thấy nó: Mẹo chơi golf trong JavaMẹo chơi gôn bằng <bất kỳ ngôn ngữ> nào có thể thú vị để đọc qua.
Kevin Cruijssen

5

Japt , 19 18 15 13 12 byte

Bao gồm các dấu cách trên mỗi dòng.

ò¦
íU c ·z w

Kiểm tra nó


Giải trình

         :Implicit input of string U
ò        :Split U to an array by ...
¦        :   checking for inequality between characters.
í        :Pair each item in U with...
U        :   The corresponding item in U (i.e, duplicate each string)
c        :Flatten the array (í creates an array of arrays).
·        :Join to a string with newlines.
z        :Rotate 90 degrees.
w        :Reverse.
         :Implicit output of resulting string.

4

Toán học, 150 byte

(z=Characters[v=#];f=CharacterCounts[v][#]&/@(d=Union@z);Row[Column/@Map[PadLeft[#,Max@f,""]&,Table[Table[d[[i]]<>d[[i]],f[[i]]],{i,Length@d}],{1}]])&

4

R , 135 byte

e=rle(sub('(.)','\\1\\1',strsplit(scan(,''),'')[[1]]));write(sapply(sum(e$l|1):1,function(x)ifelse(e$l>=x,e$v,'  ')),'',sum(e$l|1),,'')

Hãy thử trực tuyến!

đọc từ stdin, ghi vào stdout (với một dòng mới).

Giải trình:

  • rle tìm thấy chiều dài của các vệt ký tự, độ cao của mỗi tháp.
  • các subbiểu hiện thay thế mỗi nhân vật với đôi của nó (vì vậy tôi không cần phải muck về với thiết chỉ số liền kề nhau)
  • sapply trả về một mảng (trong trường hợp này là ma trận):
    • sum(e$l|1)là số lượng ký tự riêng biệt; chúng tôi đi từ trên xuống dưới
    • ifelse( ... )là một vector hóa if...elsecho phép chúng ta xây dựng một ma trận tháp và không gian đôi
    • write ghi vào bàn điều khiển, với một vài tùy chọn để định dạng.



2

MATL , 15 byte

'(.)\1*'XXtvc!P

Hãy thử trực tuyến!

Giải trình

'(.)\1*' % Push string to be used as regexp pattern
XX       % Implicit input. Regexp matching. Pushes row cell array of matching substrings
t        % Duplicate
v        % Concatenate vertically
c        % Convert to char. This reads cells in column-major order (down, then across)
         % and produces a 2D char array, right-padding with spaces
!        % Transpose
P        % Flip vertically. Implicitly display

2

Than , 40 byte:

A⟦⟦ω⟧⟧λFθ¿⁼ι§§λ±¹¦⁰⊞§λ±¹ι⊞λ⟦ι⟧FλF²↑⁺⪫ιω¶

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Ban đầu tôi đã thử một vòng lặp đơn giản trên chuỗi đầu vào để in một hình chữ nhật mỗi khi chữ thay đổi, nhưng tôi đã chuyển sang phương pháp xây dựng danh sách này vì nó đã lưu 5 byte. Giải thích: Biến lchứa danh sách lồng các chữ cái đầu vào. Các ký tự khớp với các thành phần danh sách cuối cùng hiện tại được đẩy vào danh sách cuối nếu không một danh sách con mới được tạo cho ký tự đó. Sau đó, vẫn còn để nối các chữ cái trong mỗi danh sách con để chúng có thể được in theo chiều dọc hai lần.


2

C, 259 231 byte

Mã đánh gôn

#define v a[1][i
i,k,l,x,h,w;main(char*s,char**a){for(;v];w+=2*!x,s=v++],h=x>h?x:h)x=(s==v])*(x+1);h++;s=malloc((x=h++*++w+1)+w);memset(s,32,h*w);for(i=k;v];s[x+1]=s[x]=k=v++],x=k==v]?x-w:(h-1)*w+l++*2+3)s[i*w]=10;printf("%s",s);}

Mã dài dòng

//Variable Explanations:
//i - increment through argument string, must beinitialized to 0
//k - increment through argument string, must be initialized to 0
//l - record x coordinate in return value, must be initialized to 0
//x - record the actual character position within the return string
//arrheight - the height of the return string
//arrwidth - the width of the return string
//arr - the return string
//argv - the string containing the arguments
#define v argv[1][i

i,k,l,x,arrheight,arrwidth;

main(char*arr,char**argv){
  for(;v];                                 //For Length of input
    arrwidth+=2*!x,                        //increment width by 2 if this char is not the same as the last
    arr=v++],                              //set arr to current char
    arrheight=x>arrheight?x:arrheight      //see if x is greater than the largest recorded height
  )x=(arr==v])*(x+1);                     //if this character is the same as the last, increment x (using arr to store previous char)
  arrheight++;                             //increment height by one since its 0 indexed
  arr=malloc((x=arrheight++*++arrwidth+1)+arrwidth); //create a flattened array widthxheight and set x to be the bottom left position
  memset(arr,32,arrheight*arrwidth);       //fill array with spaces
  for(i=k;v];                              //For Length of input
    arr[x+1]=arr[x]=k=v++],                //set x and x+1 positions to the current character, store current character in i
    x=k==v]?x-arrwidth:(arrheight-1)*arrwidth+l++*2+3 //if next char is same as current move vertically, else set x to bottom of next column
  )arr[i*arrwidth]=10;                     //Add new lines to string at end of width

  printf("%s",arr);                        //output string

}

Được biên dịch với GCC, không có Cờ đặc biệt

Chỉnh sửa

Đã lưu 28 byte nhờ adelphus. Sự thay đổi của anh ấy cho phép tôi tạo ra một định nghĩa. Và tôi đã tạo các vòng lặp while thành các vòng lặp để tiết kiệm 2 byte mỗi vòng bằng cách sắp xếp lại vòng lặp. Tôi cũng đã sửa một vấn đề trong đó mã sẽ bị hỏng khi ký tự cuối cùng trong đầu vào không phải là đơn lẻ. Mã sẽ thất bại nếu chỉ có một chữ cái duy nhất nhưng sẽ hoạt động trong tất cả các trường hợp khác.


Tốt đẹp! Nhưng phiên bản golf dường như không hoạt động với đầu vào tùy ý vì một số lý do. Xóa "w" cuối cùng khỏi đầu vào mẫu dường như làm mất q và lặp lại chuỗi. Chắc chắn đó là một cái gì đó nhỏ ...
adelphus

cũng while (i < strlen(argv[1]))có thể rút ngắn thành while (argv[1][i])- vòng lặp cho đến khi ký tự null
adelphus

@adelphus Thú vị, tôi sẽ dùng thử vào ngày mai khi tôi có cơ hội. Tôi đã không kiểm tra bất cứ điều gì khác ngoài trường hợp thử nghiệm đã cho (lười biếng tôi biết).
dj0wns

Điều đó thực sự giúp ích rất nhiều, tôi đã có thể khắc phục vấn đề và giảm gần 30 byte!
dj0wns

1

Pip , 22 byte

21 byte mã, +1 cho -lcờ.

Ya@`(.)\1*`RV:yWVyZDs

Hãy thử trực tuyến!

Giải trình

                       a is 1st cmdline arg; s is space (implicit)
 a@`(.)\1*`            Using regex, create list of runs of same character in a
Y                      Yank that into y variable
              yWVy     Weave (interleave) y with itself to duplicate each item
                  ZDs  Zip to transpose, with a default character of space filling gaps
           RV:         Reverse the resulting list (with the compute-and-assign
                        meta-operator : being abused to lower the precedence)
                       Auto-print, one sublist per line (implicit, -l flag)

1

QuadS , 15 + 1 = 16 byte

+1 byte cho 1cờ.

⊖⍵
(.)\1*
2/⍪⍵M

Hãy thử trực tuyến!

⊖⍵ hậu xử lý bằng cách lật ngược

(.)\1* chạy các nhân vật giống hệt nhau

2/⍪⍵M nhân đôi M atch cột

Các 1lá cờ gây ra kết quả phải được sáp nhập với nhau.


1

Haskell, 144 byte

f s=let x=groupBy(==)s;l=length;m=maximum(map l x)in concatMap(++"\n")$reverse$transpose$concat[[z,z]|z<-(map(\y->y++(replicate(m-(l y))' '))x)]

Tôi khá tự tin Tôi có thể làm tốt hơn thế này, nhưng đây là điều tốt nhất tôi có thể nghĩ ra trong thời điểm hiện tại.


1
Tin xấu trước tiên: bạn sử dụng các chức năng Data.Listkhông thuộc phạm vi theo mặc định. Bạn phải thêm import Data.Listsố đếm byte hoặc chỉ định môi trường Haskell theo mặc định bao gồm nó (ví dụ: thay đổi ngôn ngữ từ Haskellsang Haskell (lambdabot). - Một số mẹo: a) sử dụng các trình bảo vệ mẫu để liên kết các biến thay vì letvà / hoặc khai báo các hàm trợ giúp trực tiếp : l=length;f s|x<-groupBy(==)s,m<-... =concatMap. b) map l xl<$>x, c) concatMap("++\n"unlines. d) groupBy(==)chỉ là group. e) concatid=<<. Bạn mchỉ sử dụng một lần, vì vậy hãy nội tuyến nó
nimi

1
... f) không cần ()xung quanh l y, replicate ... ' 'map ... x. Tất cả trong tất cả : import Data.List;l=length;f s|x<-group s=unlines$reverse$transpose$id=<<[[z,z]|z<-map(\y->y++replicate(maximum(l<$>x)-l y)' ')x].
nimi

1
groupBy(==)= group, altough Tôi không chắc liệu một trong Prelude và cái kia không. concatMapcó thể được viết >>=mapcó thể được thêm vào như <$>, và concat[[z,z]|z<-…]có thể (replicate 2)=<<…hoặc(\z->[z,z])=<<…
Bergi

Bạn có thể cạo byte thêm một từ @ tip tuyệt vời Bergi của: (\z->[z,z])(:)<*>pure, tức là...transpose$(:)<*>pure=<<map(\y...)x
Tên mẫu




0

q / kdb +, 53 byte

Dung dịch:

{(|)(+)(,/)(max(#:)each c)$(+)2#(,)c:((&)differ x)_x}

Thí dụ:

 q){(|)(+)(,/)(max(#:)each c)$(+)2#(,)c:((&)differ x)_x}"BBPPPPxxGGGGKKKKKKKkkkkEEeeEEEeeEEEEEOOO8####xxXXX"
 "        KK                      "
 "        KK                      "
 "        KK          EE          "
 "  PP  GGKKkk        EE    ##    "
 "  PP  GGKKkk    EE  EEOO  ##  XX"
 "BBPPxxGGKKkkEEeeEEeeEEOO  ##xxXX"
 "BBPPxxGGKKkkEEeeEEeeEEOO88##xxXX"

Giải trình:

{reverse flip raze (max count each c)$flip 2#enlist c:(where differ x)_x} / ungolfed function
{                                                                       } / lambda function
                                                      (where differ x)    / indices where x differs
                                                                      _   / cut at these points aabbbc -> "aa","bbb","c"
                                                    c:                    / save in variable c
                                             enlist                       / put this list in another list
                                           2#                             / take two from this list (duplicate)
                                      flip                                / rotate columns/rows
                   (max count each c)                                     / find the longest run of characters
                                     $                                    / whitespace pad lists to this length
              raze                                                        / reduce down lists
         flip                                                             / rotate columns/rows
 reverse                                                                  / invert so buildings are on the ground

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.