Spróbuj zrobić kwadrat!

20

Zadanie

Biorąc pod uwagę jeden znak, który nie jest spacją, należy przedstawić kwadratową reprezentację tego wejścia 3 x 3. Na przykład, jeśli dane wejściowe to #, dane wyjściowe to:

###
# #
###

Zasady

  • Format wyjściowy jest ścisły, chociaż dozwolony jest końcowy znak nowej linii. Oznacza to, że wymagana jest spacja w środku, a także, że wymagane są dwa znaki nowej linii oddzielające trzy linie.

Przypadki testowe

Wkład: #

Wydajność:

###
# #
###

Wkład: A

Wydajność:

AAA
A A
AAA

Wkład: 0

Wydajność:

000
0 0
000

Punktacja

To jest . Najkrótsza odpowiedź w bajtach wygrywa.

Luc H.
źródło
2
Fakt, że rozmiar jest stały, pozwala na pewną optymalizację. Odpowiedzi z połączonego wyzwania prawdopodobnie nie będą tutaj konkurencyjne. Więc nie sądzę, że to duplikat
Luis Mendo
12
To ja głosowałem za tym, ponieważ było to proste, nudne wyzwanie. Zwykle jestem fanem łatwych wyzwań, ponieważ są dobrym miejscem dla początkujących golfistów, ale wydaje się to zbyt łatwe.
Kudłaty
32
@Ayoungcoder Jest to całkowicie uzasadniony powód, by głosować za wyzwaniem.
Kreator pszenicy
2
@Shaggy: Pod względem trudności istnieje trudność z napisaniem programu i trudność w grze w golfa. Ten program jest łatwy do napisania, ale nie jestem pewien, czy łatwo go zagrać w golfa.
5
Moim zdaniem jest to dobre wyzwanie dla osób, które dopiero zaczynają przygodę z golfem. Dobrze jest mieć mieszankę trudności. Przeciążenie dowolnego typu będzie ze szkodą dla pewnej części społeczności. Cieszę się, że to wyzwanie zostało napisane.
isaacg

Odpowiedzi:

30

Węgiel drzewny , 5 3 bajty

B³S

Wypróbuj online! Edycja: Zaoszczędź 40% dzięki @carusocomputing. Wyjaśnienie:

B   Draw a box
³   3×3 (second dimension is implicit if omitted)
S   Using the input character
Neil
źródło
3
Wydaje
14
Potem, oczywiście, B³Saby oszukać z tego bzdury.
Magic Octopus Urn
1
Dlaczego miałoby to oszukiwać? @ carusocomputing i neil jego odpowiedź wydaje mi się słuszna
Luc H
1
@Ayoungcoder „oszukiwanie” jak w „wydaje się tanie”, a nie w „dosłownym oszukiwaniu”; kod ma wbudowane „drukowanie pola wymiarów n przy użyciu znaku s”, najkrótszym kodem dla tego wyzwania jest: 1. Odczyt danych wejściowych. 2. Zdefiniuj wymiar. 3. Wydrukuj pudełko. Odpowiedź na to wyzwanie logicznie nie będzie mniejsza niż 2 bajty, jeśli dane wejściowe są niejawne.
Magic Octopus Urn
2
@ carusocomputing Ach, ironia - niejawne kwadratowe zachowanie drażniło mnie w mojej odpowiedzi na Wizualizację algorytmu euklidesowego ponownie .
Neil
48

Marchewka , 11 bajtów

###
# #
###

Wypróbuj online!

Program jest w trybie karetki, gdzie #s są zamieniane na wejście.

Kritixi Lithos
źródło
26
Poczucie, że program, który na początku wygląda całkowicie nieprawidłowo, jest w rzeczywistości całkowicie poprawny.
Erik the Outgolfer,
3
@EriktheOutgolfer słyszałeś kiedyś o Perlu?
NoOneIsHere
19

Python 2 , 32 bajty

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

Wypróbuj online!
Dla s='a': środek s+'\n \n'+sgeneruje a\n \nai s.joinodwraca ( dodaje się pogrubione s ), ponieważ akceptuje ciąg jako iterowalny, a następnie jest otoczony dwoma brakującymi znakamiaa\na a\naaa.join.join

Pręt
źródło
Jak to dodaje znaki do środkowej linii? Czy mógłbyś wyjaśnić odpowiedź?
Notts90
1
@ Notts90 dodał wyjaśnienie c:
Rod
dzięki nie wiedziałem .join może iterować ciąg.
Notts90
Działa to również w Pythonie 3. Bardzo fajnie BTW. (Również przy użyciu tej samej metody 3*c+c.join('\n \n')+3*cwiąże 32.)
Jonathan Allan
15

