Bangunkan aku kota


34

Coders selalu mencoba untuk meratakan array menjadi entitas 1-dimensi yang membosankan dan itu membuat saya sedih.

Tugas Anda adalah untuk menghapus serangkaian karakter yang berubah-ubah, menghasilkan skyscape kota yang indah.

Pertimbangkan string: aaabbbbbccqrrssstttttttPPw

Terlihat jauh lebih baik seperti ini:

            tt
            tt
  bb        tt
  bb        tt
aabb      sstt
aabbcc  rrssttPP
aabbccqqrrssttPPww

(Ok, ya, surat-surat itu digandakan agar terlihat lebih seperti kota-langit).

Ambil string input, duplikat setiap subbagian karakter yang cocok (tidak harus huruf alfabet) dan bangunkan saya kota!

Byte kode terpendek menang.

Saya benar-benar berpikir saya memiliki persyaratan dipaku, tetapi untuk menjawab beberapa pertanyaan:

  • itu harus di tanah
  • Anda dapat memiliki langit tambahan jika diinginkan (memimpin garis kosong, mengelilingi ruang kosong) - tetapi tidak di antara bangunan
  • huruf dapat digunakan kembali di dalam string (arsitektur yang sama, lokasi berbeda)
  • surat-surat itu dianggap ASCII, tetapi lebih banyak bakat akan diberikan kepada mereka yang mendukung penyandian tambahan (UTF8, dll)

3
Bisakah kita menampilkan cityscape diputar 90 derajat?
Okx

6
Akankah karakter yang akan diulang lagi yaitu aaabbbbaa?
TheLethalCoder

14
@Okx apakah Anda pernah melihat kota diputar 90 derajat, itu akan terlihat sangat konyol! ;)
Tom

7
@ Tom, mungkin ..?
Rod

10
Selamat datang di situs ini! Untuk tantangan di masa mendatang, saya sarankan mempostingnya terlebih dahulu di Sandbox di mana Anda bisa mendapatkan umpan balik dari komunitas sebelum mempostingnya sebagai tantangan.
Dada

Jawaban:


11

05AB1E , 6 byte

γ€DζR»

Cobalah online!

Dalam versi yang lebih baru daripada tantangan, ζtelah ditambahkan sebagai pengganti.Bø

05AB1E , 8 byte

γ€D.BøR»

Penjelasan:

γ            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

Cobalah online!


1
Menariknya, Jelly memiliki z⁶untuk .Bø... tetapi juga memiliki Œgx'2untuk γ€D> _>
Erik the Outgolfer

γ.BD)ø˜øR»adalah apa yang saya miliki tanpa melihat, €Djauh lebih baik; Saya merasa seperti kita berdua kehilangan solusi 1-byte untuk duplikasi inline.
Magic Gurita Guci

3
@ MagicOctopusUrn Tunggu, Anda memecahkan tantangan tanpa melihatnya?
Okx

@ OKK Yah, sebaiknya jangan melihat jawaban sebelumnya karena kesenangan bermain golf sendiri bisa terputus.
Erik the Outgolfer

@EriktheOutgolfer Itu adalah lelucon, dan maksud saya adalah dia menyelesaikannya tanpa melihat isi tantangannya.
Okx

6

CJam , 23 byte

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

Cobalah online!

Penjelasan:

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

Wow, jawaban CJam> _>
Tn. Xcoder

6

Jelly , 9 byte

Œgx'2z⁶ṚY

Cobalah online!

Penjelasan:

Œ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
Bisakah Anda menambahkan penjelasan? Saya tidak mengerti apa yang terjadi di sini: o
Nathan


@HyperNeutrino Penjelasan yang bagus ...
Erik the Outgolfer

Hanya untuk memastikan, apakah itu benar? : P
HyperNeutrino

@HyperNeutrino Ya, itu bukan maksud sepenuhnya ', yaitu mengulang daftar sendiri dan bukan item di dalamnya, tapi secara keseluruhan itu bagus. :)
Erik the Outgolfer

6

Python 3 , 155 136 134 132 byte

-19 byte berkat @LeakyNun
-2 byte berkat @officialaimm
-1 byte berkat @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='')

Cobalah online!



5

Java 8, 412 400 330 324 312 319 byte

-6 byte terima kasih kepada VisualMelon
-12 byte terima kasih kepada Kevin Cruijssen
tetapi +19 byte karena saya lupa memasukkan impor dalam hitungan 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);}}}

Cobalah online!


1
Golf Java dan C # (departemen saya) sangat menyenangkan! Tetaplah begitu! Tidak diuji, tetapi saya pikir Anda dapat menyimpan beberapa byte dengan rejigging loop untuk: Anda dapat melakukan pra-penetapan i=0, atau lebih baik i=l,, dan menghitung mundur for(;i-->0;h=d>h?d:h)(dan memasukkan h=sedikit di sana). Penghitungan mundur yang sama juga akan bekerja untuk loop dalam. Bagian dalam ifjuga tidak membutuhkan kawat gigi {}. Dan selalu bosan <=atau >=, Anda dapat membalikkan terner dengan >dan menyimpan byte.
VisualMelon

Terima kasih, saya bisa mencukur 6 byte lagi dari kode berkat tips Anda. Yah, saya pikir saya akan tetap dengan Java Golfing karena saya benar-benar menyukainya;).
Twometer

