Costruiscimi una città


34

I programmatori cercano sempre di appiattire le matrici in noiose entità monodimensionali e questo mi rende triste.

Il tuo compito è di appiattire una serie arbitraria di personaggi, dando vita a un incantevole skyscape cittadino.

Considera la stringa: aaabbbbbccqrrssstttttttPPw

Sembra molto meglio così:

            tt
            tt
  bb        tt
  bb        tt
aabb      sstt
aabbcc  rrssttPP
aabbccqqrrssttPPww

(Ok, sì, le lettere sono duplicate per far sembrare più lo skyline della città).

Prendi una stringa di input, duplica ogni sottosezione di caratteri corrispondenti (non necessariamente lettere alfabetiche) e costruiscimi una città!

Vincono i byte di codice più brevi.

In realtà pensavo di avere i requisiti inchiodati, ma per rispondere ad alcune domande:

  • deve essere a terra
  • puoi avere del cielo extra se vuoi (linee vuote iniziali, spazio vuoto circostante) - ma non tra gli edifici
  • le lettere possono essere riutilizzate all'interno della stringa (stessa architettura, posizione diversa)
  • si presume che le lettere siano ASCII, ma verrà dato più fascino a quelli che supportano codifiche aggiuntive (UTF8, ecc.)

3
Possiamo produrre il paesaggio urbano ruotato di 90 gradi?
Okx,

6
I personaggi si ripeteranno mai di nuovo aaabbbbaa?
TheLethalCoder il

14
@Okx hai mai visto una città ruotata di 90 gradi, sembrerebbe molto sciocca! ;)
Tom,

7
Rod,

10
Benvenuti nel sito! Per sfide future, ti consiglio di pubblicarle prima nella Sandbox dove puoi ricevere feedback dalla community prima di pubblicarla come una sfida.
Dada,

Risposte:


11

05AB1E , 6 byte

γ€DζR»

Provalo online!

In una versione più recente della sfida, ζè stato aggiunto un sostituto per.Bø

05AB1E , 8 byte

γ€D.BøR»

Spiegazione:

γ            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

Provalo online!


1
È interessante notare che Jelly ha z⁶per .Bø... ma anche Œgx'2per γ€D> _>
Erik the Outgolfer,

γ.BD)ø˜øR»era quello che avevo senza guardare, €Dè molto meglio; Sento che ci manca la soluzione a 1 byte per incorporare la duplicazione.
Magic Octopus Urn,

3
@MagicOctopusUrn Aspetta, hai risolto la sfida senza nemmeno guardarla?
Okx,

@Okx Beh, è ​​saggio non guardare le risposte prima dato che tutto il divertimento del golf da solo potrebbe essere tagliato.
Erik the Outgolfer,

@EriktheOutgolfer Era uno scherzo, e intendo dire che lo ha risolto senza guardare al contenuto della sfida.
Okx,

6

CJam , 23 byte

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

Provalo online!

Spiegazione:

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, una risposta CJam> _>
Mr. Xcoder,

6

Gelatina , 9 byte

Œgx'2z⁶ṚY

Provalo online!

Spiegazione:

Œ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
Potresti aggiungere una spiegazione, per favore, Milord? Non riesco a capire cosa sta succedendo qui: o
Nathan,


@HyperNeutrino Bella spiegazione ...
Erik the Outgolfer,

Solo per essere sicuri, è corretto? : P
HyperNeutrino,

@HyperNeutrino Beh, non era del tutto intenzionale ', che era quello di ripetere le liste stesse e non gli elementi al loro interno, ma nel complesso è buono. :)
Erik the Outgolfer,

6

Python 3 , 155 136 134 132 byte

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

Provalo online!



5

Java 8, 412 400 330 324 312 319 byte

-6 byte grazie a VisualMelon
-12 byte grazie a Kevin Cruijssen
ma +19 byte perché ho dimenticato di includere le importazioni nel conteggio dei 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);}}}

Provalo online!


1
Giocare a golf Java e C # (il mio dipartimento) è molto divertente! Continua così! Non testato, ma penso che puoi salvare alcuni byte riguadagnando i loop for: puoi pre-assegnare i=0, o meglio i=l, e contare alla rovescia for(;i-->0;h=d>h?d:h)(e riempire il h=bit lì dentro). Lo stesso conteggio indietro funzionerà anche per il ciclo interno. Anche l'interno ifnon ha bisogno delle parentesi graffe {}. Ed essere sempre stanco di <=o >=, è possibile attivare il ternario in giro con >e Salva un byte.
VisualMelon,

Grazie, potrei radere altri 6 byte dal codice grazie ai tuoi consigli. Bene, penso che starò con Java Golfing dal momento che mi piace davvero;).
Twometer,

1
Benvenuti in PPCG! Temo che dovrai aumentare il conteggio dei byte a 329 (+19 byte a causa del necessario import java.util.*;per Mape HashMap, le importazioni fanno parte del conteggio dei byte; e -1 rimuovendo il punto e virgola finale, che non è parte del conteggio dei byte).
Kevin Cruijssen,


