Спробуйте зробити квадрат!


20

Завдання

Враховуючи один символ для друку, який не можна пробілити, зробіть 3x3 квадратне зображення цього вводу. Наприклад, якщо вхід є #, то вихід:

###
# #
###

Правила

  • Формат виводу є суворим, хоча дозволений останній рядок. Це означає, що в середині потрібен пробіл, а також необхідні два символи нового рядка, що розділяють три рядки.

Тестові шафи

Вхід: #

Вихід:

###
# #
###

Вхід: A

Вихід:

AAA
A A
AAA

Вхід: 0

Вихід:

000
0 0
000

Оцінка балів

Це . Найкоротша відповідь у байтах виграє.


2
Той факт, що розмір фіксований, дозволяє здійснити деяку оптимізацію. Відповіді, пов’язані із пов'язаним викликом, напевно, тут не будуть конкурентоспроможними. Тож я не думаю, що це дублікат
Луїс Мендо

12
Я був тим, хто виступав за те, що це був простий, нудний виклик. Я, як правило, фанат легких викликів, оскільки вони є гарним місцем для початку нових гольфістів, але це просто занадто просто.
Кудлатий

32
@Ayoungcoder Це цілком поважна причина, щоб зняти виклик.
Пшеничний майстер

2
@Shaggy: З точки зору складності, складно написати програму та складно передати програму. Цю програму легко написати, але я не дуже впевнений, що це легко в гольф.

5
На мою думку, це хороший виклик для людей, які тільки починають займатися кодовим гольфом. Добре мати поєднання труднощів. Перевантаження будь-якого типу буде на шкоду деякій частині громади. Тож я радий, що цей виклик було написано.
isaacg

Відповіді:


30

Вугілля деревне , 5 3 байти

B³S

Спробуйте в Інтернеті! Редагування: зекономлено на 40% завдяки @carusocomputing. Пояснення:

B   Draw a box
³   3×3 (second dimension is implicit if omitted)
S   Using the input character

3
Я відчуваю, що це обман ...> _>
HyperNeutrino

14
Тоді, звичайно, B³Sобдурити живого лайна з цього.
Чарівна восьминога урна

1
Чому це було б обманом? @carusocomputing та neil його ганьби здається мені правильним
Люк Н

1
@Ayoungcoder "обман", як у "здається дешевим", а не як "буквальне обман"; у коді є вбудований для "друку вікна розмірів n за допомогою символів s", найкоротшим кодом для цього завдання є: 1. Прочитати введення. 2. Визначте розмірність. 3. Вікно друку. Відповідь на цей виклик логічно не буде нижче 2 байт, якщо введення неявне.
Чарівна восьминога урна

2
@carusocomputing Ах, іронія - неявна квадратна поведінка роздратувала мене у моїй відповіді на повторне візуалізацію евклідового алгоритму .
Ніл

48

Морква , 11 байт

###
# #
###

Спробуйте в Інтернеті!

Програма знаходиться в режимі каретки, де #s замінюються на вхід.


26
Відчуття, коли програма, яка спочатку виглядає абсолютно недійсною, насправді цілком дійсна.
Ерік Аутгольфер

3
@EriktheOutgolfer коли-небудь чув про Perl?
NoOneIsHere

19

Python 2 , 32 байти

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

Спробуйте в Інтернеті!
Для s='a': середина s+'\n \n'+sгенерує a\n \naта s.joinперетворює її (жирний s - це те, що додає), тому що приймає рядок як ітерабельний, тоді він оточений двома відсутніми символамиaa\na a\naaa.join.join


Як це додає символів до середньої лінії? Не могли б ви пояснити відповідь, будь ласка?
Notts90

1
@ Notts90 додав пояснення c:
Род

дякую, я не знав. приєднатись може ітерація рядка.
Notts90

