Lakukan X tanpa Y

52

Biasanya, dikatakan bahwa "Melakukan X tanpa Y" dapat menjadi jebakan bagi pemula yang menulis tantangan ( sumber ). Namun, saya sombong dan berpikir bahwa saya pasti bisa membuat X tanpa Ys. Secara acak. Oh ya, ini akan baik.

Tantangan: Diberikan bilangan bulat ganjil yang nlebih besar dari atau sama dengan 1, menampilkan mantan sisi panjang yang nterbuat dari karakter ascii yang dapat dicetak secara acak tanpa huruf "y" dan "Y", dan spasi. Semua karakter yang diizinkan harus memiliki peluang yang bukan nol untuk terjadi, tetapi tidak harus seragam. Ini adalah sehingga kode terpendek dalam byte menang. Anda harus, bagaimanapun, mengacak masing-masing karakter - yaitu, struts dari mantan tidak boleh sama, kecuali jika secara kebetulan.

Karakter muncul

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

Membangun mantan

Panjang sisi 1:

x

Panjang sisi 3:

x x
 x
x x

Panjang sisi 5:

x   x
 x x
  x
 x x
x   x

dll.

Keluaran contoh

input
output
empty line

3
h 2
 ^
9 5

1
:

5
D   1
 W z
  W
 q j
W   1

Contoh implementasi

Anda tidak perlu menangani input yang tidak valid.

Conor O'Brien
sumber
Karakter mana yang harus memenuhi syarat untuk tampil?
xnor
@xnor Karakter dari !ke ~sans ydanY
Conor O'Brien
@ LegionMammal978 Tidak, karena karakter non-Y menyertakan ydan .
Leaky Nun
7
Hmm .. acak ...
NonlinearFruit
14
Tunggu!? Kita diizinkan menggunakan "Y" dan "y" dalam kode kita?
Adám

Jawaban:

3

Pyth, 28 27 26 25 byte

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

Suite uji.

Biarawati Bocor
sumber
5
Saya cukup yakin ini tidak akan pernah menghasilkan ~karakter, karena rentang tidak menyertakannya. Anda dapat memperbaikinya dengan mengubah ~kode ke karakter DEL literal.
FryAmTheEggman
10

Ruby, 102 byte

Array#sampletidak melakukan pengulangan untuk pengambilan sampel dari set karakter, tapi tidak apa-apa karena distribusi karakter tidak harus seragam sempurna! Fungsi rekursif, mengembalikan array garis.

Cobalah online!

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]}
Nilai Tinta
sumber
7

Sebenarnya, 62 byte

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

Ini adalah salah satu program Sebenarnya terpanjang yang pernah saya tulis.

Cobalah online!

Penjelasan:

Bagian 1 : mengatur daftar karakter

"!⌂"♂┘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")

Cobalah online!

Bagian 2 : membangun array boolean untuk 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)

Cobalah online!

Bagian 3 : memilih karakter acak

