私はCodingameからこの課題を受け取り、私のものよりも優れたソリューションに興味があります。
標準入力を使用して幅を指定すると、指定された幅と長さで「#」の中空の四角形が描画されます。
例:
5の結果
#####
# #
# #
# #
#####
私はこれを解決するためにPythonを使用したので、他のPythonコードに特に興味があります。ただし、必要な言語でソリューションを投稿してください。
私はCodingameからこの課題を受け取り、私のものよりも優れたソリューションに興味があります。
標準入力を使用して幅を指定すると、指定された幅と長さで「#」の中空の四角形が描画されます。
例:
5の結果
#####
# #
# #
# #
#####
私はこれを解決するためにPythonを使用したので、他のPythonコードに特に興味があります。ただし、必要な言語でソリューションを投稿してください。
回答:
コード:
NβBββ#
説明:
Nβ # Get input from the command line and store into β
B # Draw a hollow box with...
β # Width β
β # Height β
# # Filled with the character '#'
# Implicitly output the box
N
ようint(input())
に式でも使用できることに注意してください。この課題が「与えられた幅と高さで中空の長方形を描く」なら、解決策は次のようになりますBNN#
。
:G\1>&*~35*c
: % Input n implicitly. Push range [1 2 ... n]
% STACK: [1 2 3 4 5]
G % Push n again
% STACK: [1 2 3 4 5], 5
\ % Modulo
% STACK: [1 2 3 4 0]
1> % Does each entry exceed 1?
% STACK: [0 1 1 1 0]
&* % Matrix with all pair-wise products
% STACK: [0 0 0 0 0;
0 1 1 1 0;
0 1 1 1 0;
0 1 1 1 0;
0 0 0 0 0]
~ % Negate
% STACK: [1 1 1 1 1;
1 0 0 0 1;
1 0 0 0 1;
1 0 0 0 1;
1 1 1 1 1]
35* % Multiply by 35
% STACK: [35 35 35 35 35;
35 0 0 0 35;
35 0 0 0 35;
35 0 0 0 35;
35 35 35 35 35]
c % Convert to char. 0 is interpreted as space. Display implicitly
% STACK: ['#####';
'# #';
'# #';
'# #';
'#####']
,ajj"###
,ajj draw a box with height (input) and width (input)
"### with a hash border
#
必要ですか?
f=lambda n:'#'*n+'\n#%s#'%(' '*(n-2))*(n-2)+'\n'+'#'*n
#\n#
入力が次の場合に戻ります1
印刷する55バイトバージョン
def f(n):a=n-2;print'#'*n,'\n#%s#'%(' '*a)*a,'\n'+'#'*n
すべての入力で機能する62バイトバージョン:
f=lambda n:'#'*n+'\n#%s#'%(' '*(n-2))*(n-2)+('\n'+'#'*n)*(n>1)
f=
使用しない限り、言う必要はありません。
MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMMMmoOMMMMoOMoOMoOMoOMoOMoOMoOMoOMoO
MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMMMmoOMMMMoOMoOMoOmoOoomMMM
moOMMMMOOmOomOoMoomoOmoOMOomoomOoMMMmoOMMMMOoMOoMOOmOomOomOomOoMoo
moOmoOMoomoOMMMmoOmoOMMMMOoMOoMOOmOomOomOomOoMoomoOmoOmoOmoOMOomoo
mOomOomOoMoomoOmoOMOomoomOomOomOomOoMoomoOmoOmoOMOOmOoMoomoOMOomoo
オンラインでお試しください! 2行目の数値を任意の数値に変更して、出力を変更します。
ここで使用しているCOWインタープリターはPerlで書かれています(このチャレンジよりも新しい)が、ここにコードを入力することで同じ結果を得ることができます。
; Note: [n] means "value stored in the nth block of memory".
MoOMoOMoOMoOMoOMoOMoOMoOMoOMoO ;Stores 10 in [0]. 10 is the code point for carriage return
MMMmoOMMMMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoOMoO ;Stores 32 in [1]. 32 is the code point for whitespace
MMMmoOMMMMoOMoOMoO ;Stores 35 in [2]. 35 is the code point for #
moOoom ;Reads STDIN for an integer, and stores it in [3]
MMMmoOMMM ;Copies [3] into [4]
MOO ;Loop as long as [4] is non-zero
mOomOoMoo ;Navigate to [2] and print the character with that code point
moOmoOMOo ;Navigate to [4] and decrement
moo ;End loop
mOoMMMmoOMMMMOoMOo ;Copy [3] into [4] and decrement [4] twice
MOO ;Loop as long as [4] is non-zero
mOomOomOomOoMoo ;Navigate to [0] and print the character with that code point
moOmoOMoo ;Navigate to [2] and print the character with that code point
moOMMMmoOmoOMMMMOoMOo ;Navigate to [3] and copy it into [5], then decrement [5] twice
MOO ;Loop as long as [5] is non-zero
mOomOomOomOoMoo ;Navigate to [1] and print the character with that code point
moOmoOmoOmoOMOo ;Navigate to [5] and decrement
moo ;End loop
mOomOomOoMoo ;Navigate to [2] and print the character with that code point
moOmoOMOo ;Navigate to [4] and decrement
moo ;End loop
mOomOomOomOoMoo ;Navigate to [0] and print the character with that code point
moOmoOmoO ;Navigate to [3]
MOO ;Loop as long as [3] is non-zero
mOoMoo ;Navigate to [2] and print the character with that code point
moOMOo ;Navigate to [3] and decrement
moo ;End loop
String c(int n){String r="";for(int i=n,j;i-->0;r+="\n")for(j=0;j<n;r+=i*j<1|n-i<2|n-j++<2?"#":" ");return r;}
@OlivierGrégoireのおかげで1バイト節約されました。@cliffrootの
おかげで2バイト節約されました。
交差した正方形の作成の回答に基づいた派生ソリューション。
for(int i=n,j;i-->0;r+="\n")
か?一番下の行か一番上の行かは関係ないので、その順序を維持しても意味がありませんか?
param($n)($z='#'*$n--);,("#$(' '*--$n)#")*$n;$z
JohnLBevanのおかげで-1バイト
入力を受け取り、ポストデクリメント付きでハッシュマークとして$n
設定$z
します。それを括弧でカプセル化して、コピーをパイプラインに配置します。次に、カンマ演算子を使用して、スペース、...の事前にデクリメントされた行の配列を作成します。それらはパイプラインに残っています。その後、パイプラインに再び配置します。最後に暗黙的に出力すると、要素間に改行が導入されるため、無料で取得できます。$n
$n
$n
#
#
$z
Write-Output
以来OPのコードは、入力のための仕事をしませんn <= 1
、私たちはサポート入力する必要はありません意味することを取った1
のいずれか、。
PS C:\Tools\Scripts\golfing> 2..6|%{"$_";.\draw-a-hollow-square.ps1 $_;""}
2
##
##
3
###
# #
###
4
####
# #
# #
####
5
#####
# #
# #
# #
#####
6
######
# #
# #
# #
# #
######
param($n)($z='#'*$n--);,("#$(' '*--$n)#")*$n;$z
.if@$t0{r$t3=2000000;f@$t3 L@$t0 23;f2*@$t3 L@$t0 20;eb2*@$t3 23;eb2*@$t3+@$t0-1 23;da@$t3 L@$t0;j1<@$t0'.for(r$t1=@$t0-2;@$t1;r$t1=@$t1-1){da2*@$t3 L@$t0};da@$t3 L@$t0'}
-6バイトからの括弧の削除と2番目の代わりの.if
使用j
.if
-18バイトのf
代わりにa .for
を使用して文字列を作成します。
NULLで終わる文字列ではなく-12バイト、代わりに長さを渡す da
入力は、疑似レジスターを介して渡されます$t0
(例:)r $t0 = 5; {above-code}
。
説明:
.if @$t0 *Verify width($t0) at least 1
{ *(registers have unsigned values)
r $t3 = 2000000; *Set $t3 to address where the
*string will be constructed
f @$t3 L@$t0 23; *Put width($t0) '#' at 2000000($t3)
f 2 * @$t3 L@$t0 20; *Put width($t0) ' ' at 4000000(2*$t3)
eb 2 * @$t3 23; *Put '#' on left of ' ' string
eb 2 * @$t3 + @$t0 - 1 23; *Put '#' on right of ' ' string
da @$t3 L@$t0; *Print the top of the box
j 1 < @$t0 *If width($t1) at least 2
'
.for (r $t1 = @$t0 - 2; @$t1; r $t1 = @$t1 - 1) *Loop width($t0)-2 times to...
{
da 2 * @$t3 L@$t0 *...print the sides of the box
};
da @$t3 L@$t0 *Print the bottom of the box
'
}
サンプル出力:
0:000> r$t0=0
0:000> .if@$t0{r$t3=2000000;f@$t3 L@$t0 23;f2*@$t3 L@$t0 20;eb2*@$t3 23;eb2*@$t3+@$t0-1 23;da@$t3 L@$t0;j1<@$t0'.for(r$t1=@$t0-2;@$t1;r$t1=@$t1-1){da2*@$t3 L@$t0};da@$t3 L@$t0'}
0:000> r$t0=1
0:000> .if@$t0{r$t3=2000000;f@$t3 L@$t0 23;f2*@$t3 L@$t0 20;eb2*@$t3 23;eb2*@$t3+@$t0-1 23;da@$t3 L@$t0;j1<@$t0'.for(r$t1=@$t0-2;@$t1;r$t1=@$t1-1){da2*@$t3 L@$t0};da@$t3 L@$t0'}
Filled 0x1 bytes
Filled 0x1 bytes
02000000 "#"
0:000> r$t0=2
0:000> .if@$t0{r$t3=2000000;f@$t3 L@$t0 23;f2*@$t3 L@$t0 20;eb2*@$t3 23;eb2*@$t3+@$t0-1 23;da@$t3 L@$t0;j1<@$t0'.for(r$t1=@$t0-2;@$t1;r$t1=@$t1-1){da2*@$t3 L@$t0};da@$t3 L@$t0'}
Filled 0x2 bytes
Filled 0x2 bytes
02000000 "##"
02000000 "##"
0:000> r$t0=5
0:000> .if@$t0{r$t3=2000000;f@$t3 L@$t0 23;f2*@$t3 L@$t0 20;eb2*@$t3 23;eb2*@$t3+@$t0-1 23;da@$t3 L@$t0;j1<@$t0'.for(r$t1=@$t0-2;@$t1;r$t1=@$t1-1){da2*@$t3 L@$t0};da@$t3 L@$t0'}
Filled 0x5 bytes
Filled 0x5 bytes
02000000 "#####"
04000000 "# #"
04000000 "# #"
04000000 "# #"
02000000 "#####"
n=>(b='#'[r='repeat'](n))+`
#${' '[r](n-=2)}#`[r](n)+`
`+b
(処理しません0
または1
)
13バイト(71バイト)を追加することができます!
n=>n?n-1?(b='#'[r='repeat'](n))+`
#${' '[r](n-=2)}#`[r](n)+`
`+b:'#':''
これらのソリューションは非常に単純です。数バイトを節約するために繰り返さないために大量のストレージを使用します。variablsmなしで縮小されていない場合、次のようになります。
n => // Anonymous function definition (Param `n` is the size)
'#'.repeat(n) + // # `n` times to form the top
`
#${' '.repeat(n - 2)}#` // Followed by a newline followed by a hash and `n` - 2 spaces and
// another hash to make one of the middle lines
.repeat(n - 2) + // The above middle lines repeated `n` - 2 times
'#'.repeat(n) // Followed by the top line again
<script type="text/babel">var f=n=>n?n-1?(b='#'[r='repeat'](n))+`\n#${' '[r](n-=2)}#`[r](n)+`\n`+b:'#':'',b,r;function c(){document.getElementById('pre').textContent = f(+document.getElementById('input').value);}</script><input id="input" onkeydown="c();" onkeyup="c();" onchange="c();" onclick="c();" placeholder="Size"><pre id="pre"></pre>
!n?'':n==1?'#':
関数本体の先頭にを追加して15バイト追加すると、入力0
とを処理できます1
。
n=>(b='#'[r='repeat'](n))
そして、#${" "[r](n-=2)}
などは繰り返しを避けることで3バイト節約しますrepeat
:)
n=int(input())
for x in range(n):
r=list(' '*n);r[0]=r[-1]='#'
if x%(n-1)==0:r='#'*n
print("".join(r))
list(' '*n)
て[' ']*n
。また、置き換えることができx%(n-1)
てx%~-n
for
、リストの内包表記にブロックをあなたは20の以上のバイトを保存することができます
int()
し、括弧を囲みますprint
。
<1
代わりに使用します==0
。
m=input()-2
for c in'#'+' '*m+'#':print'#'+m*c+'#'
で動作しn>=2
ます。n-2
適切な記号のポンド記号、さらに別のポンド記号で各行を印刷します。
ポンド記号のエイリアスは同じ長さを与えます:
m=input()-2;p='#'
for c in p+' '*m+p:print p+m*c+p
その他の試み:
lambda n:'#'*n+('\n#'+' '*(n-2)+'#')*(n-2)+'\n'+'#'*n
lambda n:'#'*n+'\n#%s#'%((n-2)*' ')*(n-2)+'\n'+'#'*n
lambda n:'\n'.join(['#'*n]+['#'+' '*(n-2)+'#']*(n-2)+['#'*n])
n=input();s='#'+' '*(n-2)+'#'
for c in s:print[s,'#'*n][c>' ']
s='##'+' #'*(input()-2)+'##'
for c in s[::2]:print s[c>' '::2]
s='#'+' '*(input()-2)+'#'
for c in s:print s.replace(' ',c)
i,j;f(n){for(i=n;i--;puts(""))for(j=n;j--;putchar(i*j&&i^n-1&&j^n-1?32:35));}
乗算をこっそりして、バイトを保存...
i,j;f(n){for(i=n;i--;puts(""))for(j=n;j--;putchar(i&&j&&i^n-1&&j^n-1?32:35));}
また、jをカウントダウンして、さらにいくつか保存します...
i,j;f(n){for(i=n;i--;puts(""))for(j=0;j++<n;putchar(i&&j^1&&i^n-1&&j^n?32:35));}
iをnから0までカウントダウンして、数バイトを節約します...
i,j;f(n){for(i=0;i++<n;puts(""))for(j=0;j++<n;putchar(i^1&&j^1&&i^n&&j^n?32:35));}
少しわかりやすく、1バイト多く
i,j;f(n){for(i=0;i++<n;puts(""))for(j=0;j++<n;putchar(i==1|i==n|j==1|j==n?35:32));}
&&
代わりに必要&
ですか?
n> 1で動作します。@ Billywobが行列の配列をスワップアウトする数バイトに感謝します。
cat(rbind(b<-'#',cbind(b,matrix(' ',n<-scan()-2,n),b),b,'
'),sep='')
rbindとcbindを使用して#
、スペースのn-2正方行列の周りにの行と列を配置します。改行も行にバインドされます。ソース内の改行は重要です。入力はSTDINからです
\n
。ただし、matrix
代わりに 使用して2バイト節約できarray
ます。
-20 @Cyoceと@AlexLに感謝します。
(defun s(v)(format t"~v,,,vA~%"v #\# #\#)(dotimes(h(- v 2))(format t"~v,,,vA~A~%"(- v 1)#\ #\# #\#))(format t"~v,,,vA"v #\# #\#))
使用法:
* (s 5)
#####
# #
# #
# #
#####
基本的にformat
、上下に2回使用し、その間の行にループを使用します。topおよびbottomのformat呼び出しは、sで始まり#
適切な幅にパディングされた行を出力します#
。間の行のフォーマット呼び出しも同様に機能しますが、パディングがスペースであり#
、行の終わりにa が出力される点が異なります。
注:私はLispを初めて使用するため、これについては改善の余地がたくさんあると予想しています。
s
か?または、匿名機能ですか?
dotimes (h (- v 2))
ないのdotimes(h(- v 2))
でしょうか?
l#n=l<$[1..n]
f n=unlines$'#'#n:('#':' '#(n-2)++"#")#(n-2)++['#'#n]
使用例:
Prelude> putStrLn $ f 4
####
# #
# #
####
使い方:
l#n=l<$[1..n] -- helper function that makes n copies of l
'#'#n -- make a string of n copies of #, followed by
#(n-2) -- n-2 copies of
'#':' '#(n-2)++"#" -- # followed by n-2 times spaces, followed by #
['#'#n] -- and a final string with n copies of #
unlines -- join with newlines in-between
,þ%µỊṀ€€ị⁾# Y
,þ%µỊṀ€€ị⁾# Y - Main link: n
þ - outer product with
, - pair: [[[1,1],[2,1],...,[n,1]],[[1,2],[2,2],...,[n,2]], ... ,[[1,n],[2,n],...,[n,n]]]
% - mod n: [[[1,1],[2,1],...,[0,1]],[[1,2],[2,2],...,[0,2]], ... ,[[1,0],[2,0],...,[0,0]]]
µ - monadic chain separation
Ị - abs(z)<=1: [[[1,1],[0,1],...,[1,1]],[[1,0],[0,0],...,[1,0]], ... ,[[1,1],[0,1],...,[1,1]]]
€€ - for each for each
Ṁ - maximum: [[1, 1, ...,1], [1, 0, ..., 1], ... ,[1, 1, ..., 1] ]
ị - index into (1 based)
⁾# - "# ": ["##...#","# ...#", ...,"##...#"]
Y - join with line feeds
15バイトのコード、-n
フラグの場合は+1 。
(Y_Xa-2WR'#s)My
最初に、y
文字列引数を取り、それをa-2
何回も繰り返し(ここa
で最初のコマンドライン入力)、結果をでラップする関数を定義します#
。
Y _ X a-2 WR '#
_ Identity function
X a-2 String-repeated by a-2
WR '# Wrapped in #
Y Yank the resulting function into y
次に、この関数を2回(通常は1回、次にマップを使用して)適用し、文字列のリストとして正方形を取得します。
y M (y s)
(y s) Call function y with s (preinitialized to " ") as argument
y M Map y to each character of the resulting string
入力のために4
、(y s)
中に結果"# #"
やy M (y s)
で["####"; "# #"; "# #"; "####"]
。次に、この後者の値が印刷され、-n
フラグによって改行で区切られます。
未ゴルフからゴルフまでのバージョンを取得するには:
Y
は演算子です。つまり、式で使用できます。Y...
後に続くのではなく、(ys)
ただ行うことができます(Y...s)
。y
です。これyM(Y_Xa-2WR'#s)
は動作しません。解決策:M
ap演算子のオペランドを交換します。それらの1つが関数であり、もう1つが反復可能な型である限り、それらの順序は関係ありません。(let*((d display)(g(λ()(for((i n))(d"#")))))(g)(d"\n")(for((i(- n 2)))(d"#")(for((i(- n 2)))(d" "))(d"#\n"))(g))
ゴルフをしていない:
(define (f n)
(let* ((d display)
(g (λ ()
(for ((i n))
(d "#"))
(d "\n"))))
(g)
(for ((i (- n 2)))
(d "#")
(for ((i (- n 2)))
(d " ") )
(d "#\n"))
(g)))
テスト:
(f 5)
出力:
#####
# #
# #
# #
#####
「ゴルフ」言語にはかなり長い間待ち望んでいますが、その多くがどのように機能するかを忘れてしまいました:P
i_2-_u'#*N+_'#' u*'#N+++u*u
説明:
i_2-_u # take input and triplicate, subtracting 2 (5 -> [3,3,5])
'#*N+_ # create the top and bottom rows
'#' u*'#N+++u* # create input - 2 copies of middle rows
u # rotate left 1 to get correct order, implicit output
ゴルフ:
void F(int n){Console.Write($"{new string('#',n)}\n");for(int i=2;i<n;i++)Console.Write($"#{new string(' ',n-2)}#\n");Console.Write(new string('#',n));}
ゴルフをしていない:
void F(int n)
{
Console.Write($"{new string('#', n)}\n");
for (int i = 2; i < n; i++)
Console.Write($"#{new string(' ', n - 2)}#\n");
Console.Write(new string('#', n));
}
EDIT1:ループ範囲の最適化。
読みやすいように行を2つに分割:
#N::((var X (repeat "#" N))(print X)(each (seq 3 N) (scope #X::((print (+ "#"
(repeat " " (- N 2)) "#")))))(print X))
サンプル使用法:
% square.lithp
(
(import "lists")
(def s #N::((var X (repeat "#" N))(print X)(each (seq 3 N) (scope #X::((print (+ "#" (repeat " " (- N 2)) "#")))))(print X)))
(s 10)
)
Output:
$ ./run square.lithp
##########
# #
# #
# #
# #
# #
# #
# #
# #
##########