Zbuduj mi miasto


34

Koderzy zawsze starają się spłaszczyć tablice w nudne jednowymiarowe byty i to mnie zasmuca.

Twoim zadaniem jest rozpłaszczenie dowolnego ciągu znaków, tworząc piękny miejski krajobraz.

Rozważ ciąg: aaabbbbbccqrrssstttttttPPw

Wygląda znacznie lepiej:

            tt
            tt
  bb        tt
  bb        tt
aabb      sstt
aabbcc  rrssttPP
aabbccqqrrssttPPww

(Ok, tak, litery są duplikowane, aby wyglądały bardziej na panoramę miasta).

Weź ciąg wejściowy, powiel każdą podsekcję pasujących znaków (niekoniecznie liter alfabetu) i zbuduj mi miasto!

Najkrótszy bajt kodu wygrywa.

Myślałem, że mam określone wymagania, ale muszę odpowiedzieć na kilka pytań:

  • musi leżeć na ziemi
  • możesz mieć dodatkowe niebo, jeśli chcesz (wiodące puste linie, otaczające puste miejsce) - ale nie między budynkami
  • litery mogą być ponownie użyte w ciągu (ta sama architektura, inna lokalizacja)
  • zakłada się, że litery są ASCII, ale bardziej sprytne zostaną te, które obsługują dodatkowe kodowanie (UTF8 itp.)

3
Czy możemy wygenerować panoramę miasta obróconą o 90 stopni?
Okx

6
Czy postacie kiedykolwiek powtórzą tj. aaabbbbaa?
TheLethalCoder

14
@Okx, czy widziałeś kiedyś miasto obrócone o 90 stopni, które wyglądałoby bardzo głupio! ;)
Tom

7
@ Tom może ..?
Rod

10
Witamy na stronie! W przypadku przyszłych wyzwań polecam opublikować je najpierw w piaskownicy, gdzie możesz uzyskać informacje zwrotne od społeczności, zanim opublikujesz je jako wyzwanie.
Dada

Odpowiedzi:


11

05AB1E , 6 bajtów

γ€DζR»

Wypróbuj online!

W wersji nowszej niż wyzwanie ζdodano jako zamiennik fo.Bø

05AB1E , 8 bajtów

γ€D.BøR»

Wyjaśnienie:

γ            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

Wypróbuj online!


1
Co ciekawe, Jelly ma z⁶dla .Bø... ale także Œgx'2dla γ€D> _>
Erik the Outgolfer

γ.BD)ø˜øR»to, co miałem bez patrzenia, €Djest o wiele lepsze; Wydaje mi się, że oboje brakuje nam 1-bajtowego rozwiązania do wbudowanego powielania.
Magiczna Urna Ośmiornicy

3
@MagicOctopusUrn Poczekaj, rozwiązałeś wyzwanie, nawet na niego nie patrząc?
Okx

@Okx Dobrze jest nie patrzeć na odpowiedzi wcześniej, ponieważ cała przyjemność z gry w golfa może zostać przerwana.
Erik the Outgolfer

@EriktheOutgolfer To był żart, a miałem na myśli to, że rozwiązał go, nie patrząc na treść wyzwania.
Okx

6

CJam , 23 bajty

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

Wypróbuj online!

Wyjaśnienie:

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, odpowiedź CJam> _>
Pan Xcoder

6

Galaretka , 9 bajtów

Œgx'2z⁶ṚY

Wypróbuj online!

Wyjaśnienie:

Œ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
Czy mógłbyś dodać wyjaśnienie, milordzie? Nie rozumiem, co się tutaj dzieje: o
Nathan


@HyperNeutrino Ładne wyjaśnienie ...
Erik the Outgolfer

Dla pewności, czy to prawda? : P
HyperNeutrino

@HyperNeutrino Cóż, to nie było całkowicie intencją ', było powtórzenie samych list, a nie elementów w nich zawartych , ale ogólnie rzecz biorąc, to dobrze. :)
Erik the Outgolfer

