나에게 도시를 건설


34

코더는 항상 배열을 지루한 1 차원 엔터티로 평면화하려고 노력하며 슬프게 만듭니다.

당신의 임무는 임의의 문자열을 풀어서 아름다운 도시의 하늘을 출력하는 것입니다.

문자열을 고려하십시오. aaabbbbbccqrrssstttttttPPw

다음과 같이 훨씬 나아 보입니다 :

            tt
            tt
  bb        tt
  bb        tt
aabb      sstt
aabbcc  rrssttPP
aabbccqqrrssttPPww

(예, 글자가 복제되어 더 도시-스카이 라인으로 보이게됩니다).

입력 문자열을 가져와 일치하는 문자의 각 하위 섹션을 복제하고 (알파벳 문자 일 필요는 없음) 도시를 건설하십시오!

가장 짧은 코드 바이트가 이깁니다.

실제로 요구 사항이 해결되었다고 생각했지만 몇 가지 질문에 대답했습니다.

  • 그것은 지상에 있어야합니다
  • 당신이 원한다면 여분의 하늘을 가질 수 있습니다 (빈 공간을 둘러싼 빈 줄)-건물 사이에는 없습니다.
  • 문자열 내에서 문자를 재사용 할 수 있음 (동일한 아키텍처, 다른 위치)
  • 문자는 ASCII로 가정되지만 추가 인코딩 (UTF8 등)을 지원하는 문자에는 더 많은 감각이 부여됩니다

3
도시를 90도 회전하여 출력 할 수 있습니까?
Okx

6
문자가 다시 반복 aaabbbbaa됩니까?
TheLethalCoder 2018 년

14
@Okx는 90도 회전 한 도시를 본 적이 있습니다. ;)
Tom

7
@Tom ..?
Rod

10
사이트에 오신 것을 환영합니다! 향후 과제에 대해서는 도전 과제로 게시 하기 전에 커뮤니티에서 피드백을받을 수 있는 샌드 박스에 먼저 게시하는 것이 좋습니다 .
Dada

답변:


11

05AB1E , 6 바이트

γ€DζR»

온라인으로 사용해보십시오!

챌린지보다 새로운 버전에서는 다음 ζ과 같은 대체품으로 추가되었습니다..Bø

05AB1E , 8 바이트

γ€D.BøR»

설명:

γ            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

온라인으로 사용해보십시오!


1
흥미롭게도, 젤리는이 z⁶를 위해 .Bø...하지만 그것은 또한이 Œgx'2에 대한 γ€D> _>
Outgolfer 에릭

γ.BD)ø˜øR»내가 보지 않고 가지고 있었던 €D것은 더 나아 졌습니다 . 인라인 복제를위한 1 바이트 솔루션이 모두 누락 된 것 같습니다.
Magic Octopus Urn

3
@MagicOctopusUrn 잠깐만, 당신은 그것을 보지 않고 도전을 해결 했습니까?
Okx

@Okx 글쎄, 골프를 치는 모든 재미가 잘릴 수 있기 때문에 대답을 보지 않는 것이 현명합니다.
아웃 골퍼 에릭

@EriktheOutgolfer 농담이었고, 제 말은 그가 도전의 내용을 보지 않고 그것을 해결했다는 것입니다.
Okx

6

CJam , 23 바이트

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

온라인으로 사용해보십시오!

설명:

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

와우, CJam 답변> _>
Mr. Xcoder

6

젤리 , 9 바이트

Œgx'2z⁶ṚY

온라인으로 사용해보십시오!

설명:

Œ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
설명을 추가해 주시겠습니까? 나는 여기서 무슨 일이 일어나고 있는지 이해할 수 없다 : o
Nathan


@HyperNeutrino 멋진 설명 ...
Outgolfer Erik

확실하게 맞습니까? : P
HyperNeutrino 2016 년

@HyperNeutrino 글쎄, 그건 완전히 의도가 아니 '었습니다. 목록 자체를 반복하고 내부의 항목을 반복하는 것이 아니라 전체적으로 좋습니다. :)
Outgolfer Erik

