Füllen Sie das Raster nach dem Zufallsprinzip aus


9

Gegebene positive ganze Zahl ist n < 10, schaffen eine 2 - dimensionale Matrix , wobei jede Lage mit der gefüllt ist xund yIndex (beginnend von oben links).

Beispielsweise:

Eingabe: 2

00 10
10 11

Eingabe: 3

00 10 20
01 11 21
02 12 22

Sobald das Raster erstellt ist, füllen Sie jeden Index nach dem Zufallsprinzip. Dies kann mit einem 'x' oder einer anderen Möglichkeit erfolgen, um anzuzeigen, dass ein Punkt gefüllt wurde.

Sie bestimmen, welche Stelle gefüllt werden soll, indem Sie zufällig Indizes generieren, um die Matrix zu füllen. Sie können nur n ^ 2 Mal füllen, sodass Sie nicht so oft füllen können, wie Sie möchten, bis die Matrix vollständig gefüllt ist. Am Ende muss die Matrix gefüllt sein, sodass Sie einige Arbeiten ausführen müssen, um sicherzustellen, dass Sie die Zufallszahlen überprüfen, die Sie zum Füllen verwenden, um sicherzustellen, dass die Stelle noch nicht gefüllt ist.

Nach jeder Füllung aktualisieren oder drucken, um den Fortschritt der Füllungsiterationen anzuzeigen.

Beispiel zum Füllen:

Eingabe: 2

00 10
01 11

00 wird zufällig ausgewählt:

XX 10
01 11

01 wird zufällig ausgewählt:

XX 10
XX 11

00wird zufällig ausgewählt, aber da es bereits ausgewählt wurde, wählt ein Re-Roll 10:

XX XX
XX 11

11 wird zufällig ausgewählt:

XX XX
XX XX

Drucken Sie die Zufallszahlen nicht so aus, wie ich visuell sehen sollte, welcher Index ausgewählt wurde. Damit meine ich nicht drucken " 11wird zufällig ausgewählt:". Es ist hier zur Erkundung.

Da dies Code-Golf ist, gewinnt der kürzeste Code.

Viel Spaß und viel Spaß beim Golfen!


Ich verstehe nicht, was an den Anweisungen so kompliziert ist, die sehr klar sind. "Erstellen Sie eine zweidimensionale Matrix, in der jede Position mit ihrem xy-Index gefüllt ist (beginnend oben links)" (keine druckbare Zeichenfolge). "Nach jeder Füllung aktualisieren oder drucken, um den Fortschritt der Fülliterationen anzuzeigen." muss den Fortschritt zeigen. Warum zu spezifisch sein, wenn es nur einschränkt, wie kreativ Benutzer mit ihren Lösungen sein können?
Jacksonecac

Ist n>= 10möglich (Sie müssen anfangen, über die maximale Länge Bescheid zu wissen, um dann führende Nullen richtig auszufüllen). Die Füllung für diesen Fall ist jeweils ein Index, nicht jeweils eine Ziffer, oder?
Ton Hospel

@TimmyD Ich stimme zu, dass dies mehr Zeit in der Sandbox hätte verbringen sollen, einfach weil das ist, wofür die Sandbox ist, aber für mich sind die Anweisungen ziemlich klar darüber, was erforderlich ist. Keine schlechte Herausforderung IMHO.
ElPedro

@ TonHospel Guter Punkt. Ich werde bearbeiten, um sicherzustellen, n <10
jacksonecac

1
Das sieht viel besser aus. Ich würde immer noch die Verweise auf "Der kürzeste Code gewinnt mit einem Bonus, wenn eine GUI anstelle von ASCII verwendet wurde" entfernen. Es ist immer noch undefiniert.
Morgan Thrapp

Antworten:


5

05AB1E , 29 Bytes