6

Python 3 , 155 136 134 132 bajtów

-19 bajtów dzięki @LeakyNun
-2 bajtów dzięki @officialaimm
-1 bajtów dzięki @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='')

Wypróbuj online!



5

Java 8, 412 400 330 324 312 319 bajtów

-6 bajtów dzięki VisualMelon
-12 bajtów dzięki Kevin Cruijssen,
ale +19 bajtów, ponieważ zapomniałem uwzględnić import w liczbie bajtów.

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

Wypróbuj online!


1
Gra w golfa Java i C # (mój dział) to świetna zabawa! Tak trzymać! Nie przetestowano, ale myślę, że możesz zaoszczędzić kilka bajtów, korzystając z pętli for: możesz wstępnie przypisać i=0, lub lepiej i=l, i odliczać for(;i-->0;h=d>h?d:h)(i wrzucać h=trochę tam). To samo liczenie wsteczne będzie działać również dla wewnętrznej pętli. Wewnętrzne ifrównież nie wymagają aparatów ortodontycznych {}. I zawsze bądź zmęczony <=lub >=, możesz odwrócić trójskładnik za pomocą >i uratować bajt.
VisualMelon

Dzięki, mogłem zgolić kolejne 6 bajtów kodu dzięki twoim wskazówkom. Cóż, myślę, że pozostanę przy Java Golfing, ponieważ mi się to podoba;).
Twometr

1
Witamy w PPCG! Obawiam się, że trzeba zwiększyć liczbę bajtów do 329 (+19 bajtów ze względu na wymagane import java.util.*;dla Mapi HashMapimport są częścią bajtów-count, a -1, usuwając Kończący średnik, który nie jest część liczby bajtów).
Kevin Cruijssen


1
Podsumowanie zmian: HashMap<>HashMap; Map n=,ni n=; m.put(c,d=m.get(c)!=null?d+1:1);wewnątrz pętli for, aby pozbyć się nawiasów; k=x.charAt(i)w środku, if(n.get(k)!=null)aby pozbyć się średników i wsporników pętli. Znowu witamy i świetna odpowiedź! +1 ode mnie Ponadto, jeśli jeszcze go nie widziałeś: Porady dotyczące gry w golfa w Javie i Porady dotyczące gry w golfa w <dowolnym języku> mogą być interesujące do przeczytania.
Kevin Cruijssen

5

Japt , 19 18 15 13 12 bajtów

Zawiera końcowe spacje w każdej linii.

ò¦
íU c ·z w

Sprawdź to


Wyjaśnienie

         :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 bajtów

(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 bajtów

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

Wypróbuj online!

czyta ze standardowego wejścia, zapisuje na standardowe wyjście (ze znakiem nowej linii).

Wyjaśnienie:

  • rle znajduje długość pasm postaci, wysokość każdej wieży.
  • subwyrażenie zastępuje każdy znak z jego double (więc nie trzeba syf o ustawienie sąsiadujące ze sobą indeksów)
  • sapply zwraca tablicę (w tym przypadku macierz):
    • sum(e$l|1)to liczba różnych znaków; idziemy od góry do dołu
    • ifelse( ... ) jest wektoryzacją if...else pozwalającą nam zbudować matrycę wież i podwójnych przestrzeni
    • write zapisuje na konsoli, z kilkoma opcjami formatowania.



2

MATL , 15 bajtów

'(.)\1*'XXtvc!P

Wypróbuj online!

Wyjaśnienie

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

Węgiel drzewny , 40 bajtów:

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

Wypróbuj online! Link jest do pełnej wersji kodu. Początkowo próbowałem prostej pętli nad ciągiem wejściowym, aby drukować podłużne za każdym razem, gdy zmieniała się litera, ale przełączyłem się na tę metodę budowania listy, ponieważ oszczędzała 5 bajtów. Objaśnienie: Zmienna lzawiera zagnieżdżoną listę liter wejściowych. Znaki pasujące do aktualnych ostatnich elementów listy są wypychane na ostatnią listę, w przeciwnym razie dla tej postaci tworzona jest nowa lista podrzędna. Następnie pozostaje połączyć litery w każdej podlistie, aby można je było dwukrotnie wydrukować pionowo.


2

C, 259 231 bajtów

Kod do gry w golfa

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

Pełny kod

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

}