`"╜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

Cobalah online!

Mego
sumber
1
"Visualisasikan bit weaving" adalah 69 byte ;-)
AdmBorkBork
6

Mathematica, 146 byte

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

Fungsi anonim. Mengambil angka sebagai input, dan mengembalikan string sebagai output.

LegionMammal978
sumber
6

Python 2, 171 byte

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

Dijamin untuk memilih karakter acak dengan probabilitas seragam.

Cobalah di sini: tautan ideone

EDIT: Terima kasih kepada Morgan Thrapp untuk koreksi.

osifrque melengking
sumber
from random import*menghemat 2 byte. Anda juga dapat bergabung dengan dua baris pertama jloop dengan titik koma untuk menyimpan beberapa byte. (Juga saya percaya Zdan {memiliki peluang lebih tinggi untuk muncul daripada beberapa surat lainnya, bukan karena itu penting untuk pertanyaan itu)
FryAmTheEggman
Anda dapat mencapai 165 dengan beberapa modifikasi kecil mothereff.in/...
Morgan Thrapp
2
Sebenarnya, output Anda salah untuk semua kasus uji. Anda membuat setiap kaki sama dengan n alih-alih ukuran sisi total.
Morgan Thrapp
@MorganThrapp Ah, Anda benar. Saya akan memperbaikinya
squeamish ossifrage
4 byte: bool(i^j and i^-j)->i not in(j,-j)
Jonathan Allan
6

Python, 142 139 135 byte

Ini adalah implementasi lurus ke depan buat karakter persegi dengan karakter. Jika karakter berada pada diagonal : gunakan karakter acak, yang lain : gunakan spasi. Ini juga menggunakan substitusi regex dan int acak untuk menghasilkan non- Ykarakter:

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

Penjelasan [Tua]

"\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

Memperbarui

  • -4 [16-07-30] Diperingkat baris baru bersyarat
  • -3 [16-07-30] Diubah menjadi single for-loop
  • -6 [16-07-29] Ditukar jika pernyataan untuk op ternary. Terima kasih kepada @RootTwo
  • -11 [16-07-27] Menghapus kurung / spasi ekstra dan membalik pernyataan if
  • -49 [16-07-27] Metode Absorded @ squeamishossifrage dengan membuat langkah demi langkah, Terima kasih!
  • -10 [16-07-27] Persingkat acak char lambda + item matematika dari @ ConorO'Brien
  • -22 [16-07-26] Squeaze dalam permainan golf lambda + misc
  • -6 [16-07-26] import*- Terima kasih kepada @KevinLau
Buah Nonlinier
sumber
1
randintmungkin lebih pendek untuk keperluan Anda, plus from random import*. Juga, hapus beberapa ruang putih yang tidak perlu.
Value Ink
2
[i,33][i in(89,121)]berfungsi sebagai gantinya membutuhkan terner bertele-tele dalam ffungsi Anda ! Lihat juga apakah Anda dapat menghapus ruang yang tepat setelah printpernyataan Anda
Value Ink
Saya sarankan mencoba format yang berbeda untuk penjelasan kode Anda. Ini tidak mudah dibaca. Coba lihat bagaimana pengguna lain melakukannya. Bahkan ini akan lebih baik.
mbomb007
1
re.sub("y|Y","t",chr(random.randint(33,126))+' ')[j!=i!=x-j-1]menghemat 6 byte dari ... if ... else ...konstruk.
RootTwo
5

Dyalog APL , 35 byte

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

meminta nomor
1 melalui
∘.=⍨tabel persamaan angka (yaitu diagonal memiliki 1s)
(⊢∨⌽)itu sendiri ATAU gambar cerminnya (memberikan kedua diagonal)
95×dikalikan dengan 95
?rand int antara 1 dan 95 untuk diagonal, rand mengambang antara 0 dan 1 untuk
lantai sisanya untuk singkirkan float,
(⊢+∊∘57 89)tambahkan satu ke elemen yang merupakan anggota dari {57,89} (Yy - 32)
32+tambahkan 32 untuk menjadikan 0s menjadi spasi, dan angka lainnya ke dalam rentang yang tepat
⎕UCSdikonversi ke teks

TryAPL !

Adm
sumber
Saya suka bagaimana yang ini juga bereaksi dengan angka genap, meskipun itu bukan bagian dari masalah (dan bahkan mungkin tidak disengaja). Kerja bagus! Meskipun, anehnya, kadang-kadang memperlakukan input 4 berbeda dari input lainnya.
kirkpatt
@kirkpatt Ya, saya bahkan tidak melihat "aneh-saja" ..
Adám
3

Python 2.7, 205 byte:

from random import*;C=input()/2;S=' ';R=range;Z=lambda:chr(choice(R(33,89)+R(90,121)+R(122,128)));T=lambda*G:''.join([S*i+Z()+S*(2*(~-C-i)+1)+Z()+S*i+'\n'for i in R(*G)]);print T(C)+S*C+Z()+'\n'+T(~-C,-1,-1)

Cobalah secara Online! (Ideone)

R. Kap
sumber
3

MATL , 28 byte

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

Cobalah online!

Semua karakter yang diizinkan memiliki probabilitas yang sama untuk muncul. Berfungsi untuk input genap juga.

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
Luis Mendo
sumber
3

C, 154 byte (atau 119 tanpa pelat ketel)

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);}

Atau 119 byte sebagai fungsi X(h)dengan srand(time(0))dijaga di tempat lain:

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);}

Kerusakan:

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
}
Dave
sumber
3

kode mesin x86, 70 byte

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

Kode yang dapat dieksekusi saya, dibongkar:

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                     

Ini adalah fungsi yang menerima ukuran X di ecx, dan penunjuk ke buffer output di edx.

Ini mengisi buffer output secara berurutan dengan byte. Ada 2 * n - 1iterasi (sama dengan jumlah karakter non-spasi untuk output). Pada setiap iterasi, ia melakukan hal berikut:

  • Hasilkan nomor acak
  • Mengotak-atik nomor agar pas ke dalam jangkauan; jika buruk, kembali dan hasilkan yang baru
  • Cetak karakter acak
  • Cetak baris baru (setiap iterasi lainnya)
  • Cetak jumlah spasi yang tepat

Konversi dari angka acak ke karakter acak tidak luar biasa:

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

Bagian yang menarik adalah perhitungan jumlah spasi. Itu harus menghasilkan angka-angka berikut (contoh untuk N = 9):

7    1
5    2
3    3
1    4

     3
1    2
3    1
5    0
7

Angka-angka diambil secara bergantian dari dua perkembangan aritmatika. Yang pertama turun dengan langkah -2, dan yang kedua naik dengan langkah 1. Ketika perkembangan pertama tiba di -1 (di tengah-tengah X), ada kesalahan (-1 dihapus), dan kemudian perkembangannya berubah arah.

Kemajuan disimpan dalam register ebxdan edx- bagian tinggi bhdan dhmenyimpan nomor saat ini, dan bagian rendah bldan dlmenyimpan langkah. Untuk bergantian di antara progres, kode bertukar register dengan xchg.

Ketika progres tiba di -1 (di sekitar mylablabel), ia meningkatkan kedua register, mengalihkan langkah dari -2, 1ke -1, 2. Ini juga mengubah peran register, sehingga kemudian bertukar bagian register yang tinggi.

Di akhir fungsi, ini menyimpan nol byte untuk menunjukkan akhir dari string.

anatolyg
sumber
2

Lua, 277 Bytes

Yah ... Lua sangat pandai memanipulasi string: D. Pertama kali saya harus menggunakan localpernyataan! Saya bisa menyimpan beberapa byte dengan menggunakan Lua 5.1 bukan 5.3 karena mereka memindahkan fungsi global unpackke objek tabledi Lua 5.2. Tapi saya lebih suka tetap dengan versi terbaru yang saya miliki :).

Menentukan fungsi yang harus dipanggil dengan parameter tunggal (yang kedua digunakan untuk tujuan rekursi) dan mengembalikan string.

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

Tidak disatukan

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
Katenkyo
sumber
2

JavaScript (ES6), 137 131 125 byte

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`

