Espansore automatico di scatole


16

introduzione

A volte, le mie scatole sono troppo piccole per adattarsi a qualsiasi cosa. Ho bisogno che tu faccia un espansore per scatole! Quindi, ciò che rende una scatola una scatola in questa sfida.

 OOOO
O    O
O    O
O    O
 OOOO

Gli angoli della scatola sono sempre spazi. La scatola stessa può essere fatta con lo stesso personaggio. Quel personaggio può essere qualsiasi carattere ASCII stampabile , tranne uno spazio. Quindi, questi sono questi personaggi:

!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Le lunghezze laterali della casella in alto sono 4, 3 . Puoi presumere che la lunghezza del lato sia sempre positiva . Ciò significa che questa è la scatola più piccola che devi gestire:

 #
# #
 #

Per espandere una casella, è necessario incrementare ogni lunghezza laterale. Esaminiamo questo passo per passo con l'esempio sopra. Innanzitutto prendiamo il lato superiore della scatola, che è:

 OOOO

Lo espandiamo di uno, quindi otteniamo:

 OOOOO

Questa è la parte superiore e inferiore della scatola ora. Dopodiché, facciamo lo stesso con i lati a sinistra e a destra:

O
O
O

diventa:

O
O
O
O

Ora riassembliamo la scatola, che si traduce in:

 OOOOO
O     O
O     O
O     O
O     O
 OOOOO

L'obiettivo

Dato un riquadro, espanderlo di 1. Il riquadro può essere indicato in più righe o in un array.

Casi test

 OOOO          OOOOO
O    O    >   O     O
 OOOO         O     O
               OOOOO

 XXXXXX        XXXXXXX
X      X  >   X       X
X      X      X       X
 XXXXXX       X       X
               XXXXXXX

 ~             ~~
~ ~       >   ~  ~
 ~            ~  ~
               ~~

Questo è , quindi vince l'invio con il minor numero di byte!


1
la scatola può avere una nuova linea prima di essa?
Riley,

@Riley Sì, è consentito :).
Adnan,

1
La scatola può essere riempita di spazi?
Leaky Nun,

@LeakyNun Sì, puoi farlo.
Adnan,

Risposte:


4

V , 6 5 byte

yêpjÄ

Provalo online!

Questo è in realtà un byte più lungo di quanto dovrebbe essere. Sarebbe dovuto essere:

äêjÄ

