Prova a fare un quadrato!


20

Compito

Dato un carattere stampabile non bianco, crea una rappresentazione quadrata 3x3 di quell'input. Ad esempio, se l'input è #, allora l'output è:

###
# #
###

Regole

  • Il formato di output è rigoroso, sebbene sia consentita una nuova riga finale. Significa che è richiesto lo spazio nel mezzo e anche i due caratteri di nuova riga che separano le tre linee.

Casi test

Ingresso: #

Produzione:

###
# #
###

Ingresso: A

Produzione:

AAA
A A
AAA

Ingresso: 0

Produzione:

000
0 0
000

punteggio

Questo è . Vince la risposta più breve in byte.


2
Il fatto che la dimensione sia fissa consente una certa ottimizzazione. Le risposte dalla sfida collegata probabilmente non saranno competitive qui. Quindi non penso che sia un duplicato
— Luis Mendo

12
Sono stato io a votare verso il basso, perché è stata una sfida semplice e noiosa. Di solito sono un fan delle sfide facili, in quanto sono un buon posto per iniziare i nuovi giocatori di golf, ma questo è semplicemente troppo facile.
— Shaggy,

32
@Ayoungcoder È un motivo perfettamente valido per votare una sfida.
— Wheat Wizard

2
@Shaggy: in termini di difficoltà, c'è difficoltà a scrivere il programma e difficoltà a giocare a golf. Questo programma è facile da scrivere, ma non sono così sicuro che sia facile da golf.

5
Secondo me, questa è una bella sfida per le persone che stanno appena iniziando a giocare a golf con il codice. È bello avere un mix di difficoltà. Il sovraccarico su qualsiasi tipo sarà a scapito di una parte della comunità. Quindi, sono contento che questa sfida sia stata scritta.
— isaacg,

Risposte:


30

Carbone , 5 3 byte

B³S

Provalo online! Modifica: risparmiato il 40% grazie a @carusocomputing. Spiegazione:

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

3
Sento che questo è barare ...> _>
— HyperNeutrino,

14
Quindi, ovviamente, B³Sper ingannare la merda vivente da questo.
— Magic Octopus Urn,

1
Perché questo sarebbe barare? @carusocomputing e neil la sua risposta mi sembra giusta
— Luc H,

1
@Ayoungcoder "barare" come in "sembra economico" non come in "barare letterale"; il codice ha un built-in per "stampare una scatola di dimensioni n usando il carattere s", il codice più breve per questa sfida è: 1. Leggi input. 2. Definire la dimensione. 3. Casella di stampa. La risposta a questa sfida logicamente non sarà inferiore a 2 byte se l'input è implicito.
— Magic Octopus Urn,

2
@carusocomputing Ah, l'ironia: il comportamento quadrato implicito mi ha infastidito nella mia risposta a visualizzare di nuovo l'algoritmo euclideo .
— Neil,


19

Python 2 , 32 byte

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

Provalo online!
Per s='a': il centro lo s+'\n \n'+sgenera a\n \nae lo s.jointrasforma (grassetto sono quelli che aggiunge), perché accetta una stringa come iterabile, quindi è circondata dai due caratteri mancantiaa\na a\naaa.join.join


In che modo questo aggiunge i personaggi alla linea di mezzo? Potresti spiegare la risposta per favore?
— Notts90,

1
@ Notts90 ha aggiunto una spiegazione c:
— Rod,

grazie non lo sapevo .join poteva iterare una stringa.
— Notts90,

Funziona anche con Python 3. A proposito, molto bello. (Inoltre, usando lo stesso metodo si 3*c+c.join('\n \n')+3*clega a 32.)
— Jonathan Allan

15

MATL , 5 byte

3Y6*c

Provalo online!

Spiegazione

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
è stato veloce! non mi aspettavo che un 5 byte arrivasse così velocemente.
— Luc H,

2
Lingue per giocare a golf, sai ... ¯ \ _ (ツ) _ / ¯
— Luis Mendo,

11
Certo, perché non dovresti avere un valore letterale predefinito per [vero vero vero; vero falso vero; true true true]
— PunPun1000,

11
@ PunPun1000 In realtà è molto usato (insieme alla convoluzione) in quanto è la maschera standard a 8 connettività ( Moore neighboorhood )
— Luis Mendo,

3
@LuisMendo È fantastico, impara qualcosa di nuovo ogni giorno qui, non sempre sul golf del codice
— PunPun1000,

13

05AB1E , 8 byte

4×ð«û3ô»

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