Dimana \nmewakili karakter baris baru literal. Sunting: Disimpan 1 byte dengan memindahkan bagian ' 'dalam String.fromCharCodeekspresi. Disimpan 5 byte dengan membuat generasi karakter acak saya tidak seragam; ekspresi r+72&95adalah nol untuk nilai yang dipetakan ke Ydan ydan !dihasilkan di tempat mereka. Disimpan 4 byte ketika saya menyadari bahwa penyebaran String.fromCharCodemenghindari harus join. Disimpan 2 byte dengan mencuri trik dari @ edc65.

Neil
sumber
2

PowerShell v2 +, 112 byte

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

Membaca input dari baris perintah.

Untuk setiap baris, array spasi dibuat, indeks yang benar diisi dengan karakter yang ditarik dari fungsi f, kemudian array char digabungkan ke output sebagai satu baris.

Ben Owen
sumber
Anda dapat menghemat 6 byte dengan memindahkan [char]gips ke luar Random, dan dengan membalik -joinoperator menjadi unary ---Param($i)function f{[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=f;$a[$i-$_]=f;-join$a}
AdmBorkBork
Sebenarnya, Anda dapat menyimpan pasangan byte lainnya dengan mengganti functiondengan PowerShell yang setara dengan lambda dan menggunakan operator &panggilan untuk memanggilnya. Berikut ini adalah 103 byte -Param($i)$z={[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=&$z;$a[$i-$_]=&$z;-join$a}
AdmBorkBork
Sebenarnya, sebenarnya ;-), Anda dapat menyimpan lebih banyak dengan mengosongkan Anda -ne, menggerakkan [char]pemain untuk menjadi [char[]]pemain $a(bertukar ' 'untuk 32dalam proses), dan memindahkan $zdefinisi ke dalam parens saat pertama kali disebut. Turun ke 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
Hah, simpan byte lain dengan memindahkan $adefinisi ke parens saat pertama kali digunakan. Turun ke 98 sekarang - Param($i)1..$i|%{($a=,32*$i)[$_-1]=&($z={Random(33..126-ne121,89)});$a[$i-$_]=&$z;-join[char[]]$a}saya pikir saya akan berhenti di sini ;-) hehe
AdmBorkBork
2

MATLAB, 86 byte

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

Beberapa contoh:

>> 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
PieCot
sumber
Jadi, fungsi yang mengubah nilai dalam matriks sesuai dengan beberapa aturan disebut changem! Nama yang bagus!
anatolyg
2

Pip , 33 byte

32 byte kode, +1 untuk -lbendera. Anehnya, kode dimulai dengan Ydan diakhiri dengan y...

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

Mengambil input sebagai argumen baris perintah. Cobalah online!

Penjelasan