MATL , 5 bajtów

3Y6*c

Wypróbuj online!

Wyjaśnienie

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
źródło
1
to było szybkie! nie spodziewałem się, że 5 bajtów nadejdzie tak szybko.
Luc H
2
Języki golfa, wiesz ... ¯ \ _ (ツ) _ / ¯
Luis Mendo
11
Oczywiście, ponieważ dlaczego nie miałbyś z góry określonego literału dla [prawda prawda prawda; prawda fałsz prawda; true true true]
PunPun1000
11
@ PunPun1000 Jest to bardzo często używane (wraz ze splotem), ponieważ jest to standardowa maska ​​z 8 połączeniami ( Moore neighboorhood )
Luis Mendo
3
@LuisMendo To niesamowite, ucz się czegoś nowego każdego dnia, nie zawsze o
grze w
13

05AB1E , 8 bajtów

4×ð«û3ô»

Wypróbuj 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                   |

Oryginalny pomysł, używając 30 jako liczby binarnej (niedokończony, ktoś inny wypróbuje to w innym języku):

05AB1E , 12 bajtów

30bûTIð«‡3ô»

Wypróbuj online!

Urna Magicznej Ośmiornicy
źródło
11

Python 3.6 , 33 bajty

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

Wypróbuj online!

Jonathan Allan
źródło
Nie ma problemu. Wygląda na to, że faktycznie działa 3.6.1; jeśli spróbujesz, import sysa następnie sys.versionw replice, zwróci 3.6.1 zamiast 3.5.2. Nie mam pojęcia, dlaczego na górze widnieje napis 3.5.2. Wygląda na to, że popełnili tam błąd!
numbermaniac
2
Och, haha, sprawa „nie zawsze wierz w to, co czytasz” - dzięki!
Jonathan Allan
9

RPL (Reverse Polish Lisp) , 60 znaków

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

(Uwaga: „→” to pojedynczy znak na HP48 i zgodnych kalkulatorach)

Przedstawiałby wizualnie to, co chcesz, mając trzy elementy na stosie:

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

Jeśli nalegasz, aby zwrócić go jako jeden ciąg, należy również dodać znaki nowego wiersza i połączyć ciągi pozostawione jako ćwiczenie dla następnego testera.

Dane wejściowe (może być dowolne, nie musi być ciągiem) Wprowadzony kod Wynik

Wyjaśnienie:

  • →STR: Zrób ostatni obiekt ze stosu w ciąg. (Więc dane wejściowe mogą być dowolne, np. Liczba.)
  • 1 4: Naciśnij liczbę 1i 4na stos.
  • START [...] NEXT: Jak pętla for, ale bez dostępu do zmiennej licznika. Pobiera dwie liczby ze stosu (tutaj, po prostu wypchnęliśmy 1i 4) i wykonuje kod [...]odpowiadające im czasy (tutaj, cztery razy).
  • DUP: Duplikuj ostatni wpis na stosie.
  • " ": Wciśnij ciąg (tj. Ciąg z jedną spacją) na stos.
  • +: Weź dwa obiekty ze stosu i zwróć je razem, dla łańcuchów: Połączone.
  • 4: Wciśnij liczbę 4na stos.
  • ROLLD: Bierze ostatni element (tutaj: 4właśnie wypchnęliśmy) ze stosu i zrzuca następny element tak daleko w dół stosu, jak określa liczba, którą właśnie wzięliśmy ze stosu.
  • SWAP: Zamienia dwa ostatnie elementy stosu.
  • 2: Naciśnij 2na stos.
  • PICK: Bierze element (tutaj: 2Właśnie wrzuciliśmy na stos), interpretuje go jako liczbę n i kopiuje n-ty element ze stosu.
Golar Ramblar
źródło
7

JavaScript, 28 bajtów

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

Spróbuj

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>

Kudłaty
źródło
Myślę, że możesz zapisać bajt lub dwa, przechowując wynik c+'\n'+cw postaci tymczasowej.
Neil
Nieważne, pomyliłem się, to wciąż 28 bajtów.
Neil
@ Neil: Tak, istnieje kilka opcji przypisywania rzeczy do zmiennej, ale wszystkie mają wielkość 28 bajtów lub więcej.
Kudłaty
6

Galaretka , 8 bajtów

1 bajt dzięki Erik the Outgolfer.