<ÝDâJU[X¹ä»,XÐÙg#Jþ2ô.R„  :)U

Probieren Sie es online aus!

Leerzeichen, das als Zeichen für die entfernten Zahlen ausgewählt wurde (da es gut aussieht), aber es kann durch ein beliebiges Zeichen ersetzt werden, ohne die Anzahl der Bytes zu beeinflussen.

Erläuterung

                                # implicit input n
<ÝDâ                            # cartesian product of [0..n-1] and [0..n-1]
    JU                          # join pairs and store in X
      [     XÐÙg#               # loop until there's only spaces left in X
       X¹ä                      # split X into n pieces
          »,                    # join rows by space and columns by newlines and print
                 Jþ             # join X to string and remove all non-digits
                   2ô.R         # split in pieces of 2 and pick a pair at random
                       „  :)    # replace this pair with 2 spaces
                            U   # and store in X

Es sieht fantastisch aus, aber während ich es teste, scheint es, dass es nicht jedes Quadrat ausfüllt?
Jacksonecac

@jacksonecac: Wie ich es verstanden habe, sollte ich n ^ 2 zufällig ausfüllen, mit der Möglichkeit, dass nicht alle Quadrate gefüllt werden, wenn derselbe Index mehr als einmal zufällig ausgewählt wird. Wenn das falsch ist, muss ich das später wiederholen (muss jetzt laufen)
Emigna

"Sie bestimmen, welche Stelle gefüllt werden soll, indem Sie zufällig Indizes zum Füllen der Matrix generieren. Sie können nur n ^ 2 Mal füllen, sodass Sie nicht so oft füllen können, wie Sie möchten, bis die Matrix vollständig gefüllt ist." Also muss es gefüllt werden. Ich werde in der Beschreibung mehr klarstellen.
Jacksonecac

@jacksonecac Danke für die Klarstellung. Ich habe die Antwort entsprechend aktualisiert :)
Emigna

Perfekt! Netter Job Mann!
Jacksonecac

3

Pip , 41 40 38 36 Bytes

35 Byte Code, +1 für das -SFlag.

Pm:J_MM ZCGa{ST:mmR:asX2}M$ALmSK{r}

Nimmt Eingaben vom cmdline-Argument entgegen. Wird durch Leerzeichen ersetzt (jedes andere Zeichen ist für +1 Byte möglich). Gibt aufeinanderfolgende Iterationen aus, die durch einen einzelnen Zeilenumbruch getrennt sind (was legal ist, aber das Lesen etwas erschweren kann).Probieren Sie es online aus!