6

파이썬 (3) , 155 (136) 134 132 바이트

@LeakyNun 덕분에 -19 바이트, @officialaimm 덕분에
-2 바이트 @Wondercricket 덕분에
-1 바이트

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

온라인으로 사용해보십시오!



5

자바 (8) 412 400 330 324 312 319 바이트

VisualMelon 덕분에 -6 바이트
Kevin Cruijssen 덕분에 -12 바이트
지만 바이트 수에 가져 오기를 포함하는 것을 잊었 기 때문에 +19 바이트.

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

온라인으로 사용해보십시오!


1
Golfing Java 및 C # (내 부서)은 매우 재미 있습니다! 견디어 내다! 아니 테스트,하지만 난 당신이 루프의를 rejigging하여 몇 바이트를 저장할 수 있다고 생각 : 당신은-사전에 할당 할 수 있습니다 i=0, 또는 더 나은, i=l그리고 카운트 다운 for(;i-->0;h=d>h?d:h)(과 물건을 h=거기에 비트). 내부 루프에도 동일한 백 카운팅이 작동합니다. 내부 if는 중괄호가 필요 없습니다 {}. 항상 <=또는 로 지친 상태이므로 >=삼항을 돌려서 >바이트를 저장할 수 있습니다 .
VisualMelon

감사합니다. 팁 덕분에 코드에서 6 바이트를 더 줄일 수 있습니다. 글쎄, 나는 실제로 그것을 좋아하기 때문에 Java Golfing에 머무를 것이라고 생각합니다.).
Twometer

1
PPCG에 오신 것을 환영합니다! 난 당신 때문에 필요에 329 (+19 바이트 바이트 수를 증가해야 될 것 같아요 import java.util.*;위해 MapHashMap수입 바이트 카운트의 일부, 그리고 -1 아닌 세미콜론, 후행 제거하여 바이트 수의 일부).
Kevin Cruijssen


1
변경 사항 요약 : HashMap<>HashMap; Map n=,nn=; m.put(c,d=m.get(c)!=null?d+1:1);for-loop 내부에서 브래킷을 제거합니다. k=x.charAt(i)안에 if(n.get(k)!=null)세미콜론과 for-loop의 괄호를 제거하십시오. 다시 한번 환영하고 좋은 답변입니다! 나에게서 +1 또한 아직 보지 못한 경우 : Java 에서 골프를하기위한 팁<any language>에서 골프를하기위한 팁은 읽는 것이 흥미로울 수 있습니다.
Kevin Cruijssen 2016 년

5

Japt , 19 18 15 13 12 바이트

각 줄에 후행 공백을 포함합니다.

ò¦
íU c ·z w

그것을 테스트


설명

         :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 바이트

(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 바이트

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

온라인으로 사용해보십시오!

stdin에서 읽고 stdout에 씁니다 (후행 줄 바꿈).

설명:

  • rle 문자의 줄 길이, 각 탑의 높이를 찾습니다.
  • sub표현은 각 문자를 이중으로 대체합니다 (따라서 인접한 색인을 함께 설정하는 것에 대해 고민 할 필요가 없습니다)
  • sapply 배열 (이 경우 행렬)을 반환합니다.
    • sum(e$l|1)고유 문자 수입니다. 우리는 위에서 아래로 간다
    • ifelse( ... )if...else우리는 타워와 이중 공간의 행렬을 만들 수 있도록 벡터화 된 것입니다.
    • write 몇 가지 옵션을 지정하여 콘솔에 씁니다.



2

MATL , 15 바이트

'(.)\1*'XXtvc!P

온라인으로 사용해보십시오!

설명

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

, 40 바이트 :

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 원래 문자가 변경 될 때마다 직사각형을 인쇄하기 위해 입력 문자열에 간단한 루프를 시도했지만 5 바이트를 절약 하면서이 목록 작성 방법으로 전환했습니다. 설명 : 변수 l에 입력 문자의 중첩 된 목록이 있습니다. 현재 마지막 목록 요소와 일치하는 문자가 마지막 목록으로 푸시됩니다. 그렇지 않으면 해당 문자에 대한 새 하위 목록이 작성됩니다. 그런 다음 각 하위 목록의 문자를 결합하여 세로로 두 번 인쇄 할 수 있습니다.


2

C, 259231 바이트

골프 코드

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

자세한 코드

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

}