x4,`Ks3Y

Wypróbuj online!

Leaky Nun
źródło
Zastanawiałem się, jak to zrobić ... Miałem x4µ©;⁶;®œs3Y12 bajtów, ponieważ nie mogłem wymyślić, jak uniknąć mnożenia całego mojego pośredniego kroku, ale miło!
HyperNeutrino
1
Wiesz, tam jest wbudowana Kdo prowadzenia j⁶. Aha, i jest szybkie, `aby przekonwertować diadę na monadę, używając tego samego argumentu po obu stronach.
Erik the Outgolfer
5

Java 7, 56 55 bajtów

-1 Dzięki Dziurawej Zakonnicy za wskazanie miejsca, za którym tęskniłem

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

Po prostu zastępuje kropki danym znakiem, dla wejścia nr:

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

Wypróbuj online!

PunPun1000
źródło
5

PHP, 32 bajty

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

Wypróbuj online!

Jörg Hülsermann
źródło
Co ciekawe <?=$a=$argn,"$a$a\n$a $a\n$a$a$a";(rzeczywisty podział linii zamiast \ n oczywiście) ma dokładnie taką samą liczbę bajtów.
Christoph
@Christoph spraw, aby było to twoje podejście. nie próbowałem tego alternatywnego sposobu
Jörg Hülsermann
5

sed, 28 18 bajtów

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

Wypróbuj online!

eush77
źródło
ten nowy nie działa, stary edytował: działa, ale zapomniałeś: w odpowiedzi
Luc H
@Ayoungcoder Przepraszamy, źle wkleiłem finał :. Naprawiony.
eush77
wypróbuj online powinno być [Wypróbuj online!]: tio.run/nexus/sed#@19spWelpqYWk6emACLU1Kz@/0/... „sed - TIO Nexus”
Luc H
@Ayoungcoder Oczywiście, dziękuję.
eush77
5

Brain-Flak , 76 70 + 1 = 71 bajtów

Wymaga -cflagi

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

Wypróbuj online!

Kreator pszenicy
źródło
Można zapisać 6 bajtów, jeśli zastąpi (()()()()()){}się ([])[]{}.
0
Konkurs :)
DJMcMayhem
5

Pyth, 7 bajtów