Kompilowany z GCC, bez specjalnych flag

Edytować

Zaoszczędzono 28 bajtów dzięki Adelphusowi. Jego zmiana pozwoliła mi stworzyć definicję. I utworzyłem pętle while w pętlach for, aby zaoszczędzić 2 bajty, zmieniając układ pętli. Rozwiązałem również problem polegający na tym, że kod pękał, gdy ostatni wprowadzony znak nie był singletonem. Kod zawiedzie, jeśli jest tylko jedna unikalna litera, ale powinien działać we wszystkich innych przypadkach.


Miły! Ale z jakiegoś powodu wydaje się, że wersja z golfem nie działa z dowolnymi danymi wejściowymi. Usunięcie końcowego „w” z próbki wejściowej wydaje się tracić q i powtórzyć ciąg. Pewnie, że to coś małego ...
Adelphus

również while (i < strlen(argv[1])) można skrócić do while (argv[1][i])pętli, aż znak null
adelphus

@adelphus Ciekawe, wypróbuję to jutro, kiedy będę miał szansę. Nie testowałem niczego poza danym przypadkiem testowym (leniwy wiem).
dj0wns

To faktycznie pomogło tonie, udało mi się rozwiązać problem i zmniejszyć o prawie 30 bajtów!
dj0wns

1

Pypeć , 22 bajty

21 bajtów kodu, +1 dla -lflagi.

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

Wypróbuj online!

Wyjaśnienie

                       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 bajtów

+1 bajt dla 1flagi.

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

Wypróbuj online!

⊖⍵ post-proces przez odwrócenie do góry nogami

(.)\1* przebiegi identycznych znaków

2/⍪⍵M zduplikowane columnified M atch

1Flaga powoduje, że wyniki mają być połączone ze sobą.


1

Haskell, 144 bajty

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

Jestem przekonany, że mogę to zrobić lepiej, ale na razie to najlepsze, co mogę wymyślić.


1
Najpierw złe wiadomości: korzystasz z funkcji, Data.Listktóre domyślnie nie są objęte zakresem. Musisz albo dodać import Data.Listdo liczby bajtów, albo określić środowisko Haskell, które domyślnie je zawiera (np. Zmień język z Haskellna Haskell (lambdabot). - Kilka wskazówek: a) użyj strażników wzorców do wiązania zmiennych zamiast leti / lub deklarowania funkcji pomocniczych bezpośrednio: l=length;f s|x<-groupBy(==)s,m<-... =concatMap. b) map l xjest l<$>x, c) concatMap("++\n"jest unlines. d) groupBy(==)jest sprawiedliwy group. e) concatjest id=<<. Używasz mtylko raz, więc wstaw to
nimi

1
... f) nie potrzeba ()ok l y, replicate ... ' 'i map ... x. W sumie: 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, chociaż nie jestem pewien, czy jedno jest w Preludium, a drugie nie. concatMapmogą być napisane >>=i mapmogą być dodane jako <$>, i concat[[z,z]|z<-…]mogą być (replicate 2)=<<…lub(\z->[z,z])=<<…
Bergi

Możesz ogolić jeszcze jeden bajt z doskonałej wskazówki @ Bergi: (\z->[z,z])is (:)<*>pure, tj...transpose$(:)<*>pure=<<map(\y...)x
nimi




0

q / kdb +, 53 bajty

Rozwiązanie:

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

Przykład:

 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"

Wyjaśnienie:

{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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.