YなしでXを行う


52

通常、「YなしでXを実行する」ことは、初心者が課題を書くためのtrapになる可能性があると言われています(ソース)。しかし、私は生意気で、YなしでXを確実に作成できると思います。無作為に。ええ、これは良いでしょう。

課題:n 1以上の奇数の整数が与えられた場合、n「y」と「Y」以外のランダムに印刷可能なASCII文字で構成される辺の長さのex とスペースを出力します。すべての許可されたキャラクターは、ゼロ以外の確率で出現する必要がありますが、必ずしも均一ではありません。これはので、バイト単位の最短コードが優先されます。ただし、各文字をランダム化する必要があります。つまり、偶然の場合を除き、exのストラットは等しくないはずです。

表示される文字

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

exの構築

辺の長さ1:

x

辺の長さ3:

x x
 x
x x

辺の長さ5:

x   x
 x x
  x
 x x
x   x

出力例

input
output
empty line

3
h 2
 ^
9 5

1
:

5
D   1
 W z
  W
 q j
W   1

実装例

無効な入力を処理する必要はありません。


どのキャラクターが登場する資格があるのでしょうか?
-xnor

@xnorキャラクターfrom !から~sans yおよびY
コナーオブライエン

LegionMammal978ません@、非Yの文字が含まれているためy
リーキー修道女

7
うーん、ランダム ...
NonlinearFruit

14
待つ!?コードで「Y」と「y」を使用できますか?
アダム

回答:


3

Pyth、28 27 26 25バイト