jc3.[9d

Wypróbuj to online.

Wyjaśnienie:

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
źródło
4

Brain-Flak , 61 , 59 bajtów

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

Wypróbuj online!

Jest to 58 bajtów kodu +1bajtu dla -cflagi, która umożliwia wejście i wyjście ASCII.

Wyjaśnienie:

(((
   (
    (
     (

      #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
źródło
4

C (gcc) , 49 47 bajtów

Zaoszczędzono 2 bajty dzięki 2501!

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

Wypróbuj online! ma końcowy znak nowej linii

Conor O'Brien
źródło
Możesz zapisać dwa bajty, wykonując:for(j=11;j;)...
2501
3

Oktawa , 36 bajtów

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

Wypróbuj online!

Wyjaśnienie

Tworzy to macierz znaków 3x3 z powtarzanym znakiem wejściowym i ustawia swój piąty wpis w kolejności durowej kolumny (tj. Jego środek) na 32(ASCII dla spacji).

Luis Mendo
źródło
3

Ruby , 27 25 bajtów

Zaoszczędź 2 bajty dzięki Level River St

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

Wypróbuj online!

Alex
źródło
gdy robisz takie odpowiedzi, dołącz również stopkę jako kod, ponieważ nie działa bez niej
Luc H
@Ayoungcoder jest to funkcja anonimowa. możesz przypisać ją do zmiennej ( f=...), a następnie wywołać ją za pomocąf.call(...)
Cyoce
1
Możesz użyć dosłownie nowego wiersza wewnątrz cudzysłowów zamiast "\n"dla zaoszczędzenia 1 bajtu. Jeszcze lepsze wykorzystanie, $/która jest specjalną zmienną ustawioną domyślnie na nową linię - oszczędność 2 bajtów.
Level River St
1 bajt mniej niż trrozwiązanie. dobra robota
Cyoce,
3

Brainfuck, 40 bajtów

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

Wypróbuj online! Wymaga implementacji, która może uzyskać dostęp z lewej strony pozycji początkowej.

Zobacz także: „ Gravitonowa odpowiedź”, która ma inne podejście (ale jest dłuższa).


Wyjaśnienie:

Brainfuck może wykonywać wiele fajnych sztuczek dzięki ograniczonemu zestawowi instrukcji. Niestety, ta odpowiedź nie korzysta z żadnej z nich, ponieważ taniej (pod względem bajtów) jest po prostu wszystko zaszyfrować.

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

# = znak wejściowy, _ = spacja (ASCII 32), \ n = nowa linia (ASCII 10)


Wyniki w tym pięknym polu (dla danych wejściowych „+”):

+++
+ +
+++
Zack C.
źródło
3

05AB1E , 7 6 bajtów

-1 bajt dzięki carusocomputing.

ж¹ðJû

Wyjaśnienie:

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

Wykorzystuje kodowanie CP-1252 . Wypróbuj online!

Oliver Ni
źródło
Oooo ... Inteligentne, nigdy nie myślę o tym, jak działa palindromize na nowych liniach.
Magic Octopus Urn
ж¹ðJûdla 6 bajtów.
Magic Octopus Urn
3

Pyt , 11 bajtów

jc++K*z4dK3

Wypróbuj online!

Wyjaśnienie:

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
chromat
źródło
Witamy w PPCG!
Stephen
2

Swift3, 50 bajtów

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

Wykorzystuje operator trójskładnikowy do drukowania różnych ciągów, w zależności od wiersza.

Wypróbuj online

Martyav
źródło
2

C #, 50 bajtów

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

Przypadek testowy:

var f = new Action<string>(
a=>Console.Write(a+a+a+"\n"+a+" "+a+"\n"+a+a+a);
);
f("#");
CHENGLIANG YE
źródło
Musisz w pełni zakwalifikować ConsoleieSystem.Console..
TheLethalCoder
2

Vim, 9 naciśnięć klawiszy

Zakładając, że znak wejściowy jest obecny w buforze, vim upraszcza to

x3pY2plr<space>

Prawdopodobnie są tu jakieś magiczne polecenia vima (zawsze wydaje się, że są), więc mile widziane są sugestie ulepszeń. Tylko jedno naciśnięcie klawisza za klawiszem V!

algmyr
źródło
Jestem prawie pewien, że jest tak krótki, jak to tylko możliwe. Niezła odpowiedź!
DJMcMayhem
2

Zespół Z80 lub 8080, kod maszynowy 21 bajtów

Załóżmy, że urządzenie we / wy zamapowane w pamięci:

              Z80 8080
3A xx xx ld a, (wejście) wejście lda; uzyskać znak wejściowy
11 0A 20 ld de, 200ah lxi d, 200ah; spacja i nowa linia
21 rrrr ld hl, wyjście lxi h, wyjście; uzyskać adres wyjściowy
77 ld (hl), mov m, a; znak wyjściowy * 3
77 ld (hl), mov m, a
77 ld (hl), mov m, a
73 ld (hl), e mov m, e; wyjście nowej linii
77 ld (hl), mov m, a; znak wyjściowy
72 ld (hl), d mov m, d; przestrzeń wyjściowa
77 ld (hl), mov m, a; znak wyjściowy
73 ld (hl), e mov m, e; wyjście nowej linii
77 ld (hl), mov m, a; znak wyjściowy * 3
77 ld (hl), mov m, a
77 ld (hl), mov m, a
76 halt hlt; lub C9 ret

Tłumacz nie jest potrzebny!

Hexdump:

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

gdzie adres wejściowy to FF00h, a adres wyjściowy jest odwzorowany na FF01h. Rzeczywiste adresy będą zależeć od faktycznego sprzętu. Oczywiście zakłada to, że operacje we / wy są mapowane w pamięci. Jeśli jest mapowany we / wy, zajęłoby to kilka dodatkowych bajtów, ponieważ instrukcje we / wy Z80 i 8080 mają po dwa bajty. Zakłada się również, że urządzenie wyjściowe interpretuje 0Ah jako nową linię i nie wymaga CR (0Dh), który dodałby dodatkowe 4 bajty do programu.

Dan Howell
źródło
Witamy w Codegolf.stackexchange. Wygląda na to, że masz wszystko pod kontrolą. Przeczytaj centrum pomocy i listę najczęściej zadawanych pytań. Dobry pierwszy post
Rohan Jhunjhunwala
Czy możesz podać zrzut heksowy swojego kodu?
CalculatorFeline
Bajty szesnastkowe znajdują się w pierwszej kolumnie, ale jeśli chcesz mieć „czysty” zrzut heksowy, dodałem go.
Dan Howell
2

J-uby , 22 20 bajtów

-2 bajty dzięki @Jordan

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

Wyjaśnienie

String#trjest opartą na znakach metodą zamiany Ruby. Pierwszy &wiąże :trsię "...\n. .\n..."z drugim, a częściowo częściowo się '.'do niego odnosi . Rzeczywiście tak jest->s{"...\n. .\n...".tr('.',s)}

Cyoce
źródło
Czy :trdziałałoby tak dobrze jak :gsubtutaj?
Jordan
@Jordan tak, dziękuję!
Cyoce,