ทำ X โดยไม่มี Y


52

โดยปกติจะมีการกล่าวว่า "การทำ X โดยไม่มี Y" สามารถเป็นกับดักสำหรับผู้เริ่มต้นที่เขียนความท้าทาย (ที่มา ) แต่ผมอวดดีและคิดว่าฉันสามารถแน่นอนทำให้ X โดยไม่ต้องอีสใด ๆ สุ่ม โอ้ใช่นี่จะดี

ถาม:ให้เป็นจำนวนเต็มคี่nมากกว่าหรือเท่ากับ 1 เอาท์พุทอดีตของความยาวด้านที่nทำจากตัวอักษร ASCII แบบสุ่มที่พิมพ์ได้จะมี "y" และ "Y" และช่องว่าง อักขระที่อนุญาตทั้งหมดต้องมีโอกาสเกิดขึ้นที่ไม่ใช่ศูนย์ แต่ไม่จำเป็นต้องเหมือนกัน นี่คือเพื่อให้โค้ดที่สั้นที่สุดเป็นไบต์ชนะ อย่างไรก็ตามคุณควรสุ่มถ่านแต่ละอัน - นั่นคือเสาของแฟนเก่าไม่ควรเท่ากันเว้นแต่เป็นไปได้โดยบังเอิญ

ตัวอักษรที่จะปรากฏ

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

การสร้างอดีต

ความยาวด้าน 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 จาก!ถึง~sans yและY
Conor O'Brien

@ LegionMammal978 ไม่มีเพราะไม่ใช่ตัวอักษร Y รวมและy
Leun Nun

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 : ตั้งค่ารายการตัวละคร

"!⌂"♂┘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
"เห็นภาพการทอผ้าบิต" คือ 69 ไบต์ ;-)
AdmBorkBork

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

แก้ไข: ขอบคุณ Morgan Thrapp สำหรับการแก้ไข


from random import*บันทึก 2 ไบต์ คุณยังสามารถเข้าร่วมสองบรรทัดแรกของjลูปด้วยเซมิโคลอนเพื่อบันทึกบางไบต์ (ฉันเชื่อZและ {มีโอกาสสูงกว่าที่จะเกิดขึ้นมากกว่าตัวอักษรอื่น ๆ ไม่ใช่ว่ามันสำคัญสำหรับคำถาม)
FryAmTheEggman

คุณสามารถลงไปที่ 165 ด้วยการปรับเปลี่ยนเล็กน้อยmothereff.in/…
Morgan Thrapp

2
ที่จริงแล้วผลลัพธ์ของคุณผิดสำหรับทุกกรณีทดสอบ คุณกำลังทำให้ขาแต่ละข้างเท่ากับ n แทนที่จะเป็นขนาดด้านข้างทั้งหมด
Morgan Thrapp

@ MorganThrapp Ah คุณพูดถูก ฉันจะแก้ไขนั่น
คลื่นไส้ ossifrage

4 ไบต์: bool(i^j and i^-j)->i not in(j,-j)
Jonathan Allan

6

Python, 142 139 135 ไบต์

นี่คือการใช้งานตรงไปตรงมาสร้างตัวละครสแควร์โดยตัวละคร หากตัวละครอยู่ในแนวทแยง : ใช้ถ่านแบบสุ่มอื่น : ใช้ช่องว่าง สิ่งนี้ยังใช้การทดแทน regex และ 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] เปลี่ยนเป็นวงเดี่ยว
  • -6 [16-07-29] แลกเปลี่ยนถ้าคำสั่งสำหรับ op ประกอบไปด้วย ขอบคุณ @RootTwo
  • -11 [16-07-27] ลบวงเล็บพิเศษ / ช่องว่างและพลิกถ้าคำสั่ง
  • -49 [16-07-27] วิธีการของ Absorded @ squeamishossifrage โดยการสร้างสี่เหลี่ยมทีละขั้นตอนขอบคุณ!
  • -10 [16-07-27] ลดจำนวนแลมบ์ดาสุ่ม + คณิตศาสตร์จาก @ ConorO'Brien
  • -22 [16-07-26] ร้องเสียงดังในแลมบ์ดา + อื่น ๆ การเล่นกอล์ฟ
  • -6 [16-07-26] import*- ขอบคุณ @KevinLau