1
Selamat datang di PPCG! Saya khawatir Anda harus meningkatkan byte-count menjadi 329 (+19 byte karena diperlukan import java.util.*;untuk Mapdan HashMap, impor adalah bagian dari byte-count; dan -1 dengan menghapus trailing semi-colon, yang tidak bagian dari byte-count).
Kevin Cruijssen


1
Ringkasan perubahan: HashMap<>HashMap; Map n=,ndan n=; m.put(c,d=m.get(c)!=null?d+1:1);di dalam for-loop untuk menyingkirkan tanda kurung; k=x.charAt(i)di dalam if(n.get(k)!=null)untuk menyingkirkan tanda kurung semi-kolon dan for-loop. Sekali lagi, selamat datang dan jawaban yang bagus! +1 dari saya. Juga, jika Anda belum melihatnya: Tips untuk bermain golf di Jawa dan Tips untuk bermain golf di <bahasa apa pun> mungkin menarik untuk dibaca.
Kevin Cruijssen

5

Japt , 19 18 15 13 12 byte

Termasuk spasi tambahan di setiap baris.

ò¦
íU c ·z w

Menguji


Penjelasan

         :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

Mathematica, 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),,'')

Cobalah online!

membaca dari stdin, menulis ke stdout (dengan trailing newline).

Penjelasan:

  • rle menemukan panjang garis-garis karakter, ketinggian masing-masing menara.
  • yang subekspresi menggantikan masing-masing karakter dengan yang ganda (jadi saya tidak perlu bergelandangan dengan pengaturan indeks yang berdekatan bersama-sama)
  • sapply mengembalikan array (dalam hal ini sebuah matriks):
    • sum(e$l|1)adalah jumlah karakter yang berbeda; kita pergi dari atas ke bawah
    • ifelse( ... )adalah vektor yang if...elsememungkinkan kita untuk membangun matriks menara dan ruang ganda
    • write menulis ke konsol, dengan beberapa opsi untuk memformat.



2

MATL , 15 byte

'(.)\1*'XXtvc!P

Cobalah online!

Penjelasan

'(.)\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

Arang , 40 byte:

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Saya awalnya mencoba loop sederhana pada string input untuk mencetak lonjong setiap kali surat itu berubah, tapi saya beralih ke metode pembuatan daftar ini karena menghemat 5 byte. Penjelasan: Variabel lberisi daftar bersarang dari huruf input. Karakter yang cocok dengan elemen daftar terakhir saat ini didorong ke daftar terakhir jika tidak, sublist baru dibuat untuk karakter tersebut. Kemudian tetap bergabung dengan huruf-huruf di setiap sublist sehingga mereka dapat dicetak dua kali secara vertikal.


2

C, 259 231 Bytes

Kode Golf

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

Kode Verbose

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

}

Disusun dengan GCC, tidak ada Bendera khusus

Edit

Disimpan 28 byte berkat adelphus. Perubahannya memungkinkan saya untuk membuat definisi. Dan saya membuat loop sementara untuk loop untuk menyimpan masing-masing 2 byte dengan mengatur ulang loop. Saya juga memperbaiki masalah di mana kode akan terputus ketika karakter terakhir dalam input tidak tunggal. Kode akan gagal jika hanya ada satu huruf unik tetapi harus berfungsi dalam semua kasus lainnya.


Bagus! Tetapi versi golf sepertinya tidak bekerja dengan input sewenang-wenang karena beberapa alasan. Menghapus "w" terakhir dari input sampel tampaknya kehilangan q dan mengulangi string. Tentu itu sesuatu yang kecil ...
adelphus

also while (i < strlen(argv[1])) can be shortened to while (argv[1][i]) - loop until null character
adelphus

@adelphus Interesting, I'll try it out tomorrow when I get a chance. I did not test anything other than the given test case (lazy I know).
dj0wns

That actually helped a ton, I was able to fix the problem and reduce by almost 30 bytes!
dj0wns

1

Pip, 22 bytes

21 bytes of code, +1 for -l flag.

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

Try it online!

Explanation

                       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 bytes

+1 byte for the 1 flag.

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

Try it online!

⊖⍵ post-process by flipping upside down

(.)\1* runs of identical characters

2/⍪⍵M duplicate the columnified Match

The 1 flag causes the results to be merged together.


1

Haskell, 144 bytes

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

I'm pretty confident I can do better than this, but this is the best I can come up with for the time being.


1
Bad news first: you use functions from Data.List which is not in scope by default. You have to either add the import Data.List to the byte count or specify a Haskell environment which does include it by default (e.g. change the language from Haskell to Haskell (lambdabot). -- Some tips: a) use pattern guards to bind variables instead of let and/or declare helper functions directly: l=length;f s|x<-groupBy(==)s,m<-... =concatMap. b) map l x is l<$>x, c) concatMap("++\n" is unlines. d) groupBy(==) is just group. e) concat is id=<<. You use m only once, so inline it
nimi

1
... f) no need for () around l y, replicate ... ' ' and map ... x. All in all: 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 I'm not sure whether one is in Prelude and the other isn't. concatMap can be written >>=, and map can be infixed as <$>, and concat[[z,z]|z<-…] might be (replicate 2)=<<… or (\z->[z,z])=<<…
Bergi

You can shave off one more byte from @Bergi's excellent tip: (\z->[z,z]) is (:)<*>pure, i.e. ...transpose$(:)<*>pure=<<map(\y...)x
nimi




0

q/kdb+, 53 bytes

Solution:

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

Example:

 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"

Explanation:

{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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.