Ma questo ha un bug sconosciuto. :(

Spiegazione:

yê     "yank this colum
  p    "paste what we just yanked
   j   "move down to line 2
    Ä  "and duplicate this line

Cosa fa l'altro?
Conor O'Brien,

@ ConorO'Brien äè l'operatore duplicato (essenzialmente "y" e "p" insieme in un byte), così äêcome "colonna duplicata"
DJMcMayhem

11

Vim, 7 byte

♥GYPjYp

dove ♥ è Control-V.

           The cursor starts on the first non-whitespace character of the first line.
♥G         Enter visual block mode and go to bottom of document.
  YP       Duplicate this column.
    j      Move down to the second line of the file.
     Yp    Duplicate this line.

enter image description here


Perché non usare YPentrambe le volte per coerenza?
Neil,

Ho accidentalmente colpito pdurante la registrazione dell'animazione, quindi mi sono bloccato durante la trascrizione della risposta. Importa? > _>;
Lynn,

Ho trovato strana l'incoerenza, ma mi piace la tua spiegazione.
Neil,

Questa è esattamente la stessa cosa della mia V risposta, solo che mi è capitato di creare mappature a un byte per <C-v> Ge YP. Fa un po 'sentire la mia lingua a buon mercato. : /
DJMcMayhem

Hm, control-V si presenta come un cuore sul mio telefono ... ❤
Decadimento beta

6

JavaScript (ES6), 57 53 52 byte

s=>s.replace(/^.(.)/gm,s="$&$1").replace(/(\n.*)/,s)

Spiegazione: Il primo regexp duplica la seconda colonna e il secondo regexp duplica la seconda riga, allargando così la casella come desiderato. Modifica: salvato 4 byte grazie a MartinEnder ♦.


6

Python, 49 42 byte

Lambda anonimo:

-7 da xnor

lambda s:[t[:2]+t[1:]for t in s[:2]+s[1:]]

Versione precedente:

D=lambda s:s[:2]+s[1:]
lambda s:D(list(map(D,s)))

D è una funzione che duplica il secondo elemento di una sequenza.


1
L'idea di riutilizzare la funzione è intelligente, ma sembra essere più breve per ripetere solo il codice: lambda L:[s[:2]+s[1:]for s in L[:2]+L[1:]].
xnor

Nota a map(D,D(s))
margine

5

Retina , 20 byte

Il conteggio dei byte presuppone la codifica ISO 8859-1.

1`¶
¶$%'¶
%2=`.
$&$&

Provalo online! (Esistono diverse linee aggiuntive che abilitano una suite di test in cui i casi di test sono separati da due avanzamenti di riga.)

Spiegazione

1`¶
¶$%'¶

1è un limite che limita Retina ad applicare la sostituzione solo alla prima partita trovata. corrisponde a un singolo avanzamento riga, quindi dobbiamo solo considerare di sostituire l'alimentatore alla fine della prima riga. Viene sostituito con ¶$%'¶, dove $%'inserisce l'intera riga dopo la corrispondenza (un elemento di sostituzione specifico di Retina). Quindi, questo duplica la seconda riga.

%2=`.
$&$&

Qui, %è la modalità per riga, quindi ogni riga viene elaborata singolarmente e le righe vengono nuovamente unite successivamente. 2=è anche un limite. Questo significa "applica la sostituzione solo alla seconda partita". La partita stessa è semplice un singolo personaggio e la sostituzione lo duplica. Quindi, questa fase duplica la seconda colonna.


5

Haskell, 24 byte

f(a:b:c)=a:b:b:c
f.map f

Usa l' idea di RootTwo di duplicare la seconda riga e colonna. Lo map ffa ad ogni riga e f.poi lo fa alle righe.


4

PowerShell v2 +, 57 53 52 byte

param($n)($n-replace'^.(.)','$&$1')[0,1+1..$n.count]

Leggermente simile alla risposta JavaScript di Neil . Il primo rimpiazzo corrisponde all'inizio della riga e ai due caratteri successivi e li sostituisce due volte con il primo carattere e il secondo carattere. Invece di una seconda sostituzione, viene sostituito per l'indicizzazione di array per duplicare la seconda riga. Accetta input come una matrice di stringhe. Le sezioni di array risultanti vengono lasciate sulla pipeline e la stampa è implicita.

Risparmiato 4 byte grazie a Martin.

Qualche esempio:

PS C:\Tools\Scripts\golfing> .\automatic-box-expander.ps1 ' oooo ','o    o',' oooo '
 ooooo 
o     o
o     o
 ooooo 

PS C:\Tools\Scripts\golfing> .\automatic-box-expander.ps1 ' # ','# #',' # '
 ## 
#  #
#  #
 ## 

2
@MartinEnder Sì, grazie, O saggio Regex-Sensei.
AdmBorkBork,


3

MATL , 12 byte

tZy"@:2hSY)!

L'input è un array di caratteri 2D, con punto e virgola come separatore di riga. Ad esempio, il primo caso di test ha input

[' OOOO ';'O    O';' OOOO ']

Provalo online! Casi di test 1 , 2 , 3 .

Spiegazione

Il codice esegue due volte le seguenti operazioni: ripetere la seconda riga dell'array e trasporre.

Per ripetere la seconda riga di un array m× n, il vettore [1 2 2 3 ... m]viene utilizzato come indice di riga. Questo vettore viene generato come segue: intervallo [1 2 3 ... m], allega un altro 2, ordina.

t       % Take input implicitly. Duplicate
Zy      % Size of input as a two-element array [r, c]
"       % For each of r and c
  @     %   Push r in first iteration (or c in the second)
  :     %   Generate range [1 2 3 ... r] (or [1 2 3 ... c])
  2hS   %   Append another 2 and sort
  Y)    %   Apply as row index
  !     %   Transpose
        % End for. Display implicitly


2

SED 69 19 (14 + 1 per -r) 15

s/.(.)/&\1/;2p   

1
Non puoi farlo /.\(.\)/\0\1;2p?
Neil,

@Neil Ho cercato dappertutto 2p, ho pensato che ci fosse un modo per farlo, ma non sono riuscito a trovarlo. Grazie!
Riley,

La parte -r '' non è necessaria finché si aggiunge 1 byte per il flag r, risparmiando così 3 byte. Inoltre, poiché hai modificato la tua prima versione del codice, la spiegazione alla fine non è più valida.
seshoumara,

@Neil Non riuscivo a credere ai miei occhi quando ho visto il \0backreference, dato che iniziano da 1. Il manuale online di GNU sed non ne parla. Tuttavia, l'utilizzo &è equivalente e più breve.
seshoumara,

@seshoumara Ah, quelle sottigliezze della versione regexp ... quale si usa \0allora?
Neil,

1

CJam , 14 byte

q~{~\_@]z}2*N*

Simile a mia risposta MATL , ma ripete la penultima riga invece della seconda.

Provalo online!

Spiegazione

q                e# Read input
 ~               e# Interpret as an array
  {      }2*     e# Do this twice
   ~             e# Dump array contents onto the stack
    \            e# Swap top two elements
     _           e# Duplicate
      @          e# Rotate
       ]         e# Pack into an array again
        z        e# Zip
            N*   e# Join by newlines. Implicitly display

1

K, 15 byte

