สร้างจำนวนเต็ม n n กำลังสองด้วยการหมุน * ในมุมที่สมบูรณ์


9

วัตถุประสงค์คือเพื่อสร้างเอาต์พุตของ n squares (nxn) ของจำนวนเต็มแบบสุ่ม ( 0-9) ด้วยการเคลื่อนที่*ที่หมุนตามเข็มนาฬิกาไปรอบ ๆ มุมโดยเริ่มจากด้านบนซ้าย สี่เหลี่ยมควรอยู่เคียงข้างกันและคั่นด้วยช่องว่างเดียว

ถ้าn = 0เอาต์พุตควรว่างเปล่า

เอาท์พุทสำหรับn=1:

*

เอาท์พุทสำหรับn=2:

*3 4*
14 07

เอาท์พุทสำหรับn=3:

*34 82* 291
453 224 924
145 158 57*

เอาท์พุทสำหรับn=4:

*153 135* 0154 0235
2352 5604 3602 2065
2245 6895 3561 7105
7225 5785 479* *662

สังเกตว่าการ*หมุน (รอบมุมของสี่เหลี่ยม) จากซ้ายไปขวาเป็นเช่นนี้: ซ้ายบน, ขวาบน, ขวาล่าง, ซ้ายล่าง, ซ้ายบน, ฯลฯ (ตามเข็มนาฬิกา)

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบที่สั้นที่สุด (วัดเป็นไบต์) ชนะ


5
โปรดรบกวนฉันให้เข้าใจสิ่งนี้
Rohan Jhunjhunwala

1
การลงคะแนนเพื่อเปิดใหม่ ชัดเจนสำหรับฉันอย่างสมบูรณ์ ได้ทำการแก้ไขเล็กน้อย ("เพอร์เฟ็กต์สแควร์" ฟังดูเหมือนคำพีชคณิตมากเกินไป)
เลเวลริเวอร์เซนต์

2
ตัวเลขสุ่มต้องเป็นอย่างไร? อาจเป็นคำถามที่ชัดเจนเกี่ยวกับข้อเท็จจริงที่ว่าตัวเลขนั้นต้องมีความยาว N หลักอย่างแน่นอนโดยนับว่าเครื่องหมายดอกจันเป็นตัวเลข
Jesse Amano

1
<Shrug> บางทีฉันอาจจะช้า แต่ก็ยังไม่ชัดเจนสำหรับฉัน คุณสามารถอธิบายการวาง*s ในn=4ตัวอย่างได้หรือไม่? อาจยกตัวอย่างเพิ่มเติม
Digital Trauma

2
@ DigitalTrauma ฉันไม่สามารถหาคำตอบได้จนกว่าฉันจะรู้ว่าคุณไม่ได้พิมพ์ "นาฬิกา" หนึ่งอันคุณกำลังพิมพ์nนาฬิกาแบบเรียงต่อกัน (ซึ่งไม่ชัดเจนเลยจากคำถาม) ดังนั้นในตัวอย่างn = 4 คุณจะเห็น "นาฬิกา" สี่อัน - อันแรกกับแถวบนสุดอันดับ*153ที่สองแถวบนสุด*135และอื่น ๆ
Jordan

คำตอบ:


4

05AB1E , 50 49 ไบต์

3mF9Ý.R}J¹ô¹ävy`¦'*ìN4%©>ir}®iRr}®<iR})ˆ}¯øvyðý}»

คำอธิบาย

ตัวอย่างสำหรับอินพุต = 4

ก่อนอื่นเราจะสร้างสตริงของอินพุต ^ 3 ตัวเลขสุ่มระหว่าง 0 ถึง 9

3mF9Ý.R}J

การผลิต

6799762549425893341317984133999075245812305412010122884262903656

จากนั้นเราแบ่งมันออกเป็นชิ้น ๆ ตามขนาดของอินพุต
นั่นคือแบ่งออกเป็นชิ้นส่วนเพิ่มเติม

¹ô¹ä

นี่ทำให้เรามีเมทริกซ์ของตัวเลข

[['6799', '7625', '4942', '5893'], 
 ['3413', '1798', '4133', '9990'], 
 ['7524', '5812', '3054', '1201'], 
 ['0122', '8842', '6290', '3656']]

จากนั้นเราวนรอบแถวของเมทริกซ์โดยใส่เครื่องหมายดอกจันในตำแหน่งที่ถูกต้อง

v                          } # for each row in matrix 
 y`                          # flatten list to stack
   ¦'*ì                      # replace the first digit of the last number with "*"
       N4%©>ir}              # if row-nr % 4 == 0, move the number with "*" to the front
               ®iRr}         # if row-nr % 4 == 1, move the number with "*" to the front
                             # and reverse the number, moving "*" to the numbers right side
                    ®<iR}    # if row-nr % 4 == 2, reverse the number, moving "*" 
                             # to the numbers right side
                         )ˆ  # wrap row in a list and add to global array