1
randintfrom random import*อาจจะเป็นสั้นสำหรับวัตถุประสงค์ของคุณบวก ลบพื้นที่สีขาวที่ไม่จำเป็นออกไป
หมึกมูลค่า

2
[i,33][i in(89,121)]ทำงานแทนต้องการไตรภาคที่ยืดยาวในfหน้าที่ของคุณ! ดูว่าคุณสามารถลบพื้นที่ที่ถูกต้องหลังจากprintข้อความของคุณ
Value Ink

ฉันขอแนะนำให้ลองใช้รูปแบบอื่นสำหรับคำอธิบายรหัสของคุณ สิ่งนี้ไม่สามารถอ่านได้มาก ลองดูว่าผู้ใช้รายอื่นทำอย่างไร แม้นี้จะดีกว่า
mbomb007

1
re.sub("y|Y","t",chr(random.randint(33,126))+' ')[j!=i!=x-j-1]บันทึก 6 ไบต์มากกว่า... if ... else ...โครงสร้าง
RootTwo

5

Dyalog APL , 35 ไบต์

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

แจ้งหมายเลข
1 ถึงตัวเลขที่
∘.=⍨ตารางเท่าเทียมกัน (เช่นเส้นทแยงมุมมี 1s)
(⊢∨⌽)ตัวเองหรือภาพกระจก (จะช่วยให้ทั้งสองเส้นทแยงมุม)
95×คูณด้วย 95
?แรนด์ int ระหว่างวันที่ 1 และ 95 เส้นทแยงมุมลอยแรนด์ระหว่าง 0 และ 1 สำหรับส่วนที่เหลือ
พื้น กำจัดการลอย
(⊢+∊∘57 89)เพิ่มหนึ่งองค์ประกอบที่เป็นสมาชิกของ {57,89} (Yy - 32)
32+เพิ่ม 32 เพื่อทำให้ 0s เป็นช่องว่างและตัวเลขอื่น ๆ ในช่วงที่เหมาะสม
⎕UCSแปลงเป็นข้อความ

ลองใช้ !


ฉันชอบที่สิ่งนี้ตอบสนองกับตัวเลขคู่แม้ว่านั่นไม่ได้เป็นส่วนหนึ่งของปัญหา (และอาจไม่ได้ตั้งใจ) เยี่ยมมาก! แม้ว่าแปลกบางครั้งก็ถือว่าอินพุต 4 แตกต่างจากอินพุตอื่น ๆ
kirkpatt

@kirkpatt ใช่ฉันไม่ได้สังเกตเห็นแม้แต่ "คี่เท่านั้น" ..
59


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                     

มันเป็นฟังก์ชั่นที่รับขนาดของ X ใน ecx และตัวชี้ไปยังบัฟเฟอร์เอาต์พุตใน edx

มันเติมบัฟเฟอร์ผลลัพธ์ตามลำดับด้วยไบต์ มี2 * n - 1การวนซ้ำ (เท่ากับจำนวนของอักขระที่ไม่ใช่ช่องว่างเพื่อส่งออก) ในการทำซ้ำแต่ละครั้งจะทำสิ่งต่อไปนี้:

  • สร้างตัวเลขสุ่ม
  • ซอที่มีตัวเลขเพื่อให้พอดีกับช่วง; ถ้ามันไม่ดีให้กลับไปสร้างใหม่อีกครั้ง
  • พิมพ์ตัวอักษรแบบสุ่ม
  • พิมพ์ newline (ซ้ำทุก ๆ )
  • พิมพ์จำนวนช่องว่างที่เหมาะสม

