Cobalah untuk membuat persegi!

20

Tugas

Diberikan satu karakter yang dapat dicetak non-spasi, buat representasi persegi 3x3 dari input itu. Misalnya, jika inputnya adalah #, maka outputnya adalah:

###
# #
###

Aturan

  • Format outputnya ketat, meskipun baris baru tertinggal diperbolehkan. Ini berarti bahwa ruang di tengah diperlukan, dan juga bahwa dua karakter baris baru yang memisahkan tiga garis diperlukan.

Testcases

Memasukkan: #

Keluaran:

###
# #
###

Memasukkan: A

Keluaran:

AAA
A A
AAA

Memasukkan: 0

Keluaran:

000
0 0
000

Mencetak gol

Ini adalah . Jawaban terpendek dalam byte menang.

Luc H
sumber
2
Fakta bahwa ukurannya diperbaiki memungkinkan untuk beberapa optimasi. Jawaban dari tantangan terkait mungkin tidak akan kompetitif di sini. Jadi saya pikir ini bukan duplikat
Luis Mendo
12
Saya adalah orang yang menurunkan suara, karena itu menjadi tantangan yang sederhana dan membosankan. Saya biasanya penggemar tantangan yang mudah, karena mereka adalah tempat yang baik bagi pegolf baru untuk memulai tetapi ini terasa terlalu mudah.
Shaggy
32
@Ayoungcoder Ini adalah alasan yang sangat sahih untuk melakukan downvote tantangan.
Wheat Wizard
2
@ Shaggy: Dalam hal kesulitan, ada kesulitan untuk menulis program, dan kesulitan untuk golf program. Program ini mudah untuk ditulis, tetapi saya tidak begitu yakin untuk membuatnya mudah.
5
Menurut pendapat saya, ini adalah tantangan yang baik bagi orang-orang yang baru memulai dengan bermain golf kode. Adalah baik untuk memiliki campuran kesulitan. Overload pada salah satu jenis akan merugikan beberapa bagian dari komunitas. Jadi, saya senang tantangan ini ditulis.
isaacg

Jawaban:

30

Arang , 5 3 byte

B³S

Cobalah online! Sunting: Disimpan 40% berkat @carusocomputing. Penjelasan:

B   Draw a box
³   3×3 (second dimension is implicit if omitted)
S   Using the input character
Neil
sumber
3
Saya merasa ini curang ...> _>
HyperNeutrino
14
Kemudian, tentu saja, B³Suntuk menipu omong kosong hidup keluar dari ini.
Magic Gurita Guci
1
Mengapa ini selingkuh? @caruscomputing dan neil servernya sepertinya benar bagi saya
Luc H
1
@Ayoungcoder "curang" seperti di "tampaknya murah" tidak seperti "curang harfiah"; kode memiliki built-in untuk "mencetak sekotak dimensi n menggunakan karakter s", kode terpendek untuk tantangan ini adalah: 1. Baca input. 2. Tentukan dimensi. 3. Kotak cetak. Jawaban untuk tantangan ini secara logis tidak akan di bawah 2 byte jika inputnya implisit.
Magic Gurita Guci
2
@carusocomputing Ah, ironi - perilaku kuadrat tersirat mengganggu jawaban saya untuk memvisualisasikan algoritma Euclidean lagi .
Neil
48

Wortel , 11 byte

###
# #
###

Cobalah online!

Program berada dalam mode caret, di mana #s diganti dengan input.

Kritixi Lithos
sumber
26
Perasaan ketika sebuah program yang terlihat benar-benar tidak valid pada mulanya sebenarnya sangat valid.
Erik the Outgolfer
3
@EriktheOutgolfer pernah mendengar tentang Perl?
NoOneIsHere
19

Python 2 , 32 byte

lambda s:s+s.join(s+'\n \n'+s)+s

Cobalah online!
Untuks='a' : tengah s+'\n \n'+smenghasilkan a\n \nadan s.joinmengubahnya menjadi (huruf tebal adalah yang menambahkan), karena menerima string sebagai iterable, maka ia dikelilingi dengan dua karakter yang hilangaa\na a\naaa.join.join

tongkat
sumber
Bagaimana cara menambahkan karakter ke garis tengah? Bisakah Anda menjelaskan jawabannya?
Notts90
1
@ Notts90 menambahkan penjelasan c:
Rod
terima kasih saya tidak tahu. jooin bisa mengulangi sebuah string.
Notts90
Ini berfungsi di Python 3 juga. BTW sangat keren. (Juga, menggunakan 3*c+c.join('\n \n')+3*cikatan metode yang sama di 32.)
Jonathan Allan
15