1
Riepilogo delle modifiche: HashMap<>HashMap; Map n=,ne n=; m.put(c,d=m.get(c)!=null?d+1:1);all'interno del for-loop per eliminare le staffe; k=x.charAt(i)all'interno di if(n.get(k)!=null)per sbarazzarsi del punto e virgola e delle parentesi for-loop. Ancora una volta, benvenuto e ottima risposta! +1 da me. Inoltre, nel caso in cui non l'avessi ancora visto: Suggerimenti per giocare a golf in Java e suggerimenti per giocare a golf in <qualsiasi lingua> potrebbero essere interessanti da leggere.
Kevin Cruijssen,

5

Japt , 19 18 15 13 12 byte

Include spazi finali su ogni riga.

ò¦
íU c ·z w

Provalo


Spiegazione

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

Provalo online!

legge da stdin, scrive su stdout (con una nuova riga finale).

Spiegazione:

  • rle trova le lunghezze delle strisce di personaggi, le altezze di ogni torre.
  • il sub espressione sostituisce ogni personaggio con il suo doppio (quindi non ho dovuto preoccuparmi di mettere insieme gli indici adiacenti)
  • sapply restituisce un array (in questo caso una matrice):
    • sum(e$l|1)è il numero di caratteri distinti; andiamo dall'alto verso il basso
    • ifelse( ... ) è un vettore if...else che ci consente di costruire una matrice di torri e doppi spazi
    • write scrive sulla console, con alcune opzioni per formattare.



2

MATL , 15 byte

'(.)\1*'XXtvc!P

Provalo online!

Spiegazione

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

Carbone , 40 byte:

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Inizialmente ho provato un semplice ciclo sopra la stringa di input per stampare oblungamente ogni volta che la lettera veniva cambiata, ma sono passato a questo metodo di creazione di elenchi salvando 5 byte. Spiegazione: La variabile lcontiene un elenco nidificato delle lettere di input. I caratteri che corrispondono agli ultimi elementi dell'elenco corrente vengono inseriti nell'ultimo elenco, altrimenti viene creato un nuovo elenco secondario per quel personaggio. Resta quindi da unire le lettere in ciascun elenco secondario in modo che possano essere stampate verticalmente due volte.


2

C, 259 231 byte

Codice Golfed

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

Codice dettagliato

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

}

Compilato con GCC, nessuna bandiera speciale

modificare

Risparmiato 28 byte grazie ad adelphus. Il suo cambiamento mi ha permesso di creare una definizione. E ho fatto il ciclo while in loop per salvare 2 byte ciascuno riorganizzando il loop. Ho anche risolto un problema in cui il codice si sarebbe rotto quando l'ultimo carattere in input non era singleton. Il codice fallirà se esiste una sola lettera univoca ma dovrebbe funzionare in tutti gli altri casi.


Bello! Ma la versione golfata non sembra funzionare con input arbitrari per qualche motivo. La rimozione della "w" finale dall'input del campione sembra perdere le q e ripetere la stringa. Certo è qualcosa di piccolo ...
Adelphus,

inoltre while (i < strlen(argv[1]))può essere abbreviato in while (argv[1][i])- loop fino a carattere null
adelphus il

@adelphus Interessante, lo proverò domani quando ne avrò la possibilità. Non ho testato nient'altro che il caso di test dato (pigro lo so).
dj0wns

Ciò ha effettivamente aiutato un sacco, sono stato in grado di risolvere il problema e ridurre di quasi 30 byte!
dj0wns

1

Pip , 22 byte

21 byte di codice, +1 per la -lbandiera.

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

Provalo online!

Spiegazione

                       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 per la 1bandiera.

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

Provalo online!

⊖⍵ post-processo capovolgendo

(.)\1* serie di personaggi identici

2/⍪⍵M duplicare il M atch colonnato

Il 1flag fa sì che i risultati vengano uniti.


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

Sono abbastanza fiducioso di poter fare meglio di così, ma questo è il meglio che posso inventare per il momento.


1
Prima le cattive notizie: si utilizzano funzioni da Data.Listcui non rientra nell'ambito predefinito. Devi aggiungere il import Data.Listconteggio dei byte o specificare un ambiente Haskell che lo includa per impostazione predefinita (ad esempio, cambia la lingua da Haskella Haskell (lambdabot). - Alcuni suggerimenti: a) usa le protezioni dei motivi per associare le variabili anziché lete / o dichiarare le funzioni di supporto direttamente: l=length;f s|x<-groupBy(==)s,m<-... =concatMap. b) map l xè l<$>x, c) concatMap("++\n"è unlines. d) groupBy(==)è giusto group. e) concatè id=<<. Usi msolo una volta, quindi in linea
nimi,

1
... f) non c'è bisogno di in ()giro l y, replicate ... ' 'e map ... x. Tutto sommato: 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, anche se non sono sicuro che uno sia in Preludio e l'altro no. concatMappuò essere scritto >>=e mappuò essere aggiunto come <$>, e concat[[z,z]|z<-…]potrebbe essere (replicate 2)=<<…o(\z->[z,z])=<<…
Bergi,

È possibile radere via un altro byte dal consiglio eccellente di @ Bergi: (\z->[z,z])è (:)<*>pure, cioè...transpose$(:)<*>pure=<<map(\y...)x
nimi,




0

q / kdb +, 53 byte

Soluzione:

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

Esempio:

 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"

Spiegazione:

{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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.