Membangun kisi dengan ukuran yang sesuai; menggantikan elemen pada diagonal dengan karakter non-y acak, dan semua elemen lainnya dengan spasi.

                                  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)
DLosc
sumber
1

php, 135 byte

<?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
");}

Pendekatan yang cukup mudah menggunakan str_pad untuk membuat string spasi dengan panjang yang dibutuhkan, mengganti karakter yang diperlukan dengan yang acak lalu mengganti Ys (case case) dengan Xs dan menggema garis.
Menghasilkan pemberitahuan 2n + 3 tetapi, seperti biasa, itu tidak masalah.

pengguna55641
sumber
1

Emacs Lisp, 269 bytes

(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)))))

Tidak disatukan dan sedikit diubah:

(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)))))
Tuan Yuuma
sumber
1

JavaScript (ES6), 128 131

Edit 3 byte yang disimpan thx @Neil

Sangat besar, mungkin bukan pendekatan terbaik. Bonus - ini bekerja dengan input ganjil atau genap.

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>

edc65
sumber
Saya pikir r+7&31memberikan hasil yang sama dengan (r&31)-25.
Neil
@Neil kedengarannya bagus, terima kasih
edc65
Saya suka bagaimana ini menggambarkan fakta bahwa itu acak! +1
Conor O'Brien
1

C, 268 byte

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);}

Panggil f()dengan ukuran xuntuk menggambar.

owacoder
sumber
Anda harus memanggil ke sranddalam fungsi Anda, mereka tidak dapat mengandalkan negara global. Anda dapat, bagaimanapun, mencapai program yang jauh lebih pendek dengan dua loop bersarang dan menggunakan karakter backspace. Sebuah solusi umum mungkin terlihat seperti ini , tapi saya pikir menggunakan varian windows tertentu clockakan valid.
FryAmTheEggman
Bisakah Anda menyewa menambahkan versi kompiler Anda? aktif gcc version 4.8.1untuk Windows dan gcc version 5.3.0untuk Cygwin tidak berfungsi ... (pada IdeOne Works)
Giacomo Garabello
Saya tahu ini bekerja dengan GCC 6.1.0, tetapi setidaknya harus bekerja dengan> 4.9. Ini juga bekerja dengan dentang 3.8.1. Kesalahan apa yang Anda lihat?
owacoder
1

Matricks , 79 byte (tidak bersaing)

Matricks unggul sebagai awal pembuatan x dan semua nilai acak, tetapi gagal ketika datang ke kondisional ...

Saya menandai ini sebagai tidak bersaing karena saya harus memperbaiki beberapa bug dan mendapatkan semua fitur baru berfungsi setelah tantangan ini diposting.

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

Jalankan dengan python matricks.py x.txt [[]] <input> --asciiprint

Penjelasan:

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

Ini juga mendukung angka genap.

Biru
sumber
1

Python 2, 204 191 183 byte

Oke, kompetisi Python di sini semakin sengit. Inilah upaya saya mencukur sebanyak mungkin byte. Sekarang saya macet (Ok, macet lagi).

Kredit ke @NonlinearFruit untuk cara karakter acak dipilih.

Versi 183 byte:

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)

Cobalah secara Online! (Ideone)

Perubahan utama adalah menulis ulang persyaratan

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

sebagai

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

yang menghemat 7 byte.

Versi 191 byte:

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)

Cobalah secara Online! (Ideone)

Perubahan utama adalah cara karakter acak dipilih dan beberapa penataan ulang kode seperti s=input();i=s;menjadi s=i=input();, menghapus r=rangetugas karena tidak lagi diperlukan dan memanggil abslangsung karena menghasilkan lebih sedikit byte kode.

Mengalahkan jawaban terpendek sebelumnya dengan Python 1 byte! @R. Pendekatan Kap digunakan untuk menghasilkan karakter acak. Setiap iterasi dari while loop satu baris ex dicetak.

Versi 204 byte :

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)

Cobalah secara Online! (Ideone)

Versi ungolfed untuk mendapatkan ide tentang cara kerjanya:

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

Sulit untuk menangani case 1-karakter!

Ioannes
sumber
1

SmileBASIC, 97 byte

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

Daripada harus menghitung jumlah spasi antara setiap karakter atau sesuatu, saya memutuskan untuk hanya mencetak di semua lokasi di mana X==Yatau X+Y==Size+1.
Generator karakter acak hanya menambahkan 1 jika menghasilkan yatau Y, jadi zdan Zsedikit lebih umum dari biasanya.

12Me21
sumber
1

PHP, 100 byte

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

mengambil input dari argumen baris perintah; jalankan bersama -nr.

loop gabungan mencetak karakter tergantung pada posisi

kerusakan

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);
Titus
sumber