MATL , 5 byte

3Y6*c

Cobalah online!

Penjelasan

3Y6   % Push predefined literal: [true true true; true false true; true true true]
*     % Implicitly input a character. Multiply element-wise by its code point
c     % Convert to char. Implicitly display. Char 0 is displayed as space
Luis Mendo
sumber
1
itu tadi cepat! tidak mengharapkan 5 byte datang secepat itu.
Luc H
2
Bahasa kode-golf, Anda tahu ... ¯ \ _ (ツ) _ / ¯
Luis Mendo
11
Tentu saja, karena mengapa Anda tidak memiliki literal yang telah ditentukan untuk [benar benar benar; benar salah benar benar; true true true]
PunPun1000
11
@ PunPun1000 Itu sebenarnya banyak digunakan (bersama dengan konvolusi) karena ini adalah topeng 8-konektivitas standar ( Moore neighboorhood )
Luis Mendo
3
@LuisMendo Luar biasa, pelajari sesuatu yang baru di sini setiap hari, tidak selalu tentang kode golf
PunPun1000
13

05AB1E , 8 byte

4×ð«û3ô»

Cobalah online!

INPUT    # ['R']                 | Implicit Input: 'R'
---------#-----------------------+-------------------------------
4×       # ['RRRR']              | Repeat string 4 times.     
  ð      # ['RRRR',' ']          | Push space onto top of stack.
   «     # ['RRRR ']             | Concatenate last 2 items.
    û    # ['RRRR RRRR']         | Palindromize.
     3ô  # [['RRR','R R','RRR']] | Split into 3 pieces.
       » # ['RRR\nR R\nRRR']     | Join with newlines
---------#-----------------------+-------------------------------
OUTPUT   # RRR                   | Implicitly print the top
         # R R                   | of the stack on exit.
         # RRR                   |

Gagasan asli menggunakan 30 sebagai angka biner (belum selesai, orang lain mencoba ini di bahasa lain):

05AB1E , 12 byte

30bûTIð«‡3ô»

Cobalah online!

Guci Gurita Ajaib
sumber
11

Python 3.6 , 33 byte

lambda c:f'{3*c}\n{c} {c}\n{3*c}'

Cobalah online!

Jonathan Allan
sumber
Tidak masalah. Sepertinya 3.6.1 sedang dijalankan; jika Anda mencoba import sysdan kemudian sys.versiondi repl, itu mengembalikan 3.6.1 daripada 3.5.2. Tidak tahu mengapa dikatakan 3.5.2 di atas itu, sepertinya mereka telah membuat kesalahan di sana!
numbermaniac
2
Oh, haha, kasus "jangan selalu percaya dengan apa yang Anda baca" - terima kasih!
Jonathan Allan
9

RPL (Reverse Polish Lisp) , 60 karakter

→STR 1 4 START DUP NEXT " " + SWAP + 4 ROLLD + + SWAP 2 PICK

(Perhatikan bahwa "→" adalah satu karakter pada HP48 dan kalkulator yang kompatibel)

Secara visual akan mewakili apa yang Anda inginkan dengan memiliki tiga item di tumpukan:

3.: "###"
2.: "# #"
1.: "###"

Jika Anda bersikeras mengembalikannya sebagai satu string, Anda harus menambahkan karakter baris baru juga dan menggabungkan string, dibiarkan sebagai latihan untuk tester berikutnya.

Input (bisa apa saja, tidak perlu berupa string) Kode yang dimasukkan Hasil

Penjelasan:

  • →STR: Buat objek terakhir di tumpukan menjadi string. (Jadi input bisa berupa apa saja, misalnya angka.)
  • 1 4: Dorong nomor 1dan4 ke tumpukan.
  • START [...] NEXT: Seperti untuk loop tetapi tanpa akses ke variabel counter. Mengambil dua angka dari tumpukan (di sini, kami baru saja mendorong 1dan 4) dan mengeksekusi kode[...] waktu yang sesuai (di sini, empat kali).
  • DUP: Gandakan entri terakhir di tumpukan.
  • " ": Dorong tali (yaitu string dengan satu spasi putih) ke stack.
  • +: Ambil dua objek dari tumpukan dan kembalikan bersama-sama, untuk string: Disatukan.
  • 4: Dorong nomor itu 4 ke tumpukan.
  • ROLLD: Mengambil elemen terakhir (di sini: 4 yang baru saja kita dorong) dari tumpukan dan menggulung elemen berikutnya sejauh ke bawah tumpukan seperti yang baru saja kita ambil dari tumpukan.
  • SWAP: Menukar dua elemen tumpukan terakhir.
  • 2: Dorong 2ke tumpukan.
  • PICK: Mengambil elemen (di sini: 2Kita baru saja mendorong ke stack), menafsirkannya sebagai angka n, dan menyalin elemen ke-n dari stack.
