สร้างเมืองให้ฉัน


34

โคเดอร์มักจะพยายามทำให้อาร์เรย์เป็นหน่วยมิติที่น่าเบื่อและทำให้ฉันเศร้า

งานของคุณคือการคลายตัวอักษรตามอำเภอใจโดยไม่แสดงตัวออกมาทำให้เมืองน่ารัก

พิจารณาสตริง: aaabbbbbccqrrssstttttttPPw

มันดูดีกว่านี้มาก:

            tt
            tt
  bb        tt
  bb        tt
aabb      sstt
aabbcc  rrssttPP
aabbccqqrrssttPPww

(โอเคใช่ตัวอักษรนั้นซ้ำกันเพื่อทำให้ดูเมืองเส้นขอบฟ้ามากขึ้น)

ใช้สตริงอินพุตทำซ้ำส่วนย่อยของอักขระที่ตรงกัน (ไม่จำเป็นต้องเป็นตัวอักษรและ) และสร้างเมืองให้ฉัน!

ไบต์รหัสสั้นที่สุดชนะ

จริง ๆ แล้วฉันคิดว่าฉันมีข้อกำหนดที่ต้องจับ แต่เพื่อตอบคำถาม:

  • มันจะต้องอยู่บนพื้นดิน
  • คุณสามารถมีท้องฟ้าเพิ่มถ้าคุณต้องการ (นำบรรทัดว่างรอบ ๆ พื้นที่ว่าง) - แต่ไม่ระหว่างอาคาร
  • ตัวอักษรสามารถนำกลับมาใช้ใหม่ภายในสตริง (สถาปัตยกรรมเดียวกันสถานที่ต่างกัน)
  • ตัวอักษรนั้นถือว่าเป็น ASCII แต่จะมีการมอบไหวพริบเพิ่มเติมให้กับผู้ที่สนับสนุนการเข้ารหัสเพิ่มเติม (UTF8 เป็นต้น)

3
เราจะหมุนภูมิทัศน์เมืองออกไป 90 องศาได้ไหม?
Okx

6
ตัวละครจะเคยพูดซ้ำอีกครั้งaaabbbbaaหรือไม่?
TheLethalCoder

14
@Okx คุณเคยเห็นเมืองที่หมุนไป 90 องศานั่นจะดูโง่มาก! ;)
Tom


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
ที่น่าสนใจคือ Jelly มีz⁶ไว้สำหรับ.Bø... แต่มันก็มีŒgx'2ไว้สำหรับγ€D> _>
Erik the Outgolfer

γ.BD)ø˜øR»เป็นสิ่งที่ฉันไม่มีโดยมอง€Dเป็นวิธีที่ดีกว่า; ฉันรู้สึกเหมือนว่าเราทั้งคู่ขาดวิธีแก้ปัญหา 1 ไบต์ไปที่การทำสำเนาแบบอินไลน์
Magic Octopus Urn

3
@MagicOctopusUrn เดี๋ยวก่อนคุณแก้ไขความท้าทายโดยไม่ได้ดูมันได้หรือไม่
Okx

@ อ็อกซ์ก็ไม่ควรที่จะดูคำตอบก่อนหน้านี้เพราะความสนุกในการเล่นกอล์ฟด้วยตัวเองอาจถูกตัดออกไป
Erik the Outgolfer

@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
นาธาน


@HyperNeutrino คำอธิบายที่ดี ...
Erik the Outgolfer

เพียงเพื่อให้แน่ใจว่าถูกต้องหรือไม่ : P
HyperNeutrino

@HyperNeutrino เอ่อนั่นไม่ได้เป็นความตั้งใจทั้งหมด'ซึ่งก็คือการทำซ้ำรายการต่าง ๆ ของตัวเองและไม่ใช่ของที่อยู่ในรายการ แต่โดยรวมถือว่าดี :)
Erik the Outgolfer

6

Python 3 , 155 136 134 132 ไบต์

-19 ไบต์ขอบคุณ @LeakyNun
-2 ไบต์ขอบคุณ @officialaimm
-1 ไบต์ขอบคุณ @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='')

ลองออนไลน์!



5

Java 8, 412 400 330 324 312 319 ไบต์

-6 ไบต์ขอบคุณ VisualMelon
-12 ไบต์ขอบคุณ Kevin Cruijssen
แต่ +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
การเล่นกอล์ฟ 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.*;สำหรับMapและHashMapการนำเข้าเป็นส่วนหนึ่งของจำนวนไบต์และ -1 โดยการลบเครื่องหมายเซมิโคลอนต่อท้ายซึ่งไม่ใช่ ส่วนหนึ่งของจำนวนไบต์)
Kevin Cruijssen