Alle Arten von schmutzigen Tricks in diesem. Kürzere Version hat weniger schmutzige Tricks. : ^ (Erklärung:

Pm:J_MM ZCGa{ST:mmR:asX2}M$ALmSK{r}
                                     -S flag means nested lists are delimited first
                                       by newlines then by spaces when stringified/printed
           a                         1st cmdline arg
         CG                          Coordinate Grid, a list of lists of coord pairs
        Z                            Zip (transposes so it's x,y instead of row,col)
   J_                                Function that takes a list and joins all items
     MM                              MapMap: map this function to each sublist
                                       This joins a coord pair [1;0] into a string "10"
 Pm:                                 Assign the result to m and print it

                          $ALm       Fold m on Append List: appends all sublists of m
                                       together, making a single list of coord pairs
                              SK     Sort with the following function as key:
                                {r}  Return a random number
                                     We now have a randomly-ordered list of all the
                                       coord pairs from m

            {           }M           Map this function to that list:
             ST:m                    Convert m to string in-place
                 mR:                 Replace (in-place)...
                    a                  the argument (a coord pair)...
                     sX2               ... with two spaces
                                     The map operation returns a list of strings, one for
                                       each step of the process, which are autoprinted
                                       (separated by newlines)

Gute Arbeit! Das funktioniert perfekt
jacksonecac

Eigentlich n>=10funktioniert die Randomisierung nicht richtig, aber sie trifft immer noch den Auftrag. Bei Zahlen größer als 10 wird nur wo entfernt index_i==index_j. Irgendeine Idee hinter dem Grund, warum das so wäre?
Magic Octopus Urn

1
@carusocomputing Nicht ganz sicher, aber es hängt wahrscheinlich damit zusammen, wie die Indizes im (mi@##Pmi@0)Teil ausgewählt werden. Ich habe mehrere byte-reduzierende Hacks eingefügt, die davon abhängen, dass die Indizes einstellig sind.
DLosc

##, verstanden. Gute Verwendung von Annahmen. Danke für die Erklärung haha.
Magic Octopus Urn

1

Groovy (202 Bytes)

{a->b=new String[a][a];while(b.flatten().flatten().contains(null)){b[(int)(Math.random()*a)][(int)(Math.random()*a)]="XX";b.eachWithIndex{e,i->e.eachWithIndex{f,j->print f?"XX ":"${i}${j} "}println()}}}

Dieses spezielle Ausgabeformat hat meine Byteanzahl wirklich durcheinander gebracht, aber meh.
Versuch es: https://groovyconsole.appspot.com/edit/5171951567896576 (+9 Byte für einen schöneren Druck)

Ungolfed:

y={a->
    b=new String[a][a];
    while(b.flatten().flatten().contains(null)) {
        b[(int)(Math.random()*a)][(int)(Math.random()*a)]="XX";
        b.eachWithIndex{
            e,i->
            e.eachWithIndex{
                f,j->
                print f ? "XX ": "${i}${j} " 
            }
            println()
        }
    }
}
y(4)​

Ausgabebeispiel:

00 01 02 XX 
10 11 12 13 
20 21 22 23 
30 31 32 33 
00 01 02 XX 
XX 11 12 13 
20 21 22 23 
30 31 32 33 
XX 01 02 XX 
XX 11 12 13 
20 21 22 23 
30 31 32 33 
XX 01 XX XX 
XX 11 12 13 
20 21 22 23 
30 31 32 33 
XX 01 XX XX 
XX 11 12 XX 
20 21 22 23 
30 31 32 33 
XX 01 XX XX 
XX 11 12 XX 
XX 21 22 23 
30 31 32 33 
XX 01 XX XX 
XX 11 XX XX 
XX 21 22 23 
30 31 32 33 
XX 01 XX XX 
XX XX XX XX 
XX 21 22 23 
30 31 32 33 
XX XX XX XX 
XX XX XX XX 
XX 21 22 23 
30 31 32 33 
XX XX XX XX 
XX XX XX XX 
XX 21 22 23 
30 31 32 33 
XX XX XX XX 
XX XX XX XX 
XX 21 22 23 
XX 31 32 33 
XX XX XX XX 
XX XX XX XX 
XX 21 22 23 
XX 31 32 33 
XX XX XX XX 
XX XX XX XX 
XX 21 22 23 
XX 31 32 33 
XX XX XX XX 
XX XX XX XX 
XX 21 22 23 
XX 31 32 33 
XX XX XX XX 
XX XX XX XX 
XX 21 22 23 
XX 31 32 33 
XX XX XX XX 
XX XX XX XX 
XX 21 22 23 
XX 31 32 33 
XX XX XX XX 
XX XX XX XX 
XX 21 22 23 
XX 31 32 33 
XX XX XX XX 
XX XX XX XX 
XX 21 22 23 
XX 31 32 33 
XX XX XX XX 
XX XX XX XX 
XX 21 22 XX 
XX 31 32 33 
XX XX XX XX 
XX XX XX XX 
XX 21 22 XX 
XX 31 32 33 
XX XX XX XX 
XX XX XX XX 
XX 21 22 XX 
XX 31 32 33 
XX XX XX XX 
XX XX XX XX 
XX 21 22 XX 
XX 31 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX 31 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX 31 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX 31 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX 31 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX 31 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX 31 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX 31 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX 31 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX 31 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX 31 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX 31 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX 32 XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX XX XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX XX XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX XX XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX XX XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX XX XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX XX XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX XX XX 
XX XX XX XX 
XX XX XX XX 
XX XX 22 XX 
XX XX XX XX 
XX XX XX XX 
XX XX XX XX 
XX XX XX XX 
XX XX XX XX 

Die Matrix sollte NxN sein, also ein perfektes Quadrat.
Jacksonecac

@jacksonecac Es ist ein 0-indiziertes 4x4Quadrat. Das Quadrat selbst ist nur durch Zeilenumbrüche getrennt, und jede Iteration ist durch Zeilenumbrüche getrennt, sodass die Ausgabe irgendwie zusammen läuft.
AdmBorkBork

Wenn Sie Trennzeichen zwischen den Iterationen wünschen, geben Sie diese im Brief an.
Magic Octopus Urn

Hier versuchen Sie es mit der neuen Zeile, die zwischen den Iterationen hinzugefügt wurde: groovyconsole.appspot.com/edit/5171951567896576
Magic Octopus Urn

Ich entschuldige mich, dass ich zu Schlussfolgerungen gesprungen bin. Lassen Sie mich das analysieren: D
jacksonecac

1

R, 84 81 74 Bytes

Verwendet jetzt eine Indizierung anstelle einer Nullindizierung. Dank @Billywob wurden 7 Bytes entfernt.

N=scan()
m=outer(1:N,1:N,paste0)
for(i in sample(N^2)){m[i]="XX";print(m)}

Beispielausgabe für N = 3

     [,1] [,2] [,3]
[1,] "11" "12" "XX"
[2,] "21" "22" "23"
[3,] "31" "32" "33"
     [,1] [,2] [,3]
[1,] "11" "12" "XX"
[2,] "21" "22" "23"
[3,] "31" "XX" "33"
     [,1] [,2] [,3]
[1,] "11" "12" "XX"
[2,] "XX" "22" "23"
[3,] "31" "XX" "33"
     [,1] [,2] [,3]
[1,] "11" "XX" "XX"
[2,] "XX" "22" "23"
[3,] "31" "XX" "33"
     [,1] [,2] [,3]
[1,] "XX" "XX" "XX"
[2,] "XX" "22" "23"
[3,] "31" "XX" "33"
     [,1] [,2] [,3]
[1,] "XX" "XX" "XX"
[2,] "XX" "22" "23"
[3,] "XX" "XX" "33"
     [,1] [,2] [,3]
[1,] "XX" "XX" "XX"
[2,] "XX" "XX" "23"
[3,] "XX" "XX" "33"
     [,1] [,2] [,3]
[1,] "XX" "XX" "XX"
[2,] "XX" "XX" "XX"
[3,] "XX" "XX" "33"
     [,1] [,2] [,3]
[1,] "XX" "XX" "XX"
[2,] "XX" "XX" "XX"
[3,] "XX" "XX" "XX"

Gute Arbeit! Tue es. Speichern Sie diese Bytes!
Jacksonecac

Sie können ein paar Bytes durch direkte Substitution speichern, anstatt replace:for(i in sample(N^2)){m[i]="XX";print(m)}
Billywob

@ Billywob Danke, ich habe den Code bearbeitet, um Ihren Vorschlag aufzunehmen. Großer Fang!
Rturnbull

0

AWK, 229 Bytes

func p(a){for(k=1;k<=m;k++){if(k==a)gsub("[0-9]","X",M[k])
printf"%s",M[k]}}{n=$1;m=n*n
k=1
for(i=0;i<n;i++)for(j=0;j<n;j++){s=k%n==0?k==m?"\n\n":"\n":" "
M[k++]=i j s}p()
for(;z<m;z++){do{y=int(rand()*m+1)}while(M[y]~"X")p(y)}}

Ich habe ein paar Bytes hinzugefügt, um der Ausgabe einen Abstand zwischen den einzelnen Matrizen zu geben.

Hinweis: Um es zwischen den Läufen zufälliger zu machen, kann ein Aufruf von srand()für 7 zusätzliche Bytes hinzugefügt werden.

Verwendung und Ausgabe nach dem Speichern des obigen Codes in FILE:

    awk -f FILE <<< 2

00 01
10 11

XX 01
10 11

XX XX
10 11

XX XX
10 XX

XX XX
XX XX

0

PHP, 172 Bytes

for(;$x<$s=($a=$argv[1])*$a;)$r[]=$x%$a.($x++/$a^0);echo($c=chunk_split)(join(" ",$r),$a*3);for(;$q<$s;){if($r[$z=rand(0,$s-1)]<X)++$q&$r[$z]=XX;echo$c(join(" ",$r),$a*3);}

Nervenzusammenbruch

for(;$x<$s=($a=$argv[1])*$a;)$r[]=$x%$a.($x++/$a^0); #make the array
echo($c=chunk_split)(join(" ",$r),$a*3); # Output array
for(;$q<$s;)
{
  if($r[$z=rand(0,$s-1)]<X)++$q&$r[$z]=XX; #fill position if it is not XX and raise increment
  echo$c(join(" ",$r),$a*3); #Output array
}

0

Python 2, 190 Bytes

from random import *
R=range(input())
G=[(x,y)for x in R for y in R]
def f():print"\n".join(" ".join(["XX","%d%d"%(x,y)][(x,y) in G]for x in R)for y in R)
f()
while G:G.remove(choice(G));f()
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.