Ramblar Golar
sumber
7

JavaScript, 28 byte

c=>c+c+c+`
${c} ${c}
`+c+c+c

Cobalah

f=
c=>c+c+c+`
${c} ${c}
`+c+c+c
o.innerText=f(i.value="#")
i.oninput=_=>o.innerText=f(i.value)
<input id=i maxlength=1><pre id=o>

Shaggy
sumber
Saya pikir Anda mungkin dapat menyimpan satu atau dua byte dengan menyimpan hasil c+'\n'+csementara.
Neil
Sudahlah, saya salah hitung, masih 28 byte.
Neil
@ Neil: Ya, ada beberapa opsi untuk menetapkan barang ke variabel, tetapi mereka semua datang pada 28 byte atau lebih.
Shaggy
6

Jelly , 8 byte

1 byte berkat Erik the Outgolfer.

x4,`Ks3Y

Cobalah online!

Biarawati Bocor
sumber
Saya bertanya-tanya bagaimana cara melakukan ini ... Saya punya x4µ©;⁶;®œs3Yselama 12 byte karena saya tidak tahu bagaimana menghindari pengulangan melipatgandakan seluruh langkah menengah saya tapi bagus!
HyperNeutrino
1
Anda tahu, ada builtin Kuntuk dilakukan j⁶. Oh, dan ada cara cepat,, `untuk mengubah angka dua menjadi satu angka dengan menggunakan argumen yang sama di kedua sisi.
Erik the Outgolfer
5

Java 7, 56 55 byte

-1 Terima kasih kepada Leaky Nun karena menunjukkan ruang yang saya lewatkan

String a(char s){return"...\n. .\n...".replace('.',s);}

Cukup ganti periode dengan karakter yang diberikan, untuk input #:

...       ###
. .  =>   # #
...       ###

Cobalah online!

PunPun1000
sumber
5

PHP, 32 Bytes

<?=strtr("000
0 0
000",0,$argn);

Cobalah online!

Jörg Hülsermann
sumber
Cukup menarik <?=$a=$argn,"$a$a\n$a $a\n$a$a$a";(break baris nyata bukan tentu saja) memiliki jumlah byte yang persis sama.
Christoph
@Christoph menjadikannya sebagai pendekatan Anda. saya belum mencoba cara alternatif ini
Jörg Hülsermann
5

sed, 28 18 byte

s:.:&&&\n& &\n&&&:

Cobalah online!

eush77
sumber
yang baru ini tidak berfungsi, yang lama memang mengedit: tidak, tetapi Anda lupa: di anwser
Luc H
@Ayoungcoder Maaf, salah menempelkan final :. Tetap.
eush77
coba online harus [Coba online!]: tio.run/nexus/sed#@19spWelpqYWk6emACLU1Kz@/0/… "sed - TIO Nexus"
Luc H
@Ayoungcoder Tentu saja, terima kasih.
eush77
5

Brain-Flak , 76 70 + 1 = 71 byte

Membutuhkan -cbendera

(((((((({})))<((([])[]{}<>)<>)>)<(<>({})({}){}()()<>)>)<([]()()())>)))

Cobalah online!

Wisaya Gandum
sumber
Anda dapat menyimpan 6 byte jika Anda menggantinya (()()()()()){}dengan ([])[]{}.
0
Beberapa kompetisi :)
DJMcMayhem
5

Pyth, 7 byte