2{+x@&1+1=!#x}/

Prende input come una matrice di caratteri:

  b: (" OOOO ";"O    O";" OOOO ")
(" OOOO "
 "O    O"
 " OOOO ")

Applicare due volte una funzione ( 2{…}/) che fornisce al transpose ( +) dell'argomento destro indicizzato ( x@) dalla decodifica incrementale della lunghezza ( &) di uno più ( 1+) un elenco delle posizioni pari a 1 (1= ) nell'intervallo da 0 a ( !) la dimensione della dimensione esterna dell'argomento giusto ( #x).

Passo dopo passo,

  #b
3
  !#b
0 1 2
  1=!#b
0 1 0
  1+1=!#b
1 2 1
  &1+1=!#b
0 1 1 2
  b@&1+1=!#b
(" OOOO "
 "O    O"
 "O    O"
 " OOOO ")
  +b@&1+1=!#b
(" OO "
 "O  O"
 "O  O"
 "O  O"
 "O  O"
 " OO ")
  2{+x@&1+1=!#x}/b
(" OOOOO "
 "O     O"
 "O     O"
 " OOOOO ")

Provalo qui con oK.


1

APL, 17 15 byte

{⍉⍵⌿⍨1+2=⍳≢⍵}⍣2

Test:

      smallbox largebox
┌───┬──────┐
│ # │ OOOO │
│# #│O    O│
│ # │O    O│
│   │O    O│
│   │ OOOO │
└───┴──────┘
      {⍉⍵⌿⍨1+2=⍳≢⍵}⍣2 ¨ smallbox largebox
┌────┬───────┐
│ ## │ OOOOO │
│#  #│O     O│
│#  #│O     O│
│ ## │O     O│
│    │O     O│
│    │ OOOOO │
└────┴───────┘

Spiegazione:

             ⍣2   run the following function 2 times:
{           }     stretch the box vertically and transpose
         ⍳≢⍵      indices of rows of box
       2=         bit-vector marking the 2nd row
  ⍵/⍨1+           replicate the 2nd row twice, all other rows once
 ⍉                transpose

Il simbolo APL monadico ⍉ è trasposizione matrice, che non è la stessa cosa di ruotare di 90 gradi.
Giovanni,

1
@JohnE: certo. Devo essere stato più stanco di quanto pensassi. In realtà ruotare di 90 gradi sarebbe ⌽⍉o ⊖⍉, ma in questo caso non importa.
Marin

0

ListSharp , 326 byte

STRG a=READ[<here>+"\\a.txt"]
ROWS p=ROWSPLIT a BY ["\r\n"]
ROWS p=GETLINES p [1 TO p LENGTH-1]
ROWS p=p+p[1]+p[0]
STRG o=p[0]
ROWS y=EXTRACT COLLUM[2] FROM p SPLIT BY [""]
ROWS x=EXTRACT COLLUM[3] FROM p SPLIT BY [""]
[FOREACH NUMB IN 1 TO o LENGTH-1 AS i]
ROWS m=COMBINE[m,x] WITH [""]
ROWS m=COMBINE[y,m,y] WITH [""]
SHOW=m

Devo assolutamente aggiungere l'annidamento di funzioni, ma funziona molto bene

commenta se vuoi una spiegazione


0

JavaScript, 160 146 141 byte

s=>{a=s[1];r="";l=s.split("\n");m=l.length;n=l[0].length;for(i=0;i<=m;i++){for(j=0;j<=n;j++)r+=!(i%m)&&j%n||i%m&&!(j%n)?a:" ";r+="\n"}return r}

0

Dyalog APL , 14 byte

(1 2,1↓⍳)¨∘⍴⌷⊢

(

1 2, {1, 2} anteposto a

1↓ un elemento è caduto da

gli indici

di ogni

di

il {conteggio righe, conteggio colonne}

indicizza in

l'argomento

Ad esempio per

 XX
X  X
 XX

troviamo gli indici; {1, 2, 3} per le righe e {1, 2, 3, 4} per le colonne. Ora lasciamo cadere gli elementi iniziali per ottenere {2, 3} e {2, 3, 4}, e quindi anteporre con {1, 2}, dando {1, 2, 2, 3} e {1, 2, 2, 3, 4}. Infine, lo usiamo per selezionare righe e colonne, raddoppiando contemporaneamente la riga 2 e la colonna 2.

ProvaAPL online!


0

Rubino, 46 ​​byte

->a{a.map{|r|r.insert(2,r[1])}.insert(2,a[1])}

Soluzione molto semplice, prendendo input come matrice di linee. Non mi piacciono i duplicati insert, quindi proverò a giocare a golf.


0

C #, 127 124 byte

s=>{int n=s.Count-1,i=0;s[0]=s[n]=s[0].Insert(1,s[0][1]+"");s.Insert(1,s[1]);for(;i++<n;)s[i]=s[i].Insert(1," ");return s;};

Compila per a Func<List<string>, List<string>> .

Versione formattata:

s =>
{
    int n = s.Count - 1, i = 0;

    s[0] = s[n] = s[0].Insert(1, s[0][1] + "");

    s.Insert(1, s[1]);

    for (; i++ < n;)
        s[i] = s[i].Insert(1, " ");

    return s;
};
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.