Bilden Sie Fliesen in einem rechteckigen Ring

8

Geben Sie die Eingabe ein tilesXund tilesYerstellen Sie eine Methode, mit der aus den Kacheln ein rechteckiger Ring entsteht.

Die Funktion muss die Kacheln in einem Ring wie folgt anordnen:

Geben Sie hier die Bildbeschreibung ein

  • tilesXund tilesYsind immer positive ganzzahlige Werte, können nicht 0 sein
  • tilesXund tilesYnicht immer gleich, erwarten Werte wie: 2x5, 6x3usw.
  • Eine Überprüfung auf ungültige Eingabe ist nicht erforderlich
  • Sie können die Kacheln auf beliebige Weise anzeigen, einschließlich 2D-Arrays, ASCII-Grafiken oder gedrucktem Text.
  • Es gibt keine strenge Möglichkeit, wie die Eingabe übergeben wird, solange es sich um zwei Ganzzahlen handelt.
  • Kann keine Linie sein, das Zeichnen einer Rechteckgröße von tilesXund tilesYPixel ist ungültig
  • Der kürzeste Code gewinnt
Kreative Magie
quelle
1
Können Sie Beispiele für Input / Output nennen?
FliiFe
2
Können wir sowohl ein vollständiges Programm als auch eine Funktion verwenden?
Blau
@FliiFe Die Eingabe besteht aus zwei Ganzzahlen (kann nicht negativ oder null sein). Die Ausgabe ist ein gedrucktes Bild wie im angehängten Bild.
Kreative Magie
Kann die Ausgabe ein 2D-Array sein?
Türknauf
@muddyfish Ich würde es sehr bevorzugen, wenn die Lösung mathematisch ist und nicht Teil einer API.
Kreative Magie

Antworten:

6

Dyalog APL, 8 Bytes

×/¨1<⊂|⍳

Dieser monadische Funktionszug verwendet Höhe und Breite als richtige Argumente und gibt ein 2D-Array mit 0 (Rand) und 1 (Innen) zurück. Testen Sie es auf TryAPL .

Wie es funktioniert

×/¨1<⊂|⍳  Right argument: h w

       ⍳  Generate all index pairs (1-based) of a h×w array.
     ⊂    Enclose (h w), so it depth matches the one of the index array.
      |   For each pair (i j) compute the remainders of the division by (h w).
   1<     Compare all remainders with 1.
×/¨       Reduce each pair of Booleans by multiplication.
Dennis
quelle
5

MATL , 10 Bytes