jc3.[9d

Coba ini secara online.

Penjelasan:

jc3.[9d Expects quoted input.
  3     3
     9  9
      d ' '
        Q (eval'd input) as implicit argument
   .[   Pad B on both sides with C until its length is a multiple of A
 c      Split B to chunks of length A, last chunk may be shorter
j       Join A on newlines
Erik the Outgolfer
sumber
4

Brain-Flak , 61 , 59 byte

(((((((({})))<([][][]())>)<(([][][]()){})>)<([]()()())>)))

Cobalah online!

Ini adalah 58 byte kode +1 untuk -cflag yang memungkinkan input dan output ASCII.

Penjelasan:

(((
   (
    (
     (

      #Duplicate the input 3 times
      ((({})))

#Push 10 (newline)
<([][][]())>

     #Push the input again
     )

#Push 32 (space)
<(([][][]()){})>

    #Push the input again
    )

#Push 10 (newline)
<([]()()())>)

#Push input 3 times
)))
DJMcMayhem
sumber
4

C (gcc) , 49 47 byte

Disimpan 2 byte berkat 2501!

j;f(i){for(j=12;j;)putchar(--j%4?j-6?i:32:10);}

Cobalah online! memiliki baris baru

Conor O'Brien
sumber
Anda dapat menyimpan dua byte dengan melakukan:for(j=11;j;)...
2501
3

Python 3 , 34 byte

lambda s:s*3+"\n"+s+" "+s+"\n"+s*3

Cobalah online!

Biarawati Bocor
sumber
-1 byte:lambda x:x*3+'\n%s '%x+x+'\n'+x*3
Erik the Outgolfer
3

Oktaf , 36 byte

x=repmat(input(0),3);x(5)=32;disp(x)

Cobalah online!

Penjelasan

Ini menciptakan matriks char 3x3 dengan input char diulangi, dan menetapkan entri ke-5 dalam urutan kolom-utama (yaitu pusatnya) menjadi 32(ASCII untuk spasi).

Luis Mendo
sumber
3

Ruby , 27 25 byte

Disimpan 2 byte berkat Level River St

->x{[s=x*3,x+" "+x,s]*$/}

Cobalah online!

Alex
sumber
ketika Anda melakukan jawaban seperti ini, harap sertakan juga footer sebagai kode karena tidak berfungsi tanpa
Luc H
@Ayoungcoder ini adalah fungsi anonim. Anda dapat menugaskannya ke variabel ( f=...) lalu menyebutnya denganf.call(...)
Cyoce
1
Anda dapat menggunakan baris baru literal di dalam kutipan alih-alih "\n"untuk menghemat 1 byte. Penggunaan $/yang lebih baik lagi yang merupakan variabel khusus yang disetel ke baris baru secara default - menghemat 2 byte.
Level River St
1 byte kurang dari trsolusinya. kerja bagus
Cyoce
3

Brainfuck, 40 byte

+++++[->++<<++++++>],...>.<.<++.>.>.<...

Cobalah online! Membutuhkan implementasi yang dapat mengakses kiri posisi awal.

Juga lihat: jawaban brainfuck Graviton yang mengambil pendekatan yang berbeda (tetapi lebih lama).


Penjelasan:

Brainfuck dapat melakukan banyak trik keren dengan set instruksi yang terbatas. Sayangnya, jawaban ini tidak menggunakan salah satunya, karena lebih murah (dalam hal byte) untuk hanya meng-hardcode semuanya.

+++++[->++<<++++++>]                         Sets the cells to |5*6|>0<|5*2|
,                   Takes input character into the middle cell | 30|>#<| 10|
...                                Print the top of the square | 30|>#<| 10| ###
>.                                   Print a newline character | 30| # |>10|    \n
<.                               Print another input character | 30|>#<| 10| #
<++.                  Add 30+2 for a space character and print |>32| # | 10|  _
>.                   And just print the 5 remaining characters | 32|>#<| 10|   #
>.                                                             | 32| # |>10|    \n
<...                                                           | 32|>#<| 10| ###

# = karakter input, _ = spasi (ASCII 32), \ n = baris baru (ASCII 10)


Hasil dalam kotak cantik ini (untuk masukan '+'):

+++
+ +
+++
Zack C.
sumber
3

05AB1E , 7 6 byte

-1 byte berkat carusocomputing.

ж¹ðJû

Penjelasan:

         # Implicit input                  # ['R']
 Ð       # Repeat string three times       # ['R', 'R', 'R']
  ¶      # Push newline character          # ['R', 'R', 'R', '\n']
   ¹     # Push first input                # ['R', 'R', 'R', '\n', 'R']
    ð    # Push space                      # ['R', 'R', 'R', '\n', 'R', ' ']
     J   # Join stack                      # ['RRR\nR ']
      û  # Palindromize ("abc" -> "abcba") # ['RRR\nR R\nRRR']
         # Implicit output                 # []

Menggunakan pengkodean CP-1252 . Cobalah online!

Oliver Ni
sumber
Oooo ... Cerdas, saya tidak pernah memikirkan bagaimana palindromize bekerja pada baris baru.
Magic Octopus Mm
ж¹ðJûuntuk 6 byte.
Magic Octopus Mm
3

Pyth , 11 byte

jc++K*z4dK3

Cobalah online!

Penjelasan:

jc++K*z4dK3    expects a single char as input

j              joins on new line
 c        3    chops array into 3 sized pieces
  +            joins +K*z4d and K
   +           joins K*z4 and d
    K          initialize variable K as *z4
     *z4       duplicate the input 4 times
        d      variable initialized to string " "
         K     calls variable K, in this case *z4
berwarna
sumber
Selamat datang di PPCG!
Stephen
2

Swift3, 50 byte

[1,2,3].map{$0==2 ? print(c+" "+c) : print(c+c+c)}

Ini menggunakan operator ternary untuk mencetak string yang berbeda, tergantung pada barisnya.

Cobalah online

Martyav
sumber
2

C #, 50 byte

a=>Console.Write(a+a+a+"\n"+a+" "+a+"\n"+a+a+a);

Kasus cobaan:

var f = new Action<string>(
a=>Console.Write(a+a+a+"\n"+a+" "+a+"\n"+a+a+a);
);
f("#");
CHENGLIANG YE
sumber
Anda harus sepenuhnya memenuhi syarat ConsoleyaituSystem.Console..
TheLethalCoder
2

Vim, 9 penekanan tombol

Dengan asumsi char input hadir dalam buffer, vim membuatnya mudah

x3pY2plr<space>

Mungkin ada beberapa perintah penggunaan vim sihir di sini (sepertinya selalu ada beberapa) jadi saran perbaikan dipersilahkan. Hanya satu penekanan tombol di belakang V!

algmyr
sumber
Saya cukup yakin ini sesingkat mungkin. Jawaban bagus!
DJMcMayhem
2

Z80 atau 8080 Assembly, 21 byte kode mesin

Asumsikan memori yang dipetakan perangkat I / O:

              Z80 8080
3A xx xx ld a, (input) lda input; dapatkan karakter input
11 0A 20 ld de, 200ah lxi d, 200ah; ruang & baris baru
21 yy yy ld hl, output lxi h, output; dapatkan alamat keluaran
77 ld (hl), sebuah mov m, a; karakter keluaran * 3
77 ld (hl), sebuah mov m, a
77 ld (hl), sebuah mov m, a
73 ld (hl), e mov m, e; output baris baru
77 ld (hl), sebuah mov m, a; karakter keluaran
72 ld (hl), d mov m, d; ruang output
77 ld (hl), sebuah mov m, a; karakter keluaran
73 ld (hl), e mov m, e; output baris baru
77 ld (hl), sebuah mov m, a; karakter keluaran * 3
77 ld (hl), sebuah mov m, a
77 ld (hl), sebuah mov m, a
76 berhenti hlt; atau ret C9

Tidak perlu penerjemah!

Hexdump:

0000: 3A 00 FF 11 0A 20 21 01 FF 77 77 77 73 77 72 77
0010: 73 77 77 77 76

di mana alamat input pada FF00h dan alamat output dipetakan pada FF01h. Alamat aktual akan tergantung pada perangkat keras yang sebenarnya. Tentu saja ini mengasumsikan I / O adalah memori yang dipetakan. Jika dipetakan I / O, akan butuh beberapa byte tambahan karena instruksi I / O Z80 & 8080 masing-masing dua byte. Ini juga mengasumsikan perangkat output menafsirkan 0Ah sebagai baris baru dan tidak memerlukan CR (0Dh) yang akan menambah 4 byte tambahan ke program.

Dan Howell
sumber
Selamat datang di Codegolf.stackexchange, sementara tampaknya Anda dapat mengendalikan semuanya, harap baca pusat bantuan dan daftar faqs. Pos pertama yang bagus
Rohan Jhunjhunwala
Bisakah Anda memberikan hexdump kode Anda?
CalculatorFeline
Byte hex berada di kolom pertama, tetapi jika Anda ingin hexdump "murni", saya telah menambahkannya.
Dan Howell
2

J-uby , 22 20 byte

-2 byte terima kasih kepada @Jordan

:tr&"...
. .
..."&?.

Penjelasan

String#tradalah metode ganti karakter-bijaksana Ruby. Pertama& mengikat :truntuk "...\n. .\n...", dan yang kedua sebagian berlaku '.'untuk itu. Secara efektif, ini->s{"...\n. .\n...".tr('.',s)}

Cyoce
sumber
Akan :trbekerja sebaik di :gsubsini?
Jordan
@ Jordan, ya, terima kasih!
Cyoce