Idea originale che usa 30 come numero binario (incompiuto, qualcun altro prova questo in un'altra lingua):

05AB1E , 12 byte

30bûTIð«‡3ô»

Provalo online!



11

Python 3.6 , 33 byte

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

Provalo online!


Nessun problema. Sembra che sia effettivamente in esecuzione 3.6.1; se provi import syse poi sys.versionnel sostitu, restituisce 3.6.1 anziché 3.5.2. Non ho idea del motivo per cui si dice 3.5.2 all'inizio, sembra che abbiano fatto un errore lì!
— numbermaniac,

2
Oh, haha, un caso di "non credere sempre a quello che leggi" - grazie!
— Jonathan Allan,

9

RPL (Reverse Polish Lisp) , 60 caratteri

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

(Notare che "→" è un singolo carattere sull'HP48 e calcolatori compatibili)

Rappresenterebbe visivamente ciò che vuoi avendo tre oggetti in pila:

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

Se insisti a restituirlo come una stringa, devi aggiungere anche i caratteri di nuova riga e combinare le stringhe, lasciate come esercizio al prossimo tester.

Input (può essere qualsiasi cosa, non è necessario che sia una stringa) Codice inserito Risultato

Spiegazione:

  • →STR: Trasforma l'ultimo oggetto nello stack in una stringa. (Quindi l'input può essere qualsiasi cosa, ad esempio un numero.)
  • 1 4: Spingere il numero 1e 4nello stack.
  • START [...] NEXT: Come un ciclo for ma senza accesso alla variabile counter. Prende due numeri dallo stack (qui, abbiamo appena premuto 1e 4) ed esegue il codice [...]i tempi corrispondenti (qui, quattro volte).
  • DUP: Duplica l'ultima voce nello stack.
  • " ": Inserire la stringa (ovvero la stringa con uno spazio bianco) nello stack.
  • +: Prende due oggetti dallo stack e restituiscili aggiunti insieme, per le stringhe: concatenati.
  • 4: Spingere il numero 4nello stack.
  • ROLLD: Prende l'ultimo elemento (qui: 4che abbiamo appena spinto) dallo stack e lancia l'elemento successivo fino allo stack come specificato dal numero che abbiamo appena preso dallo stack.
  • SWAP: Scambia gli ultimi due elementi dello stack.
  • 2: Spingere 2verso la pila.
  • PICK: Prende un elemento (qui: 2abbiamo appena inserito nello stack), lo interpreta come un numero n e copia l'ennesimo elemento dallo stack.

7

JavaScript, 28 byte

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

Provalo

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>


Penso che potresti essere in grado di salvare un byte o due memorizzando il risultato c+'\n'+cin un temporaneo.
— Neil,

Non importa, ho contato male, è ancora 28 byte.
— Neil,

@Neil: Sì, ci sono un paio di opzioni per assegnare elementi a una variabile, ma arrivano tutti a 28 byte o più.
— Shaggy,

6

Gelatina , 8 byte

1 byte grazie a Erik the Outgolfer.

x4,`Ks3Y

Provalo online!


Mi stavo chiedendo come fare ... Avevo x4µ©;⁶;®œs3Y12 byte perché non riuscivo a capire come evitare che la ripetizione moltiplicasse il mio intero passaggio intermedio ma bello!
— HyperNeutrino,

1
Sai, c'è un incorporato Kper fare j⁶. Oh, e c'è un veloce, `per convertire una diade in una monade usando lo stesso argomento su entrambi i lati.
— Erik the Outgolfer,

5

Java 7, 56 55 byte

-1 Grazie a Leaky Nun per aver indicato lo spazio che mi mancava

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

Sostituisce semplicemente i punti con il carattere specificato, per input #:

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

Provalo online!


5

PHP, 32 byte

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

Provalo online!


Abbastanza interessante <?=$a=$argn,"$a$a\n$a $a\n$a$a$a";(l'interruzione di riga reale invece di \ n ovviamente) ha esattamente lo stesso numero di byte.
— Christoph,

@Christoph rendilo il tuo approccio. non ho provato questo modo alternativo
— Jörg Hülsermann,



5

Pyth, 7 byte

jc3.[9d

Prova questo online.

Spiegazione:

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

4

Brain-Flak , 61 , 59 byte

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

Provalo online!

Si tratta di 58 byte di byte di codice +1per il -cflag che abilita input e output ASCII.

Spiegazione:

(((
   (
    (
     (

      #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

Ottava , 36 byte

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

Provalo online!

Spiegazione

Questo crea una matrice di caratteri 3x3 con il carattere di input ripetuto e imposta la sua 5a voce nell'ordine della colonna maggiore (cioè il suo centro) su 32(ASCII per lo spazio).



3

Rubino , 27 25 byte

Salvato 2 byte grazie a Level River St

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

Provalo online!


quando stai rispondendo in questo modo, includi anche il piè di pagina come codice perché non funziona senza
— Luc H,

@Ayoungcoder questa è una funzione anonima. puoi assegnarlo a una variabile ( f=...) quindi chiamarlo conf.call(...)
— Cyoce

1
È possibile utilizzare una nuova riga letterale tra virgolette anziché "\n"per un risparmio di 1 byte. Uso ancora migliore, $/che è una variabile speciale impostata su newline per impostazione predefinita, risparmiando 2 byte.
— Level River St,

1 byte in meno rispetto alla trsoluzione. bel lavoro
— Cyoce,

3

Brainfuck, 40 byte

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

Provalo online! Richiede un'implementazione che può accedere a sinistra della posizione iniziale.

Vedi anche: la risposta brainfuck di Graviton che adotta un approccio diverso (ma è più lungo).


Spiegazione:

Brainfuck può fare molti trucchi interessanti con il suo set di istruzioni limitato. Sfortunatamente, questa risposta non ne usa nessuna, perché è più economico (in termini di byte) codificare tutto.

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

# = carattere di input, _ = spazio (ASCII 32), \ n = newline (ASCII 10)


Risultati in questo bellissimo riquadro (per input '+'):

+++
+ +
+++

3

05AB1E , 7 6 byte

-1 byte grazie al carusocomputing.

ж¹ðJû

Spiegazione:

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

Utilizza la codifica CP-1252 . Provalo online!


Oooo ... Intelligente, non penso mai a come funziona palindromize su newline.
— Magic Octopus Urn

ж¹ðJûper 6 byte.
— Magic Octopus Urn

3

Pyth , 11 byte

jc++K*z4dK3

Provalo online!

Spiegazione:

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

Benvenuti in PPCG!
— Stephen,


2

Swift3, 50 byte

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

Questo utilizza l'operatore ternario per stampare stringhe diverse, a seconda della riga.

Provalo online



2

C #, 50 byte

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

Caso di prova:

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

È necessario qualificare pienamente ConsoleieSystem.Console..
— TheLethalCoder

2

Vim, 9 battute

Supponendo che il carattere di input sia presente in un buffer, vim lo rende semplice

x3pY2plr<space>

Probabilmente ci sono alcuni comandi magici d'uso di Vim qui (sembrano essercene sempre alcuni) quindi i suggerimenti per il miglioramento sono ben accetti. Solo una sequenza di tasti dietro V!


Sono abbastanza sicuro che sia il più breve possibile. Bella risposta!
— DJMcMayhem

2

Gruppo Z80 o 8080, codice macchina 21 byte

Supponiamo che un dispositivo I / O mappato in memoria:

              Z80 8080
3A xx xx ld a, (input) ingresso lda; ottenere il carattere di input
11 0A 20 ld de, 200ah lxi d, 200ah; spazio e newline
21 yy yy ld hl, output lxi h, output; ottenere l'indirizzo di uscita
77 ld (hl), a mov m, a; carattere di output * 3
77 ld (hl), a mov m, a
77 ld (hl), a mov m, a
73 ld (hl), e mov m, e; uscita newline
77 ld (hl), a mov m, a; carattere di output
72 ld (hl), d mov m, d; spazio di uscita
77 ld (hl), a mov m, a; carattere di output
73 ld (hl), e mov m, e; uscita newline
77 ld (hl), a mov m, a; carattere di output * 3
77 ld (hl), a mov m, a
77 ld (hl), a mov m, a
76 stop hlt; o C9 ret

Nessun interprete necessario!

hexdump:

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

dove l'indirizzo di input è su FF00h e l'indirizzo di output è mappato su FF01h. Gli indirizzi effettivi dipenderanno dall'hardware effettivo. Ovviamente ciò presuppone che l'I / O sia mappato in memoria. Se è mappato I / O, occorrerebbero diversi byte extra poiché le istruzioni I / O Z80 e 8080 sono due byte ciascuna. Ciò presuppone anche che il dispositivo di output interpreti 0Ah come una nuova riga e non richieda un CR (0Dh) che aggiungerebbe altri 4 byte al programma.


Benvenuto in Codegolf.stackexchange, mentre sembra che tu abbia tutto sotto controllo, ti preghiamo di leggere il centro assistenza e l'elenco delle domande frequenti. Buon primo post
— Rohan Jhunjhunwala,

Puoi fornire un hexdump del tuo codice?
— CalculatorFeline

I byte esadecimali si trovano nella prima colonna, ma se vuoi un hexdump "puro", l'ho aggiunto.
— Dan Howell,

2

J-uby , 22 20 byte

-2 byte grazie a @Jordan

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

Spiegazione

String#trè il metodo di sostituzione del personaggio di Ruby. Il primo &si lega :tra "...\n. .\n...", e la seconda parte si applica '.'ad esso. In effetti, questo è->s{"...\n. .\n...".tr('.',s)}


Funzionerebbe :trcosì come :gsubqui?
— Giordania,

@Jordan sì, grazie!
— Cyoce,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.