2$lO6Lt4$(

Dies gibt ein Array aus, das Nullen und Einsen enthält.

Probieren Sie es online aus!

2$l    % Implicit inputs M, N. Generate M×N array of ones
O      % Push number 0
6Lt    % Push [2 -1] twice, corresponding to index "2:end-1"
4$(    % Fill the center of the array with value 0. Implicit display

Fügen Sie für die grafische Ausgabe 1YGam Ende hinzu, um das Array als Bild ( 13 Byte ) anzuzeigen :

2$Ol6Lt4$(1YG

Probieren Sie es bei MATL Online aus! Zum Beispiel,

>> matl 2$Ol6Lt4$(1YG
> 5
> 7

produziert

Geben Sie hier die Bildbeschreibung ein

Luis Mendo
quelle
@ Sp3000 Sie haben Recht ... Ich konnte nicht widerstehen :-) Wie auch immer, das OP hat klargestellt, dass ein Array oder eine ASCII-Grafik mit beliebigen Zeichen eine gültige Ausgabe ist
Luis Mendo
@ LuisMendo großartige Arbeit, aber es müssen zwei Werte an die Methode übergeben werden
Creative Magic
@ CreativeMagic Entschuldigung. Jetzt korrigiert. Vielleicht die Herausforderung umformulieren? " Quadratischer Ring" kann verwirrend sein
Luis Mendo
@LuisMendo versucht nicht, eine Entschuldigung zu finden, aber Englisch ist nicht meine Muttersprache. Wenn Sie mir einen besseren Titel geben können, würde ich mich freuen, ihn zu hören.
Kreative Magie
1
@Neil Das OP sagt Kann keine Linie sein . Ich nahm das als "es kann keine Linie ohne die entsprechende Dicke sein, die einer Fliese entspricht". Ich werde sie fragen
Luis Mendo
4

HTML / JS / CSS, 198 194 Bytes

Grafische Ausgabeversion. Die Byteanzahl enthält f=weder die drei <input>Elemente, die nur zu Demonstrationszwecken verwendet werden. 3 Bytes dank @IsmaelMiguel gespeichert.

f=(n,m)=>{with(d.style)width=n*25+'px',height=m*25+'px'}
<input id=w placeholder=width><input id=h placeholder=height><input type=button value=Go! onclick=f(w.value,h.value)>
<div id=d style="border-image:radial-gradient(#fff 0,#fff 0)0 fill/25px;background:radial-gradient(#000 0,#000 8px,#fff 9px)0 0/25px 25px">

Neil
quelle
Kann nicht f=(n,m)=>{d.style.width=n*25+'px';d.style.height=m*25+'px';}vereinfacht werden f=(n,m)=>with(d.style)width=n*25+'px',height=m*25+'px';?
Ismael Miguel
@IsmaelMiguel Das withspart mir 3 Bytes, aber ich brauche immer noch das {}s. Auf der anderen Seite ;ist das unnötig, also habe ich das auch entfernt.
Neil
4

MATL , 10 Bytes

2$l3XyZ+3=

Eingabeargumente sind Höhe und Breite als Ganzzahlen. Die Ausgabe ist eine Größenmatrix, height x widthbei der die Grenzkacheln 0 und die inneren Werte 1 sind.

Probieren Sie es online aus!

Erläuterung

Gleiche Logik wie meine andere Antwort mit weniger Bytes.

        % Grab two input parameters implicitly
2$l     % Create a matrix of ones that has the dimensions specified as inputs
3       % Number literal 3
Xy      % Create a 3x3 identity matrix
Z+      % Perform 2D convolution (preserving size)
3=      % Create a logical matrix where values == 3 are 1 and 0 otherwise (boundary)
        % Implicitly display output.
Suever
quelle
4

MATLAB, 32 31 Bytes

@(x)conv2(ones(x),eye(3),'s')>2

Dadurch wird eine anonyme Funktion erstellt, die dann wie ans([4 5])im Arbeitsbereich ausgeführt werden kann.

Eingabe ist [height, width]und Ausgabe ist eine Matrix mit 1 in der Mitte und 0 für die Grenze.

Die Art und Weise, wie dies funktioniert, ist eine Matrix von denen, die die Größe der Eingabe haben. Es wird dann mit einer 3 x 3-Identifikationsmatrix mit Einsen auf der Diagonale gefaltet. Wir verwenden die sameEingabe bis conv2(hier verkürzt 's'), um das Ergebnis auf der gleichen Größe wie die Eingabe zu halten.

Wir wollen dann die Ausgabe in einen Binärwert mit 0 um die Grenze und 1 innerhalb konvertieren. Wir benutzen die Ungleichung>2 weil alle Kantenpixel ein Ergebnis <3 haben und alle Nicht-Grenzelemente ein Ergebnis von 3 haben.

Für die grafische Ausgabe:

@(x)imagesc(conv2(ones(x),eye(3),'s')>8)
ans([6,9])

Geben Sie hier die Bildbeschreibung ein

Suever
quelle
3

Gelee , 10 Bytes

p%€,>1P€G

Gibt ein Raster von 0 (Rand) und zurück 1 (Innen) zurück. Probieren Sie es online aus!

Wie es funktioniert

p%€,>1P€sG  Main link. Arguments: h (height), w (width)

p           Cartesian product; return all pairs in [1, ..., h] × [1, ..., w].
   ,        Yield the pair [h, w].
 %€         For each pair [i, j] in the product, compute [i % h, j % w].
    >1      Compare all resulting moduli with 1.
      P€    Compute the product of each pair of Booleans.
        s   Split the resulting flat list into rows of length w.
         G  Display the results in a 2D grid.
Dennis
quelle
Diese Antwort ist großartig, muss aber optisch ein rechteckiger Ring sein. Während es in Ordnung ist, Arrays, Strings usw. zu verwenden, muss es beim Ausführen wie ein Ring auf dem Bildschirm aussehen.
Creative Magic
OK. Als ich las, dass 2D-Arrays erlaubt waren, hatte ich nicht erwartet, dass ihre visuelle Darstellung eine Rolle spielt. Ich habe meine Antwort bearbeitet.
Dennis
@Dennis "[Ich] muss nicht wie ein Ring auf dem Bildschirm aussehen, wenn Sie es ausführen". Das heißt, Leerzeichen sollten verwendet werden?
Erik der Outgolfer
3

Julia, 46 34 Bytes

f(n,m)=[n>i>1<j<m for i=1:n,j=1:m]

Dies ist eine Funktion, die zwei Ganzzahlen akzeptiert und ein zweidimensionales boolesches Array zurückgibt.

Wir konstruieren eine n × m- Matrix unter Verwendung eines Array-Verständnisses mit einer Doppelschleife for. Für jeden Index von 1 bis n und 1 bis m , dh für jedes Element der Matrix, setzen wir den Wert auf, truewenn n > i > 1 und 1 < j < m . Dies gilt überall außer an den Grenzen, sodass das resultierende Array trues in der Mitte und falses um den Rand herum hat.

Beispiele:

julia> f(n,m)=[n>i>1<j<m for i=1:n,j=1:m]
f (generic function with 1 method)

julia> f(4,4)
4x4 Array{Bool,2}:
 false  false  false  false
 false   true   true  false
 false   true   true  false
 false  false  false  false

julia> f(1,1)
1x1 Array{Bool,2}:
 false

julia> f(2,5)
2x5 Array{Bool,2}:
 false  false  false  false  false
 false  false  false  false  false

12 Bytes dank Dennis gespart!

Alex A.
quelle
2

CJam, 20 Bytes

l~S*a*{3a.f|W%z}4*N*

Die Eingabe sollte in der Form erfolgen height width, die Ausgabe ist ein ASCII-Raster mit Leerzeichen für die Mitte und# für die Grenze verwendet.

Testen Sie es hier.

Erläuterung

l~       e# Read and evaluate input, dumping h and w on the stack.
S*       e# Create a string of w spaces.
a*       e# Create an array of h copies of that string.
{        e# Repeat this block 4 times...
  3a.f|  e#   For each character in the first row, take its bitwise OR with 3, turning
         e#   spaces into # and leaving # unchanged.
  W%z    e#   Reverse and transpose the grid, rotating it by 90 degrees.
}4*
N*       e# Join the lines of the result with linefeeds.
Martin Ender
quelle
2

Pyke, 16 15 Bytes

jQ]Uajt%!RQt%!|

Probieren Sie es hier aus!

Erläuterung:

                - Q = eval_input()
j               - j = eval_input()
jQ]             - [Q,j]
   U            - create a 3d array sized Q by j with coords
    a           - for each coord (2d for)
     jt%!       -   not (coord_1 % j-1)
              | -  ^ or V
          Qt%!  -   not (coord_2 % Q-1)

Verwenden Sie diesen Code für eine hübsche Ausgabe .

Oder 13 Bytes mit einer auf Null gesetzten Maske am Rand (mittlere Zeichen ungleich Null)

jQ]Uajt%RQt%&