ตอนนี้เรามีเมทริกซ์ที่มี "*" ในแต่ละแถว แต่เราต้องการเครื่องหมายดอกจันต่อคอลัมน์

[['*893', '4942', '7625', '6799'], 
 ['099*', '4133', '1798', '3413'], 
 ['7524', '5812', '3054', '102*'], 
 ['0122', '8842', '6290', '*656']]

ดังนั้นเราจึงซิปรายการนี้เปลี่ยนแถวเป็นคอลัมน์และในทางกลับกัน

[['*893', '099*', '7524', '0122'], 
 ['4942', '4133', '5812', '8842'], 
 ['7625', '1798', '3054', '6290'], 
 ['6799', '3413', '102*', '*656']]

สิ่งที่เหลืออยู่ตอนนี้คือการจัดรูปแบบผลลัพธ์

vyðý}»

การเข้าร่วมแถวในช่องว่างและคอลัมน์ในการขึ้นบรรทัดใหม่ทำให้เราได้ผลลัพธ์สุดท้าย

*893 099* 7524 0122
4942 4133 5812 8842
7625 1798 3054 6290
6799 3413 102* *656

ลองออนไลน์!

โซลูชัน 50 ไบต์เก่า

F¹Fõ¹F9Ý.R«}}¦'*ì})¹ävyN4%©>iR}®iíÁ}®<ií}})øvyðý}»

4

Dyalog APL , 57 ไบต์

ต้องใช้⎕IO←0ซึ่งเป็นค่าเริ่มต้นในหลาย ๆ ระบบ

สมมติว่าเว้นวรรคสองได้รับอนุญาตตามตัวอย่างแรกของ OP

{A←⊃∘⍕¨?10⍴⍨3⍴⍵⋄A[(⍳⍵),¨⍵⍴2↑¨1⍵(⍵ ⍵)(1⍵)-1]←'*'⋄⍉⎕FMT A}

ลองใช้ออนไลน์!

โซลูชัน 49 ไบต์ที่ไม่เข้ากันได้ (Dyalog APL 16.0):

{⍉⎕FMT'*'@((⍳⍵),¨⍵⍴2↑¨1⍵(⍵ ⍵)(1⍵)-1)⊃∘⍕¨?10⍴⍨3⍴⍵}

3

Java 7, 372 370 366 ไบต์

String c(int i){String s="*",a[][]=new String[i][i],t,r="";int j=0,k,z=i-1,m=(int)Math.pow(10,z);for(;j<i;j++)for(k=0;k<i;a[j][k++]=(new java.util.Random().nextInt((int)Math.pow(10,i)-m+1)+m)+"");for(j=0;j<i;k=j%4,t=a[m=k<2?0:z][k],a[m][j++]=k<1|k>2?s+t.substring(1,i):t.substring(0,z)+s);for(j=0;j<i;j++,r+="\n")for(k=0;k<i;r+=a[j][k++]+" ");return i<1?"":i<2?s:r;}

อาจจะสามารถเล่นกอล์ฟได้มากขึ้นโดยการใส่เครื่องหมายดอกจันและสร้างเอาต์พุตในเวลาเดียวกันแทนที่จะเป็นทีละตัว

Ungolfed & รหัสการทดสอบ:

ลองที่นี่

class M{
  static String c(int i){
    String s = "*",
           a[][] = new String[i][i],
           t,
           r = "";
    int j = 0,
        k,
        z = i-1,
        m = (int)Math.pow(10, z);
    for(; j < i; j++){
      for(k = 0; k < i; a[j][k++] = (new java.util.Random().nextInt((int)Math.pow(10, i) - m + 1) + m)+"");
    }
    for(j = 0; j < i; k = j % 4,
                      t = a[m = k < 2 ? 0 : z][k],
                      a[m][j++] = k < 1 | k > 2
                                   ? s + t.substring(1, i)
                                   : t.substring(0, z) + s);

    for(j = 0; j < i; j++,
                      r += "\n"){
      for(k = 0; k < i; r += a[j][k++] + " ");
    }
    return i < 1
            ? ""
            : i < 2
               ? s
               : r;
  }

  public static void main(String[] a){
    for (int i = 0; i < 6; i++) {
      System.out.println(c(i));
      System.out.println();
    }
  }
}

เอาต์พุตที่เป็นไปได้:

(empty)

*

*9 4* 
92 47 


*25 55* 754 
910 197 108 
635 439 35* 


*512 407* 9646 5017 
1663 3847 9772 3149 
7796 2997 5494 1362 
7283 9720 242* *539 


*0726 7743* 52096 50958 *0726 
60322 20914 76387 92716 41579 
89994 18781 33379 84189 31777 
11781 89323 12180 51814 63536 
58411 32935 5168* *6597 43216 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.