jmuXGHO-rF "!〜" "Yy" {、d-tQd *; Q 
VQuXGHO-rF "!〜" "Yy" {、N-tQN * d 
VQuXGHO-r \!\〜 "Yy" {、N-tQN * d
VQuXGHO-r \!\〜 "Yy"、N-tQN * d

テストスイート。


5
~範囲に含まれていないため、これによりキャラクターが生成されることはないと確信しています。これを修正するに~は、コード内のをリテラルDEL文字に変更します。
-FryAmTheEggman

10

Ruby、102バイト

Array#sample文字セットからのサンプリングの繰り返しは行いませんが、文字分布が完全に均一である必要はないため、それは問題ありません!再帰関数。行の配列を返します。

オンラインでお試しください!

f=->l{w,x,y,z=([*?!..?~]-%w"y Y").sample 4
l<2?[w]:[w+(s=' '*(l-2))+x,*f[l-2].map{|e|" #{e} "},y+s+z]}

7

実際には、62バイト

"!⌂"♂┘ix♂c"Yy"@-╗½≈u;r2@∙`i=`M╪k`;dXR@+`M;dXR@+`"╜J' aI"£MΣ`Mi

これは、私がこれまでに書いた中で最も長い実際のプログラムの1つです。

オンラインでお試しください!

説明:

パート1:キャラクターリストの設定

"!⌂"♂┘ix♂c"Yy"@-
"!⌂"              push the string "!⌂"
    ♂┘            CP437 ordinal of each character ([21, 127])
      ix          range(21, 127)
        ♂c        character at each ordinal (list of printable ASCII characters)
          "Yy"@-  set difference with ["Y", "y"] (printable ASCII except "Y" and "y")

オンラインでお試しください!

パート2:Xのブール配列の構築

½≈u;r2@∙`i=`M╪k`;dXR@+`M;dXR@+
½≈u;                            two copies of int(input/2)+1
    r                           range
     2@∙                        Cartesian product with itself
        `i=`M                   for each sublist: push 1 if both elements are equal, else 0
             ╪k                 split into int(input/2)+1-length chunks
                                (at this point, we have one quarter of the X)
               `;dXR@+`M        mirror each sublist (one half of the X)
                        ;dXR@+  mirror the entire list (the whole X)

オンラインでお試しください!

パート3:ランダムな文字を選ぶ

`"╜J' aI"£MΣ`Mi
`"╜J' aI"£MΣ`M   for each row:
 "╜J' aI"£M        for each column:
  ╜J                 push a random value from the character list
    '                push a space
      a              invert the stack
       I             take the character if the value is 1, else take the space
           Σ       concatenate the strings
              i  flatten the list and let implicit output take care of the rest

オンラインでお試しください!


1
「ビット
ウィージングの

6

Mathematica、146バイト

a:=RandomChoice[33~CharacterRange~126~Complement~{"Y","y"}];StringRiffle[Normal@SparseArray[{{b_, b_}:>a,{b_,c_}/;c-1==#-b:>a},{#,#}," "],"
",""]&

匿名関数。入力として数値を受け取り、出力として文字列を返します。


6

Python 2、171バイト

from random import*
def x(n):
 w=range(-n/2+1,n/2+1)
 for i in w:
  o=''
  for j in w:c=randint(33,124);c+=(c>88)+(c>119);c=[c,32][bool(i^j and i^-j)];o+=chr(c)
  print o

一様な確率でランダムな文字を選択することが保証されています。

ここで試してください:ideoneリンク

編集:修正のためにモーガン・スラップに感謝します。


from random import*2バイト節約します。jループの最初の2行をセミコロンで結合して、バイトを節約することもできます。(また、私は信じているZし、 {それが問題のために重要ではないことを、いくつかの他の文字よりも発生の高い可能性を持っている)
FryAmTheEggman

あなたは小さな変更がカップルと165に取り掛かることができますmothereff.in/...
モルガンThrapp

2
実際、出力はすべてのテストケースで間違っています。各辺のサイズの代わりに、各脚をnに等しくします。
モーガンスラップ16

@MorganThrappあ、そうだね。私はそれを修正します
きしむオッシファージュ

4バイト:bool(i^j and i^-j)->i not in(j,-j)
ジョナサンアラン

6

Python、142 139 135バイト

これは、文字ごとに正方形を作成する単純な実装です。文字が斜めにある場合はランダムな文字を使用し、そうでない場合はスペースを使用します。また、これは正規表現の置換とランダムなintを使用して非Y文字を生成します。

import re,random
lambda x:''.join('\n'*(i%x<1)+re.sub("y|Y","t",chr(random.randint(33,126))+' ')[i%x!=i/x!=x-i%x-1]for i in range(x*x))

説明[古い]

"\n".join( ... for i in range(x)) # Create 'x' lines 
''.join( ... for j in range(x))   # Create 'x' chars on each line
(...)[j!=i!=x-j-1]                # Not on diagonals? 2nd char in "? "; Else, choose the 1st
j!=i                              # Not on downward diagonal
i!=x-j-1                          # Not on upward diagonal
re.sub("y|Y","t", ... )           # Replace y or Y for t
chr(random.randint(33,126))+' '   # Random char + a space

更新

  • -4 [16-07-30]条件付き改行の短縮
  • -3 [16-07-30]単一のforループに変更
  • -6 [16-07-29]三項演算子のifステートメントが交換されました。@RootTwoに感謝
  • -11 [16-07-27]余分な角かっこ/スペースを削除し、ifステートメントを反転しました
  • -49 [16-07-27]正方形を段階的に作成して、@ squeamishossifrageの方法を順守しました、ありがとう!
  • -10 [16-07-27]ランダムなcharラムダ+ @ ConorO'Brienからの数学スタッフを短縮
  • -22 [16-07-26]ラムダでのスクイーズ+その他のゴルフ
  • -6 [16-07-26] import*-@KevinLauに感謝

1
randintあなたの目的のためにおそらくより短いです、プラスfrom random import*。また、不要な空白の一部を削除します。
値インク

2
[i,33][i in(89,121)]その代わりに、f関数に長い三者が必要です!また、printステートメントの直後にあるスペースを削除できるかどうかも確認してください
値インク

コードの説明に別の形式を試すことをお勧めします。これはあまり読めません。他のユーザーがどのように処理するかを見てみてください。でも、これは良いだろう。
mbomb007

1
re.sub("y|Y","t",chr(random.randint(33,126))+' ')[j!=i!=x-j-1]... if ... else ...コンストラクトを6バイト節約します。
RootTwo

5

Dyalog APL、35 バイト

⎕UCS 32+(⊢+∊∘57 89)⌊?95×(⊢∨⌽)∘.=⍨⍳⎕


その数
∘.=⍨等式テーブル(つまり、対角線が1である)
(⊢∨⌽)自体の1 番のプロンプト、またはその鏡像(両方の対角線を与える)対角線で1から95の間の
95×95
?rand int、残りの
床で0から1の間のrand float フロートを取り除き、
(⊢+∊∘57 89){57,89}(Yy – 32)のメンバーである要素に1を
32+追加します。32を追加して0をスペースにし、他の数値を適切な範囲に
⎕UCS変換してテキストに変換します

TryAPL


私は、これが問題の一部ではなかったとしても(そして、意図的ではないかもしれませんが)、これが偶数でどのように反応するかが好きです。よくやった!ただし、奇妙なことに、4の入力を他の入力とは異なる方法で処理することがあります。
kirkpatt

@kirkpattええ、私は「奇数のみ」にさえ気付かなかった..
アダム


3

MATL、28バイト

6Y2'Yy 'X-iZr1MZrXdwXdP2$X>c

オンラインでお試しください!

許可されているすべてのキャラクターが同じ確率で出現します。偶数入力でも機能します。

6Y2     % Predefined literal of ASCII chars from 32 to 126
'Yy '   % Not allowed chars
X-      % Set difference. Produces the set of allowed chars
i       % Input number, n
Zr      % Random sample without replacement. Gives a string with n chars taken from 
        % the allowed set
1MZr    % Do the same
Xd      % Diagonal matrix. Zeros will be displayed as spaces
wXd     % Diagonal matrix with the other string
P       % Flip vertically
2$X>    % Maximum of the two matrices
c       % Convert to char. Implicitly display

3

C、154バイト(またはボイラープレートなしの119)

o(w,c){c=rand()%94+33;printf("%*c",w,w?c+!(c&95^89):10);}main(h){scanf("%d",&h);srand(time(0));for(int n=h,p;n--;)p=abs(h/2-n),o(h/2-p+1),p&&o(p*2),o(0);}

または119は、関数としてバイトX(h)srand(time(0))他の場所の世話します:

o(w,c){c=rand()%94+33;printf("%*c",w,w?c+!(c&95^89):10);}X(h,n,p){for(n=h;n--;)p=abs(h/2-n),o(h/2-p+1),p&&o(p*2),o(0);}

壊す:

o(w,c){                         // "Output" function, for all printing
    c=rand()%94+33;             // Generate random char, whether we need it or not
    printf("%*c",               // Print a char with some number of leading spaces
           w,                   // Use "w" (width) - 1 leading spaces
           w?                   // Either print the random char...
             c+!(c&95^89)       // (exclude "y" and "Y" by incrementing to "z"/"Z")
                         :10    // ...or print a newline if called with w = 0
    );
}
main(h){                        // Main function; repurpose argc to store grid size
    scanf("%d",&h);             // Get grid size from stdin
    srand(time(0));             // Boiler-plate for random number seeding
    for(int n=h,p;n--;)         // Loop over all lines (count down to save chars)
        p=abs(h/2-n),           // Calculate half-distance between "X" bars
        o(h/2-p+1),             // Output the first half of the "X" (">")
        p&&                     // If we are not in the centre:
           o(p*2),              //   output the second half of the "X" ("<")
        o(0);                   // Output a newline
}

3

x86マシンコード、70バイト

60 89 d7 31 db 43 88 ce b2 fe 49 d1 e1 87 da 0f
c7 f0 24 7f 3c 22 72 f7 48 3c 79 74 f2 3c 59 74
ee aa 49 7c 1c 00 df 79 06 86 f7 42 43 eb f6 f6
c3 01 74 03 b0 0a aa 51 88 f9 b0 20 f3 aa 59 eb
cc c6 07 00 61 c3

逆アセンブルされた私の実行可能コード:

0000003d <myheh>:                                       
  3d:   60                      pusha                   
  3e:   89 d7                   mov    %edx,%edi        
  40:   31 db                   xor    %ebx,%ebx        
  42:   43                      inc    %ebx             
  43:   88 ce                   mov    %cl,%dh          
  45:   b2 fe                   mov    $0xfe,%dl        
  47:   49                      dec    %ecx             
  48:   d1 e1                   shl    %ecx             

0000004a <myloop>:                                      
  4a:   87 da                   xchg   %ebx,%edx        

0000004c <myrand>:                                      
  4c:   0f c7 f0                rdrand %eax             
  4f:   24 7f                   and    $0x7f,%al        
  51:   3c 22                   cmp    $0x22,%al        
  53:   72 f7                   jb     4c <myrand>      
  55:   48                      dec    %eax             
  56:   3c 79                   cmp    $0x79,%al        
  58:   74 f2                   je     4c <myrand>      
  5a:   3c 59                   cmp    $0x59,%al        
  5c:   74 ee                   je     4c <myrand>      
  5e:   aa                      stos   %al,%es:(%edi)   
  5f:   49                      dec    %ecx             
  60:   7c 1c                   jl     7e <mydone>      

00000062 <mylab>:                                       
  62:   00 df                   add    %bl,%bh          
  64:   79 06                   jns    6c <myprint>     
  66:   86 f7                   xchg   %dh,%bh          
  68:   42                      inc    %edx             
  69:   43                      inc    %ebx             
  6a:   eb f6                   jmp    62 <mylab>       

0000006c <myprint>:                                     
  6c:   f6 c3 01                test   $0x1,%bl         
  6f:   74 03                   je     74 <myprint1>    
  71:   b0 0a                   mov    $0xa,%al         
  73:   aa                      stos   %al,%es:(%edi)   

00000074 <myprint1>:                                    
  74:   51                      push   %ecx             
  75:   88 f9                   mov    %bh,%cl          
  77:   b0 20                   mov    $0x20,%al        
  79:   f3 aa                   rep stos %al,%es:(%edi) 
  7b:   59                      pop    %ecx             
  7c:   eb cc                   jmp    4a <myloop>      

0000007e <mydone>:                                      
  7e:   c6 07 00                movb   $0x0,(%edi)      
  81:   61                      popa                    
  82:   c3                      ret                     

これは、ecxでXのサイズを受け取り、edxで出力バッファーへのポインターを受け取る関数です。

出力バッファをバイトで順番に満たします。2 * n - 1反復があります(出力する非スペース文字の数に等しい)。各反復で、次のことを行います。

  • 乱数を生成する
  • 範囲内に収まるように数値をいじります。悪い場合は、戻って新たに生成します
  • ランダムな文字を印刷します
  • 改行を印刷します(他のすべての反復)
  • 適切な数のスペースを印刷する

乱数からランダムな文字への変換は注目に値しません:

myrand:
    rdrand eax;
    and al, 7fh;
    cmp al, 22h;
    jb myrand;
    dec eax;
    cmp al, 'y';
    je myrand;
    cmp al, 'Y';
    je myrand;

興味深い部分は、スペースの数の計算です。次の番号を生成する必要があります(N = 9の例):

7    1
5    2
3    3
1    4

     3
1    2
3    1
5    0
7

数値は、2つの算術進行から交互に取得されます。最初のステップはステップ-2で下がり、2番目のステップはステップ1で上がります。最初の進行が-1(Xの中央)に達すると、グリッチ(-1が除去される)があり、進行方向が変わります。

進行は、レジスタに格納されているebxedx-高部品bhdh現在の数、及び低い部品を格納blし、dlステップを格納します。進行を交互に行うために、コードはでレジスタを交換しxchgます。

進行が-1(mylabラベルの周り)に達すると、両方のレジスタが増加し、ステップがから-2, 1に切り替わります-1, 2。これにより、レジスタの役割も変更されるため、レジスタの上位部分がスワップされます。

関数の最後に、文字列の終わりを示すゼロバイトを保存します。


2

Lua、277バイト

ええと... Luaは文字列の操作がとても上手です:D。初めてlocal声明で使用しなければなりませんでした!5.3ではなくLua 5.1を使用することで、グローバル関数unpacktableLua 5.2のオブジェクトに移動したため、いくつかのバイトを節約できました。しかし、私は持っている最新バージョンに固執することを好む:)。

1つのパラメーター(2番目のパラメーターは再帰目的で使用されます)で呼び出される関数を定義し、文字列を返します。

function f(n,N)N=N or n e=" "p="\n"r=math.random C=e.char
R={}for i=1,4 do x=r(33,126)R[i]=x~=89 and x~=121 and x or r(33,88)end
local s,S,a,b,c,d=e:rep((N-n)/2),e:rep(n-2),table.unpack(R)return
n<2 and s..C(a)..p or s..C(a)..S..C(b)..s..p..f(n-2,N)..s..C(c)..S..C(d)..s..p
end

非ゴルフ

function f(n,N)                       
  N=N or n                          -- N is equal to the n we had on the first call
  e=" "                             -- shorthand for the space
  p="\n"                            -- shorthand for the newline
  r=math.random                     -- shorthand for math.random
  C=e.char                          -- uses the string e to obtain the function string.char
  R={}                              -- define an array for our random values
  for i=1,4                         -- iterate 4 times (for the random characters)
  do
    x=r(33,126)                     -- random between ASCII "!" and "~"
    R[i]=x~=89 and x~=121           -- if we didn't pick y or Y
           and x                    -- keep this number
         or r(33,88)                -- or roll for a character between "!" and "X"
  end
  local s,S                         -- these variables have to be local
          ,a,b,c,d                  -- or the recursion would change them
         =e:rep((N-n)/2),e:rep(n-2) -- s and S are the number of spaces for the X
           ,table.unpack(R)         -- a,b,c and d are the 4 random characters
  return n<2                        -- if n==1 
           and s..C(a)..p           -- we're at the center of the X, time to end recursion
         or                         -- else
           s..C(a)..S..C(b)..s..p   -- concatenate the topmost line for n
           ..f(n-2,N)               -- with the inner X
           ..s..C(c)..S..C(d)..s..p -- and the bottom line
end

2

JavaScript(ES6)、137 131 125バイト

n=>[...Array(n)].map((_,i,a)=>String.fromCharCode(...a.map((r=Math.random()*94,j)=>i-j&&i+j+1-n?32:(r+72&95&&r)+33))).join`\n`

where \nは、リテラルの改行文字を表します。編集:移動することにより、保存された1バイト' 'の内部でString.fromCharCode表現。ランダムな文字生成を不均一にすることで5バイトを節約しました。式はr+72&95にマップの値はゼロであるYyし、!その場所で生成されます。拡散するString.fromCharCodeことで回避する必要があることに気付いたときに4バイトを節約しましたjoin。@ edc65からトリックを盗んで2バイトを節約しました。


2

PowerShell v2 +、112バイト

Param($i)function f{Random(33..126-ne121-ne89|%{[char]$_})};1..$i|%{$a=,' '*$i;$a[$_-1]=f;$a[$i-$_]=f;$a-join''}

コマンドラインから入力を読み取ります。

各行に対して、スペースの配列が作成され、functionから取得した文字で正しいインデックスが入力されf、次にchar配列が結合されて1行として出力されます。


[char]キャストをの外に移動して、単項演算子になるようにRandom反転する-joinことにより、6バイトを節約できます---Param($i)function f{[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=f;$a[$i-$_]=f;-join$a}
AdmBorkBork

実際、functionPowerShellをラムダに相当するものに置き換えて、さらに数バイトを節約し、call-operator &を使用して呼び出すことができます。以下は103バイトですParam($i)$z={[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=&$z;$a[$i-$_]=&$z;-join$a}
。–

実際には、実際に;-)、あなたはあなたの崩壊によって、より多くのいくつかを保存することができ-ne、移動[char]するキャストを[char[]]上にキャスト$a(スワッピング' 'のための32プロセスで)、および移動$zそれを呼び出して最初の時間を括弧の中にの定義を。99まで(woo!sub-100!)Param($i)1..$i|%{$a=,32*$i;$a[$_-1]=&($z={Random(33..126-ne121,89)});$a[$i-$_]=&$z;-join[char[]]$a}
AdmBorkBork

$aああ、最初に使用したときにの定義を括弧に移動して、もう1バイト節約します。今98まで- Param($i)1..$i|%{($a=,32*$i)[$_-1]=&($z={Random(33..126-ne121,89)});$a[$i-$_]=&$z;-join[char[]]$a}ここでやめると思う;-) hehe
AdmBorkBork

2

MATLAB、86バイト

a=@(n)(char(changem(randi(92,n),33+[0:55 57:87 89:93],1:92).*(eye(n)|fliplr(eye(n)))))

いくつかの例:

>> a(1)

ans =

i


>> a(3)

ans =

~ {
 Z 
* ^


>>a(5)

ans =

k   E
 | M 
  }  
 ] s 
b   t


>> a(10)

ans =

Q        k
 +      a 
  j    w  
   X  [   
    rO    
    %3    
   P  d   
  K    q  
 r      & 
?        v

そのため、いくつかのルールに従ってマトリックス内の値を変更する関数が呼び出されchangemます!素晴らしい名前!
アナトリグ

2

ピップ、33バイト

32バイトのコード、-lフラグの場合は+1 。奇妙なことに、コードは... Yで始まり、y... で終わります

Ya{$=a|$+a=y-1?RCPARM-`y`s}MMCGy

入力をコマンドライン引数として受け取ります。オンラインでお試しください!

説明

適切なサイズのグリッドを作成します。対角線上の要素をランダムな非y文字で置き換え、他のすべての要素をスペースで置き換えます。

                                  a is 1st cmdline arg; PA is printable ASCII characters;
                                  s is space (implicit)
Ya                                Yank a into y (global var, accessible within functions)
                             CGy  y by y coordinate grid
  {                       }MM     To each coordinate pair, map this function:
   $=a                             Fold on equality (true if both elements are equal)
      |                            Logical OR
       $+a                         Fold on +
          =y-1                     and test if equal to size - 1
              ?                    If the preceding expression is true, then:
                 PARM               From printable ASCII chars, remove         
                     -`y`           regex matching y, case-insensitive
               RC                   Take a random choice from the resulting string
                         s         Else, space
                                  The whole expression returns a nested list, which is
                                  autoprinted as lines of concatenated items (-l flag)

1

php、135バイト

<?php for(;$i<$n=$argv[1];){$s=str_pad('',$n);$s[$i?:0]=chr(rand(33,126));$s[$n-++$i]=chr(rand(33,126));echo str_ireplace(Y,X,"$s
");}

かなり簡単なアプローチでは、str_padを使用して必要な長さのスペースの文字列を作成し、必要な文字をランダムな文字で置き換え、Y(大文字と小文字を区別しない)をXで置き換え、行をエコーし​​ます。
2n + 3個の通知を生成しますが、通常どおり、それで問題ありません。


1

Emacs Lisp、269バイト

(defalias'n'number-sequence)(set'c(mapcar'string(delq 89(delq 121(n 33 126)))))(defun c()(nth(random(length c))c))(defun s(x)" ")(defun x(l)(let((s(mapcar's(n 1 l))))(dotimes(i l)(set'x(copy-seq s))(setf(nth i x)(c)(nth(-(length x)i 1)x)(c))(message(apply'concat x)))))

ゴルフされていない、わずかに変更された:

(defvar c (mapcar 'string (delq 89 (delq 121 (number-sequence 33 126)))))
(defun c() (nth (random (length c)) c))
(defun s(x)" ")
(defun x(l)
  (let ((s(mapcar's(n 1 l)))
        x)
    (dotimes (i l)
      (set 'x (copy-seq s))
      (setf (nth i x) (c)
            (nth (- (length x) i 1) x) (c))
      (message (apply 'concat x)))))

1

JavaScript(ES6)、128 131

3バイト保存されたthx @Neilを編集

かさばるので、おそらく最良のアプローチではありません。ボーナス-奇数または偶数の入力で動作します。

n=>[...Array(n)].map((_,i,z)=>String.fromCharCode(...z.map((r=1+Math.random()*94,j)=>32+(j==i|j==n+~i&&(r+7&31?r:25))))).join`
`

F=n=>[...Array(n)].map((_,i,z)=>String.fromCharCode(...z.map((r=1+Math.random()*94,j)=>32+(j==i|j==n+~i&&(r+7&31?r:25))))).join`\n`

Z=_=>{
    o=F(+S.value),O.textContent=o,/y/i.test(o)||setTimeout(Z,100)
}
setTimeout(Z,100)
<input id=S value=15 type=number>
<pre id=O></pre>


r+7&31同じ結果が得られると思います(r&31)-25
ニール

@Neilはいいですね、ありがとう
-edc65

これがランダムであるという事実をどのように説明するかが好きです!+1
コナーオブライエン

1

C、268バイト

V(c){for(c=89;c==89||c==121;c=rand()%95+33);return c;}p(n,s){n^1?s-n?printf("%*.c",s-n,32):0,printf("%c%*.c%c\n",V(),n*2-3,32,V()),p(n-1,s),s-n?printf("%*.c",s-n,32):0,printf("%c%*.c%c\n",V(),2*n-3,32,V()):printf("%*.c%c\n",s-n,32,V());}f(n){srand(time(NULL));p(n,n);}

f()のサイズで呼び出しxます。


srand関数内で呼び出す必要があります。関数はグローバル状態に依存できません。ただし、2つのネストされたループとバックスペース文字を使用して、はるかに短いプログラムを実現できます。一般的な解決策は、次のようになります。この、私は使用して、Windowsの特定の変異体が考えるclock有効になります。
-FryAmTheEggman

コンパイラのバージョンを追加してリースできますか?on on gcc version 4.8.1Windowsおよびgcc version 5.3.0Cygwinでは動作しません...(IdeOne Worksで)
ジャコモガラベロ

GCC 6.1.0で動作することは知っていますが、少なくとも4.9以上で動作するはずです。clang 3.8.1でも動作します。どのようなエラーが表示されますか?
-owacoder

1

マトリックス、79バイト(非競合)

Matricks は、xとすべてのランダム値を作成する最初の部分として優れていますが、条件式に関してはフロップします...

この課題が投稿された後、いくつかのバグを修正し、すべての新機能を動作させる必要があるため、これを非競合とマークしました。

m:n;:1;mr=c:L:L;k({}|{X;})*{m_?33:126;;:L:l;miC<121,89>:gr:c;;:49:gr:c;;:L:l;};

で実行 python matricks.py x.txt [[]] <input> --asciiprint

説明:

m:n;:1;mr=c:L:L;                   #Initialize matrix to be a square with
                                   #a diagonal of 1s
k...;                              #Set the output to...
({}|{X;})*                         #The boolean x matrix multiplied by...
{m_?33:126;;:L:l;                  #A bunch of random characters
miC<121,89>:gr:c;;:49:gr:c;;:L:l;} #But make sure they are not y or Y

これは偶数もサポートします。


1

パイソン2、204の 191 183バイト

さて、ここでのPythonの競争は激しくなっています。できるだけ多くのバイトを削るという私の試みです。今、私は立ち往生しています(OK、再び立ち往生)。

ランダム文字の選択方法に対する@NonlinearFruitの功績。

183バイトバージョン:

import re,random
s=i=input();t=lambda:re.sub("y|Y","t",chr(random.randint(33,126)))
while i>-s:i-=2;u=abs(i);z=(s-u)/2-1;print('',' '*-~z+t()+'\n')[-1==i]+(' '*z+t()+' '*u+t())*(i>-s)

オンラインでお試しください!(イデオン)

主な変更は、条件を書き直すことです

(" "*(z+1)+t()+"\n"if -1==i else"") 

なので

(""," "*-~z+t()+'\n')[-1==i]

7バイトを節約します。

191バイトバージョン:

import re,random
s=i=input();t=lambda:re.sub("y|Y","t",chr(random.randint(33,126)))
while i>-s:
 i-=2;u=abs(i);z=(s-u)/2-1;print(' '*(z+1)+t()+'\n'if -1==i else'')+(' '*z+t()+' '*u+t())*(i>-s)

オンラインでお試しください!(イデオン)

主な変更点は、ランダムな文字列が選択されている方法となどのいくつかのコードの再配置されているs=input();i=s;になってきてs=i=input();、削除するr=rangeことが不要になったとして割り当てをして呼び出すabsことがコードのあまりバイトにつながるとして直接。

Pythonで以前の最短回答を1バイト上回った!@R。Kapのアプローチは、ランダムな文字を生成するために使用されます。whileループの各反復で、exの行が出力されます。

204バイトバージョン

from random import*
s=input();i=s;a=abs;r=range;t=lambda:chr(choice(r(33,89)+r(90,121)+r(122,128)))
while i>-s:
 i-=2;z=(s-a(i))/2-1;print(' '*(z+1)+t()+'\n'if -1==i else'')+(' '*z+t()+' '*a(i)+t())*(i>-s)

オンラインでお試しください!(イデオン)

それがどのように機能するかのアイデアを得るためのゴルフのないバージョン:

from random import *
random_character = lambda : chr(choice(range(33,89)+range(90,121)+range(122,128)))

size = input()
current_row = size

while current_row > -size:
    current_row-=2
    n_leading_spaces = (size-abs(current_row)/2)-1 
    row_to_print = ''
    if current_row == -1:
        row_to_print = ' ' * (n_leading_spaces+1) + random_chr() + '\n'
    if current_row > -size:
        row_to_print += ' ' * n_leading_spaces + random_chr()+' '*abs(current_row)+random_chr()
    print row_to_print

1文字のケースを処理するのは困難でした!


1

SmileBASIC、97バイト

INPUT S
FOR X=1TO S
FOR Y=1TO S
Q=RND(93)+33?CHR$((Q+!(Q-121&&Q-89))*(X==Y||X+Y==S+1));
NEXT?NEXT

各文字または何かの間のスペースの数を計算する代わりに、X==Yまたはのすべての場所に印刷することにしましたX+Y==Size+1
ランダム文字ジェネレーターは、yまたはを生成する場合に1を追加するだけなYのでzZ通常よりも少し一般的です。


1

PHP、100バイト

for(;($x%=$n=$argv[1])?:$y++<$n&print"\n";)echo strtr(chr($y+$x++-$n&&$x-$y?32:rand(33,126)),yY,zZ);

コマンドライン引数から入力を受け取ります。で実行し-nrます。

結合ループは位置に応じて文字を出力します

壊す

for(;
    ($x%=$n=$argv[1])       // inner loop
        ?
        :$y++<$n&print"\n"  // outer loop; print newline
;)
    echo strtr(chr(             // 2. replace Y with Z; print
        $y+$x++-$n&&$x-$y       // 1: if position is not on diagonals
            ?32                 // then space
            :rand(33,126)       // else random printable
    ),yY,zZ);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.