การแปลงจากจำนวนสุ่มไปเป็นอักขระสุ่มไม่น่าทึ่ง:

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 และอันที่สองขึ้นไปด้วยขั้นตอนที่ 1 เมื่อความก้าวหน้าครั้งแรกมาถึงที่ -1 (ตรงกลางของ X) จะมีความผิดพลาด (-1 ถูกลบ) แล้ว ความก้าวหน้าเปลี่ยนทิศทาง

ความคืบหน้าจะถูกเก็บไว้ในการลงทะเบียนebxและedx- ส่วนสูงbhและdhเก็บหมายเลขปัจจุบันและส่วนที่ต่ำblและdlจัดเก็บขั้นตอน ที่จะสลับกันระหว่างก้าวหน้ารหัส swaps xchgลงทะเบียนกับ

เมื่อขบวนมาถึงที่ -1 (รอบmylabฉลาก) ก็เพิ่มขึ้นทั้งลงทะเบียนเปลี่ยนขั้นตอนจากไป-2, 1 -1, 2สิ่งนี้จะเปลี่ยนบทบาทของรีจิสเตอร์ด้วยดังนั้นมันจึงสลับส่วนของรีจิสเตอร์ระดับสูง

ในตอนท้ายของฟังก์ชั่นมันจะเก็บศูนย์ไบต์เพื่อระบุจุดสิ้นสุดของสตริง


2

Lua, 277 ไบต์

อืม ... Lua เก่งมากในการจัดการสายอักขระ: D ครั้งแรกที่ฉันต้องใช้localในการแถลง! ฉันสามารถบันทึกบางไบต์โดยใช้ Lua 5.1 แทน 5.3 เพราะพวกเขาย้ายฟังก์ชั่นทั่วโลกunpackเป็นวัตถุtableที่ Lua 5.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