Це працює і в Python 3. Дуже крутий BTW. (Також, використовуючи той самий метод, 3*c+c.join('\n \n')+3*cзв'язки в 32.)
Джонатан Аллан

15

MATL , 5 байт

3Y6*c

Спробуйте в Інтернеті!

Пояснення

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

1
це було швидко! не очікував, що 5 байт прийде так швидко.
Люк Н

2
Мови з кодового гольфу, ви знаєте ... ¯ \ _ (ツ) _ / ¯
Луїс Мендо

11
Звичайно, тому що чому б ти не мав заздалегідь заданий буквал для [true true true; справжній хибний правдивий; правда правда правда]
PunPun1000

11
@ PunPun1000 Насправді багато використовується (разом із згорткою), оскільки це стандартна маска для 8-ти підключень ( Мурське сусідство )
Луїс Мендо

3
@LuisMendo Це приголомшливо, дізнайтеся щось нове тут щодня, не завжди про гольф з кодом
PunPun1000

13

05AB1E , 8 байт

4×ð«û3ô»

Спробуйте в Інтернеті!

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                   |

Оригінальна ідея, що використовує 30 як двійкове число (незавершено, хтось інший спробує це в іншому язику):

05AB1E , 12 байт

30bûTIð«‡3ô»

Спробуйте в Інтернеті!



11

Python 3,6 , 33 байти

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

Спробуйте в Інтернеті!


Без проблем. Схоже, що це фактично 3.6.1 запущений; якщо спробувати, import sysа потім sys.versionу відповіді, він поверне 3.6.1, а не 3.5.2. Не маю уявлення, чому вгорі сказано 3.5.2, схоже, вони помилилися там!
numbermaniac

2
О, ха-ха, випадок "не завжди віриш тому, що ти читаєш" - дякую!
Джонатан Аллан

9

RPL (зворотний польський Lisp) , 60 символів

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

(Зверніть увагу, що "→" - це один символ на HP48 та сумісних калькуляторах)

Візуально представляє те, що ви хочете, маючи три елементи на стеку:

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

Якщо ви наполягаєте на тому, щоб повернути його як один рядок, потрібно також додати символи нового рядка та поєднати рядки, залишені як вправу до наступного тестера.

Введення (може бути будь-що, не потрібно бути рядком) Введений код Результат

Пояснення:

  • →STR: Зробіть останній об’єкт у стеку в рядок. (Отже, вхід може бути будь-яким, наприклад числом.)
  • 1 4: Натисніть на номер 1і 4до стека.
  • START [...] NEXT: Як цикл for, але без доступу до змінної лічильника. Бере два числа зі стека (тут ми просто натиснули 1і 4) і виконує код [...]відповідних разів (тут, чотири рази).
  • DUP: Дублювати останній запис у стеку.
  • " ": Натисніть рядок (тобто рядок з одним пробілом) до стеку.
  • +: Візьміть два об'єкти зі стека та поверніть їх, додані разом, для рядків: З’єднані.
  • 4: Натисніть номер 4на стек.
  • ROLLD: Бере останній елемент (тут: 4щойно ми натиснули) зі стека і перекочує наступний елемент аж до стека, як вказує число, яке ми тільки що взяли зі стека.
  • SWAP: Замінює два останніх елемента стека.
  • 2: Натисніть 2на стек.
  • PICK: Бере елемент (тут: 2Ми просто натиснули на стек), інтерпретуємо його як число n та копіюємо n-й елемент із стеку.

7

JavaScript, 28 байт

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

Спробуй це

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>


Я думаю, що ви, можливо, зможете зберегти байт або два, зберігаючи результат c+'\n'+cу тимчасовому.
Ніл

Неважливо, я неправильно рахував, це все-таки 28 байт.
Ніл

@Neil: Так, є кілька варіантів присвоєння матеріалів змінній, але всі вони входять у 28 байт або більше.
Кудлатий

6

Желе , 8 байт

1 байт завдяки Еріку Переможнику.

x4,`Ks3Y

Спробуйте в Інтернеті!


Мені було цікаво, як це зробити ... У мене було x4µ©;⁶;®œs3Y12 байт, тому що я не міг зрозуміти, як уникнути повторення множення всього мого проміжного кроку, але приємно!
HyperNeutrino

1
Ви знаєте, є вбудований Kдля того, щоб робити j⁶. О, і є швидкий, `щоб перетворити діаду в монаду, використовуючи один і той же аргумент з обох сторін.
Ерік Аутгольфер

5

Java 7, 56 55 байт

-1 Дякую Leaky Nun за те, що вказав на простір, який я пропустив

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

Просто замінює періоди заданим символом для введення №:

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

Спробуйте в Інтернеті!


5

PHP, 32 байти

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

Спробуйте в Інтернеті!


Цікаво цікаво <?=$a=$argn,"$a$a\n$a $a\n$a$a$a";(справжній розрив рядків замість \ n звичайно) має точно такий же кількість байтів.
Крістоф

@Christoph зробіть це як ваш підхід. я не пробував цього альтернативного способу
Йорг Гюльсерманн

5

sed, 28 18 байт

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

Спробуйте в Інтернеті!


цей новий не працює, старий все-таки редагував: він робить, але ви забули: в авангарді
Люк Н

@Ayoungcoder Вибачте, неправильно вставили фінал :. Виправлено.
eush77

спробувати його в Інтернеті слід [Спробуйте в Інтернеті!]: tio.run/nexus/sed#@19spWelpqYWk6emACLU1Kz@/0/… "sed - TIO Nexus"
Люк H

@Ayoungcoder Звичайно, дякую.
eush77



4

Мозг-Флак , 61 , 59 байт

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

Спробуйте в Інтернеті!

Це 58 байт байта коду +1для -cпрапора, який дозволяє вводити та виводити ASCII.

Пояснення:

(((
   (
    (
     (

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





3

Рубін , 27 25 байт

Збережено 2 байти завдяки Level River St

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

Спробуйте в Інтернеті!


коли ви робите подібні шахраї, будь-ласка, також додайте колонтитул як код, тому що без нього не працює
Люк Н

@Ayoungcoder це анонімна функція. ви можете призначити його змінної ( f=...), а потім зателефонувати за неюf.call(...)
Cyoce

1
Ви можете використовувати буквальний новий рядок всередині лапок замість того, "\n"щоб заощадити 1 байт. Ще краще використовувати $/спеціальну змінну, встановлену за новим рядком за замовчуванням - економія 2 байтів.
Рівень річки Св

На 1 байт менше, ніж trрозчин. приємна робота
Cyoce

3

Brainfuck, 40 байт

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

Спробуйте в Інтернеті! Потрібна реалізація, яка може отримати доступ зліва від вихідної позиції.

Також дивіться: відповідь Гравітона на брехливу відповідь, яка застосовує інший підхід (але довший).


Пояснення:

Brainfuck може робити багато цікавих трюків з обмеженим набором інструкцій. На жаль, ця відповідь не використовує жодного з них, оскільки дешевше (у перерахунку на байти) просто жорстко кодувати все.

+++++[->++<<++++++>]                         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| ###

# = символ введення, _ = пробіл (ASCII 32), \ n = новий рядок (ASCII 10)


Результати в цьому прекрасному полі (для введення "+"):

+++
+ +
+++

3

05AB1E , 7 6 байт

-1 байт завдяки carusocomputing.

ж¹ðJû

Пояснення:

         # 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                 # []

Використовує кодування CP-1252 . Спробуйте в Інтернеті!


Оооо ... Розумно, я ніколи не замислююся над тим, як працює паліндромізація на нових рядках.
Чарівна восьминога урна

ж¹ðJûза 6 байт.
Чарівна восьминога урна

3

Pyth , 11 байт

jc++K*z4dK3

Спробуйте в Інтернеті!

Пояснення:

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

Ласкаво просимо до PPCG!
Стівен




2

C #, 50 байт

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

Тестовий випадок:

var f = new Action<string>(
a=>Console.Write(a+a+a+"\n"+a+" "+a+"\n"+a+a+a);
);
f("#");

Вам потрібно повністю кваліфікуватися, ConsoleтобтоSystem.Console..
TheLethalCoder

2

Vim, 9 натискань клавіш

Припускаючи, що вхідний знак присутній в буфері, vim робить це просто

x3pY2plr<space>

Тут, мабуть, є якісь магічні команди vim (тут завжди здається, що їх є), тому пропозиції щодо вдосконалення вітаються. Лише один натискання клавіші позаду V!


Я впевнений, що це так коротко, наскільки це можливо. Гарна відповідь!
DJMcMayhem

2

Збірка Z80 або 8080, машинний код 21 байт

Припустимо пристрій, вбудований в пам'ять, зіставлений з пам'яттю:

              Z80 8080
3A xx xx ld a, (вхід) lda вхід; отримати вхідний символ
11 0A 20 ld de, 200ah lxi d, 200ah; простір та новий рядок
21 yy yy ld hl, вихід lxi h, вихід; отримати вихідну адресу
77 ld (hl), mov m, a; вихідний символ * 3
77 лд (хл), мов м, а
77 лд (хл), мов м, а
73 ld (hl), e mov m, e; вихідний рядок
77 ld (hl), mov m, a; вихідний символ
72 ld (hl), d mov m, d; вихідний простір
77 ld (hl), mov m, a; вихідний символ
73 ld (hl), e mov m, e; вихідний рядок
77 ld (hl), mov m, a; вихідний символ * 3
77 лд (хл), мов м, а
77 лд (хл), мов м, а
76 halt hlt; або C9 ret

Не потрібен перекладач!

Hexdump:

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

де вхідна адреса - FF00h, а вихідна адреса відображена у FF01h. Фактичні адреси залежатимуть від фактичного обладнання. Звичайно, це передбачає, що введення / виведення відображено в пам'яті. Якщо це введення / виведення на карті, воно займе кілька зайвих байтів, оскільки інструкції з вводу / виводу Z80 та 8080 - це два байти. Це також передбачає, що пристрій виведення інтерпретує 0Ah як новий рядок і не вимагає CR (0Dh), який додав би додаткові 4 байти до програми.


Ласкаво просимо до Codegolf.stackexchange, хоча, здається, у вас все під контролем, будь ласка, прочитайте довідковий центр та список файлів. Хороший перший пост
Рохан Джунджунвала

Чи можете ви надати шістнадцятковий код?
CalculatorFeline

Шестнадцяткові байти знаходяться в першому стовпці, але якщо ви хочете "чистий" шістнадцятковий, я додав його.
Ден Хоуелл

2

J-uby , 22 20 байт

-2 байти завдяки @Jordan

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

Пояснення

String#trє методом заміни Рубі. Перший &пов'язується :trз ним "...\n. .\n...", а другий частково відноситься '.'до нього. Ефективно це->s{"...\n. .\n...".tr('.',s)}


Було б :trтак добре, як :gsubтут?
Йорданія

@Jordan так, дякую!
Кіос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.