1
สรุปการเปลี่ยนแปลง: HashMap<>HashMap; Map n=,nและn=; m.put(c,d=m.get(c)!=null?d+1:1);ภายใน for-loop เพื่อกำจัดวงเล็บ k=x.charAt(i)ภายในif(n.get(k)!=null)เพื่อกำจัดเครื่องหมายทวิภาคและเครื่องหมายวงเล็บสำหรับห่วง อีกครั้งยินดีต้อนรับและคำตอบที่ดี! +1 จากฉัน นอกจากนี้ในกรณีที่คุณยังไม่เห็น: เคล็ดลับสำหรับการเล่นกอล์ฟใน Javaและเคล็ดลับสำหรับการเล่นกอล์ฟใน <ภาษาใด ๆ >อาจน่าสนใจในการอ่าน
Kevin Cruijssen

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, 259 231 ไบต์

รหัส 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);}

รหัส 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

}

คอมไพล์ด้วย GCC ไม่มีค่าสถานะพิเศษ

แก้ไข

บันทึกแล้ว 28 ไบต์ขอบคุณ adelphus การเปลี่ยนแปลงของเขาทำให้ฉันสามารถสร้างคำจำกัดความ และฉันทำลูปเป็นลูปเพื่อประหยัด 2 ไบต์ต่อการจัดเรียงลูป ฉันยังแก้ไขปัญหาที่โค้ดจะแตกเมื่ออักขระตัวสุดท้ายในอินพุตไม่ใช่ซิงเกิล รหัสจะล้มเหลวหากมีจดหมายที่ไม่ซ้ำกันเพียงฉบับเดียว แต่ควรทำงานในกรณีอื่นทั้งหมด


ดี! แต่รุ่น golfed ดูเหมือนจะไม่ทำงานกับการป้อนข้อมูลโดยพลการด้วยเหตุผลบางอย่าง การลบ "w" สุดท้ายจากอินพุตตัวอย่างดูเหมือนจะเสีย q และทำซ้ำสตริง แน่นอนว่ามันมีขนาดเล็ก ...
adelphus

นอกจากนี้ยังwhile (i < strlen(argv[1]))สามารถย่อให้สั้นลงwhile (argv[1][i])จนห่วงตัวละครว่าง
adelphus

@adelphus ที่น่าสนใจฉันจะลองในวันพรุ่งนี้เมื่อฉันมีโอกาส ฉันไม่ได้ทดสอบอะไรนอกจากกรณีทดสอบที่ให้มา (ขี้เกียจฉันรู้)
dj0wns

ที่จริงช่วยตันฉันสามารถแก้ไขปัญหาและลดลงเกือบ 30 ไบต์!
dj0wns

1

Pip , 22 ไบต์

โค้ดขนาด 21 ไบต์ +1 สำหรับการ-lตั้งค่าสถานะ

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

Haskell, 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)- เคล็ดลับ: ก) ใช้ guards รูปแบบเพื่อผูกตัวแปรแทนletและ / หรือประกาศฟังก์ชันตัวช่วย โดยตรง: l=length;f s|x<-groupBy(==)s,m<-... =concatMap. ข) map l xเป็นl<$>xค) คือconcatMap("++\n" unlinesง) เป็นเพียงgroupBy(==) groupจ) คือconcat id=<<คุณใช้mเพียงครั้งเดียวดังนั้นอินไลน์ดังนั้น
nimi

1
... ฉ) จำเป็นที่จะต้องไม่มี()รอบ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สามารถรวมเป็น<$>และconcat[[z,z]|z<-…]อาจจะเป็น(replicate 2)=<<…หรือ(\z->[z,z])=<<…
Bergi

คุณสามารถโกนไบต์หนึ่งเพิ่มเติมจาก @ เคล็ดลับที่ดีเยี่ยมของ Bergi: (\z->[z,z])เป็น(:)<*>pureเช่น...transpose$(:)<*>pure=<<map(\y...)x
Nimi


1

Ruby , 116 ไบต์

->s{a=s.scan(/(.)(\1*)/).map{|x,y|[x,y.size+1]}.to_h
m=a.values.max
m.times{|i|puts a.map{|k,v|v+i<m ?'  ':k*2}*''}}

ลองออนไลน์!


puts a.map{...}สามารถถูกแทนที่ด้วยp(a.map{})
Filip Bartuzi

pจะเอาท์พุทอักขระคำพูดดังนั้นมันจึงไม่เหมาะกับที่นี่
อเล็กซ์

โอ้ว้าวขอบคุณ คุณเรียนรู้ทุกวัน - stackoverflow.com/a/1255362/2047418
Filip Bartuzi


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.