Ungolfed

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`

ไหน\nหมายถึงอักขระ newline ที่แท้จริง แก้ไข: บันทึก 1 ไบต์โดยเลื่อน' 'ด้านในของString.fromCharCodeนิพจน์ บันทึก 5 ไบต์ด้วยการสร้างตัวละครแบบสุ่มของฉันแบบไม่สม่ำเสมอ การแสดงออกr+72&95เป็นศูนย์สำหรับค่าที่แมปYและyและ!จะถูกสร้างขึ้นในสถานที่ของพวกเขา ที่บันทึกไว้ 4 ไบต์เมื่อฉันตระหนักว่าแผ่กระจายไปทั่วหลีกเลี่ยงการต้องString.fromCharCode joinบันทึก 2 ไบต์โดยขโมยเคล็ดลับจาก @ edc65


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''}

อ่านอินพุตจากบรรทัดรับคำสั่ง

สำหรับแต่ละบรรทัดอาร์เรย์ของช่องว่างจะถูกสร้างดัชนีที่ถูกต้องจะถูกเติมด้วยอักขระที่ดึงออกมาจากฟังก์ชันfจากนั้นอาร์เรย์ถ่านจะถูกรวมเข้ากับเอาต์พุตเป็นหนึ่งบรรทัด


คุณสามารถบันทึก 6 ไบต์โดยการย้าย[char]หล่อนอกRandomและพลิก-joinให้เป็นผู้ประกอบการเอกภาค ---Param($i)function f{[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=f;$a[$i-$_]=f;-join$a}
AdmBorkBork

ที่จริงแล้วคุณสามารถบันทึกอีกสองสามไบต์โดยแทนที่functionด้วย PowerShell เทียบเท่าแลมบ์ดาและใช้ call-operator &เพื่อโทรหา ต่อไปนี้คือ 103 ไบต์ -Param($i)$z={[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=&$z;$a[$i-$_]=&$z;-join$a}
AdmBorkBork

จริงจริง ;-) คุณสามารถบันทึกบางมากขึ้นโดยการยุบตัวของคุณ-neย้าย[char]หล่อจะเป็น[char[]]หล่อ$a(แลกเปลี่ยน' 'สำหรับ32ในกระบวนการ) และย้าย$zนิยาม 's เข้าไปใน parens ในครั้งแรกก็เรียกว่า ลงไปที่ 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คำจำกัดความไปเป็น parens เมื่อใช้ครั้งแรก ลงมาที่ 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! ชื่อเยี่ยม!
anatolyg

2

Pip , 33 ไบต์

รหัส 32 ไบต์ +1 สำหรับการ-lตั้งค่าสถานะ น่าแปลกที่รหัสเริ่มต้นด้วย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 เพื่อสร้างสตริงของช่องว่างของความยาวที่ต้องการแทนที่อักขระที่จำเป็นด้วยการสุ่มแล้วแทนที่ Ys ใด ๆ (case insensitive) ด้วย Xs และ echos บรรทัด
สร้างประกาศ 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)))))

Ungolfed และแก้ไขเล็กน้อย:

(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 ไบต์ที่บันทึกไว้ขอบคุณ @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

@Neil ฟังดูดีขอบคุณ
edc65

ฉันชอบวิธีนี้แสดงให้เห็นถึงความจริงที่ว่ามันเป็นแบบสุ่ม! +1
Conor O'Brien

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ภายในฟังก์ชั่นของพวกเขาพวกเขาไม่สามารถเชื่อถือได้ในระดับโลก อย่างไรก็ตามคุณสามารถบรรลุโปรแกรมที่สั้นกว่ามากโดยใช้ลูปซ้อนกันสองลูปและใช้อักขระแบ็คสเปซ วิธีแก้ปัญหาทั่วไปอาจมีลักษณะเช่นนี้แต่ฉันคิดว่าการใช้ตัวแปรเฉพาะของ windows clockจะใช้ได้
FryAmTheEggman

คุณสามารถเช่าเพิ่มเวอร์ชั่นของคอมไพเลอร์ของคุณได้ไหม? บนgcc version 4.8.1สำหรับ Windows และgcc version 5.3.0สำหรับ Cygwin มันใช้งานไม่ได้ ... (บน IdeOne Works)
Giacomo Garabello

ฉันรู้ว่าใช้งานได้กับ GCC 6.1.0 แต่อย่างน้อยควรทำงานกับ> 4.9 นอกจากนี้ยังทำงานร่วมกับเสียงดังกราว 3.8.1 คุณเห็นข้อผิดพลาดอะไร
owacoder

1

Matricks , 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

Python 2, 204 191 183 ไบต์

ตกลงการแข่งขัน Python ที่นี่เริ่มรุนแรงขึ้น นี่คือความพยายามของฉันในการโกนจำนวนไบต์ให้ได้มากที่สุด ตอนนี้ฉันติดอยู่ (โอเคติดอีกครั้ง)

เพิ่มเครดิตให้กับ @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)

ลองออนไลน์! (Ideone)

การเปลี่ยนแปลงหลักคือการเขียนเงื่อนไขใหม่

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

ลองออนไลน์! (Ideone)

การเปลี่ยนแปลงหลักคือวิธีการเลือกอักขระแบบสุ่มและการจัดเรียงโค้ดบางอย่างเช่นการs=input();i=s;เปลี่ยนs=i=input();การr=rangeกำหนดเนื่องจากไม่จำเป็นต้องใช้อีกต่อไปและการโทรabsโดยตรงเนื่องจากจะทำให้รหัสน้อยลง

เอาชนะคำตอบที่สั้นที่สุดใน Python ทีละ 1 ไบต์! @R วิธีการของ Kap ใช้สำหรับสร้างตัวอักษรแบบสุ่ม การวนซ้ำของ while แบบวนซ้ำแถวของอดีตจะถูกพิมพ์

รุ่น 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)

ลองออนไลน์! (Ideone)

Ungolfed version เพื่อรับทราบว่ามันทำงานอย่างไร:

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 ตัวสร้างตัวละครแบบสุ่มเพิ่มเพียง 1 ถ้ามันสร้างหรือดังนั้นและเป็นเรื่องธรรมดามากกว่าปกติเล็กน้อยX+Y==Size+1
yYzZ


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.