특수 플래그없이 GCC로 컴파일

편집하다

adelphus 덕분에 28 바이트를 절약했습니다. 그의 변화로 정의를 만들 수있었습니다. 그리고 루프를 재정렬하여 while 루프를 for 루프로 만들어 각각 2 바이트를 절약했습니다. 또한 입력의 마지막 문자가 싱글 톤이 아닌 경우 코드가 중단되는 문제를 수정했습니다. 고유 한 문자가 하나만 있지만 다른 모든 경우에는 작동해야합니다.


좋은! 그러나 골프 버전은 어떤 이유로 든 임의의 입력으로 작동하지 않는 것 같습니다. 샘플 입력에서 최종 "w"를 제거하면 q가 손실되고 문자열이 반복됩니다. 그것은 작은 것입니다 ...
adelphus

또한 while (i < strlen(argv[1]))단축 할 수 있습니다 while (argv[1][i])널 (null) 문자까지 루프 -
아델 푸스

@adelphus 흥미 롭습니다. 기회가된다면 내일 시험해 보도록하겠습니다. 주어진 테스트 케이스 이외의 다른 것을 테스트하지 않았습니다 (lazy I know).
dj0wns 2016 년

실제로 톤을 도왔습니다. 문제를 해결하고 거의 30 바이트를 줄일 수있었습니다!
dj0wns 2016 년

1

, 22 바이트

21 바이트 코드, -l플래그는 +1

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

온라인으로 사용해보십시오!

설명

                       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 바이트

1플래그의 경우 +1 바이트

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

온라인으로 사용해보십시오!

⊖⍵ 뒤집어서 후 처리

(.)\1* 동일한 문자로 실행

2/⍪⍵M 컬럼 화 된 M atch를 복제하십시오

1플래그는 결과를 함께 병합됩니다.


1

하스켈, 144 바이트

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

나는 이것보다 더 잘할 수 있다고 확신하지만, 당분간 내가 할 수있는 최선입니다.


1
나쁜 소식은 우선 : Data.List기본적으로 범위를 벗어난 기능을 사용 하는 것입니다. import Data.List바이트 수에를 추가 하거나 기본적으로 포함하는 Haskell 환경을 지정해야합니다 (예 : 언어를에서 Haskell로 변경하십시오 Haskell (lambdabot).-몇 가지 팁 : a) 패턴 가드를 사용하여 변수 대신 바인딩 let하거나 도우미 함수를 선언하십시오. 직접 : l=length;f s|x<-groupBy(==)s,m<-... =concatMap. b) map l x이고 l<$>x, c)는 concatMap("++\n"이다 unlines. d) groupBy(==)는 단지 group입니다. e) concatid=<<입니다. m한 번만 사용 하므로 인라인으로 사용
nimi

1
... F)에 대한 필요 ()주위 l y, replicate ... ' '그리고 map ... x. 전체적으로 : 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, 나는 확실히 하나 서곡에 있고 다른 하나는 아닌지 모르겠어요 입력해도. concatMap쓸 수있는 >>=, 그리고 map같이 infixed 할 수 있습니다 <$>, 그리고 concat[[z,z]|z<-…]수 있습니다 (replicate 2)=<<…또는(\z->[z,z])=<<…
BERGI

@Bergi의 훌륭한 팁에서 더 많은 바이트를 깎을 수있다 : (\z->[z,z])is (:)<*>pure, 즉...transpose$(:)<*>pure=<<map(\y...)x
nimi




0

q / kdb +, 53 바이트

해결책:

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

예:

 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"

설명:

{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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.