Probieren Sie es hier aus!

Blau
quelle
2

JavaScript (ES6), 80 82 85

Bearbeiten Sie 3 gespeicherte Bytes thx @Neil
Bearbeiten Sie 2 Bytes, die reduceeinmal gespeichert wurden

Anonyme Funktion, die eine mehrzeilige Zeichenfolge zurückgibt

(w,h)=>[...Array(h)].reduce(o=>o+(w>1?'O'+' O'[!--h|!o].repeat(w-2):'')+`O
`,'')

Prüfung

f=(w,h)=>[...Array(h)].reduce(o=>o+(w>1?'O'+' O'[!--h|!o].repeat(w-2):'')+`O
`,'')

function test(){
  var [w,h] = I.value.match(/\d+/g)
  w=+w,h=+h // convert to numeric
  O.textContent=f(w,h)
}  

test()
<input value='5 4' id=I><button onclick='test()'>Test</button><pre id=O></pre>

edc65
quelle
Sicher !--h|!oist schon eine ganze Zahl? Ansonsten mag ich die Verwendung von !o.
Neil
2

Ruby, 63 Bytes

Anonyme Funktion, druckt nach STDOUT. Grenze ist #.

->x,y{h=?#;puts t=h*x,y>1?[[h+(x<2?'':' '*(x-2)+h)]*(y-2),t]:p}
Wert Tinte
quelle
Entschuldigung, Sie müssen einen Ring ausgeben, damit keine Backticks darin erlaubt sind.
Erik der Outgolfer
Und da ist das eine Byte, das ich mir erhofft hatte, indem ich das Innere mit einem kleinen, weniger auffälligen Zeichen füllte ...
Value Ink
Du bekommst eine Gegenstimme, du hast es verdient.
Erik der Outgolfer
1

JavaScript (ES6), 97 Byte

(n,m)=>Array(n).fill(' '.repeat(m).replace(/^ | $/g,0)).join`
`.replace(/^.+|.+$/g,'0'.repeat(m))

Erstellt einen Ring von 0s. Wahrscheinlich ein schrecklicher Ansatz, aber ich wollte Randfälle vermeiden.

Neil
quelle
1

JavaScript (ES6), 77 Byte

h=>w=>[...Array(i=h)].map(_=>(a=Array(w).fill(h-i--&&i?0:1),a[0]=a[w-1]=1,a))
user81655
quelle
Ich mag das Array der Array-Ausgabe nicht (auch wenn es erlaubt ist). Was ich in der Konsole sehe, ist f(4)(4)->Array [ Array[4], Array[4], Array[4], Array[4] ]
edc65
1

Netzhaut , 45 43 Bytes

\d+
$*
S_`1(?=.* (1+))|.
T`1`#`^.+|.+$|.?¶.

Die Eingabe sollte in der Form erfolgen height width, die Ausgabe ist ein ASCII-Raster, das 1für die Mitte und #für die Grenze verwendet wird.

Probieren Sie es online aus!

Erläuterung

\d+
$*

Konvertieren Sie jede Zahl Nin eine Folge von NEinsen (dh konvertieren Sie die Eingabe in unär).

S_`1(?=.* (1+))|.

Passen Sie jedes 1an heightund ersetzen Sie es durch width, während Sie alles andere zusammenbringen und entfernen. Wir tun dies, indem wir eine geteilte Phase missbrauchen. Dadurch wird ein w x hRaster erstellt.

T`1`#`^.+|.+$|.?¶.

Schließlich ersetzen wir jedes 1durch ein #, das entweder in der ersten Zeile, der letzten Zeile oder am Anfang oder Ende einer Zeile steht.

Martin Ender
quelle
1

Eigentlich 23 Bytes

;'#*;))¬' *'#;)@+(+nXX(

Probieren Sie es online aus!

Dieser Ansatz ist meinem Ansatz bei dieser damit verbundenen Herausforderung sehr ähnlich .

Erläuterung:

;'#*;))¬' *'#;)@+(+nXX(
                         (implicit) push all input to stack
;'#*                     push a string containing X #s
    ;))                  dupe, and push both to bottom of stack
       ¬' *              push a string containing (X-2) spaces
           '#;)@+(+      add a # to the front and the back of the string
                   nXX   make (Y-2) copies
                      (  bring one of the "#"*X strings back to the top
                         (implicit) pop and print each stack item, separated by newlines
Mego
quelle
2
Wenn Seriously v3 nicht Wait heißt , wirklich? Ich werde ziemlich enttäuscht sein.
Alex A.
@AlexA. Hast du es gerade ernst gemeint?
Katze
1

QBasic, 69 Bytes

INPUT x,y
FOR i=1TO y
FOR j=1TO x
?i MOD y<2OR j MOD x<2;
NEXT
?
NEXT

Nimmt Abmessungen als width,height. Der boolesche Wert aus dem is-it-on-the-border-Test wird einfach gedruckt: -1für wahr und 0für falsch. Ein Probelauf sieht folgendermaßen aus:

? 5,3
-1 -1 -1 -1 -1 
-1  0  0  0 -1 
-1 -1 -1 -1 -1 

Bonus: Grafische Version, 88 Bytes

INPUT x,y
SCREEN 9
FOR i=1TO y
FOR j=1TO x
PSET(j*3,i*3),i MOD y<2OR j MOD x<2
NEXT
NEXT

Ich glaube, das zählt als "keine Linie". Wenn der MODAusdruck falsch ist (0), wird PSETein schwarzes Pixel gezeichnet. Wenn es wahr ist (-1), zeichnet es PSETanscheinend ein weißes Pixel. Hier ist 17,31in 2x Größe gezeigt:

Grafisches Rechteck

DLosc
quelle
1

TSQL, 107 105 97 Bytes

DECLARE @ INT=3,@y INT=5

PRINT REPLICATE(1,@)+ISNULL('
'+REPLICATE('1'+ISNULL(SPACE(@-2),'')+'1
',@y-2)+REPLICATE(1,@),'')
  1. erste Zeile erzeugen
  2. Hinzufügen von hohlen Linien + Zeilenumbrüchen
  3. Hinzufügen der letzten Zeile (falls erforderlich)
t-clausen.dk
quelle
0

Einhorn , 26 23 Bytes

P3G$PG@PS@S$L2B$T1B@T1N

Denn wer mag keine Einhörner?!

Erläuterung (Ausgabe "Listenprogramm"):

P3  Paint current square with 3
G$P Get: sets $ from input P
G@P Get: sets @ from input P
S@  Subtract 1 from @
S$  Subtract 1 from $
L2  ~Loop 2 times
B$  ~Brush $ more square
T1  ~Turn 1 right angle clockwise
B@  ~Brush @ more square
T1  ~Turn 1 right angle clockwise
N   ~Next (loop)

Ausgabe für tilesX= 3, tilesY= 5:

Hinweis: Diese Version funktioniert nur für tilesXbis zu 6 undtilesY bis zu 5. In der Frage wird jedoch nicht erwähnt, welchen Bereich wir unterstützen müssen. gehe ich davon aus, dass dies in Ordnung ist. Andernfalls führt eine kleine Erweiterung des Programms zu dieser Alternative, die einen etwas größeren Bereich unterstützt:

Einhorn, 30 27 Bytes

x0y9P3G$PG@PS@S$L2B$T1B@T1N

Durch Hinzufügen x0y9, das die Box bei (0,9) startet, arbeitet das Programm für tilesXbis zu 9 und tilesYbis zu 9 (da die Eingabe nur bis zu 9 geht).

Lorbeer
quelle
0

J, 16 Bytes

0(<2#<<0 _1)}$&1

Verwenden Sie die Form $, um ein Rechteck mit allen Einsen in der Größe der Eingaben zu erstellen, und verwenden Sie dann die komplementäre Form von Ändern }, um das Innere in Nullen umzuwandeln.

Probieren Sie es online aus!

Jona
quelle
0

Perl 5 , 76 + 1 ( -a) = 77 Bytes

print(1x($a=$F[0]),$/,((1,$"x($a-2),1 x($a>1),$/)x($F[1]-2),1x$a)x($F[1]>1))

Probieren Sie es online aus!

Xcali
quelle
0

Perl 5, 45 + 1 ( -p) = 46 Bytes

$_=join$/,(1x$_)x<>;1while s/
.+\K1(?=.+
)/ /

Die folgenden 45 Bytes verarbeiten tileY = 1 nicht

$_=1x<>.$/;say$_.s/(?!^.|.$)./ /gr x(<>-2).$_

Probieren Sie es online aus

Nahuel Fouilleul
quelle