Wypełnij siatkę losowo

9

Biorąc pod uwagę dodatnią liczbę całkowitą n < 10, utwórz 2-wymiarową matrycę, w której każda lokalizacja jest wypełniona jego xi yindeksem (zaczynając od lewego górnego rogu).

Na przykład:

Wejście: 2

00 10
10 11

Wejście: 3

00 10 20
01 11 21
02 12 22

Po utworzeniu siatki losowo wypełnij każdy indeks. Może to być znak „x” lub dowolny inny sposób oznaczenia, że ​​miejsce zostało wypełnione.

Określasz, którą lokalizację wypełnić, losowo generując wskaźniki wypełniające macierz. Możesz wypełnić tylko n ^ 2 razy, więc nie możesz wypełnić tyle razy, ile chcesz, dopóki matryca nie zostanie całkowicie wypełniona. Na koniec macierz musi zostać wypełniona, więc musisz wykonać pewną pracę, aby upewnić się, że sprawdziłeś liczby losowe, których używasz do wypełnienia, aby upewnić się, że miejsce nie jest już wypełnione.

Odśwież lub wydrukuj po każdym wypełnieniu, aby pokazać postęp iteracji napełniania.

Przykład wypełnienia:

Wejście: 2

00 10
01 11

00 jest wybierany losowo:

XX 10
01 11

01 jest wybierany losowo:

XX 10
XX 11

00jest wybierany losowo, ale ponieważ został już wybrany, przerzut wybiera 10:

XX XX
XX 11

11 jest wybierany losowo:

XX XX
XX XX

Nie drukuj liczb losowych, ponieważ wizualnie powinienem być w stanie zobaczyć, który indeks został wybrany. Rozumiem przez to, że nie drukuj „ 11jest losowo wybierany:”. Jest tu dla dobra eksploracji.

Ponieważ jest to kod-golf Najkrótszy kod wygrywa.

Miłej zabawy i szczęśliwego golfa!

jacksonecac
źródło
Nie rozumiem, co jest tak skomplikowanego w instrukcjach, które są bardzo jasne. „utwórz 2-wymiarową matrycę, w której każda lokalizacja jest wypełniona indeksem xy (zaczynając od lewego górnego rogu)” (Nie ciąg znaków do wydrukowania). „Odśwież lub wydrukuj po każdym wypełnieniu, aby pokazać postęp iteracji wypełniania”. musi pokazywać postęp. Po co przesadnie sprecyzować, kiedy zawęża to tylko kreatywność użytkowników dzięki ich rozwiązaniom?
jacksonecac 11.10.16
Jest n>= 10możliwe (musisz zacząć wiedzieć o maksymalnej długości, aby poprawnie wypełnić początkowe 0). Wypełnienie tego przypadku to jeden indeks na raz, a nie 1 cyfra na raz, prawda?
Ton Hospel,
@ TimmyD Zgadzam się, że powinien był spędzić więcej czasu w piaskownicy, ponieważ właśnie do tego jest piaskownica, ale dla mnie instrukcje są dość jasne na temat tego, co jest wymagane. Niezłe wyzwanie IMHO.
ElPedro,
@TonHospel Dobra uwaga. Będę edytować, aby upewnić się, że n <10
jacksonecac
1
To wygląda o wiele lepiej. Nadal wyciągałbym odniesienia do „Najkrótszy kod wygrywa z premią, jeśli zamiast ASCII użyto GUI”. Nadal nie jest zdefiniowane.
Morgan Thrapp,

Odpowiedzi:

5

05AB1E , 29 bajtów

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

Wypróbuj online!

Miejsce wybrane jako znak dla usuniętych liczb (jak ładnie wygląda), ale można je zastąpić dowolnym znakiem bez wpływu na liczbę bajtów.

Wyjaśnienie

                                # 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
Emigna
źródło
Wygląda niesamowicie, ale kiedy go testuję, wydaje się, że nie wypełnia każdego kwadratu?
jacksonecac 12.10.16
@jacksonecac: Tak jak to rozumiem, powinienem wypełnić losowo n ^ 2 razy, z możliwością nie wypełnienia wszystkich kwadratów, jeśli ten sam indeks zostanie wybrany losowo więcej niż jeden raz. Jeśli to źle, będę musiał to później przerobić (teraz muszę biec)
Emigna,
„Określasz lokalizację do wypełnienia, losowo generując wskaźniki wypełniające macierz. Możesz wypełnić tylko n ^ 2 razy, więc nie możesz wypełnić tyle razy, ile chcesz, dopóki matryca nie zostanie całkowicie wypełniona”. Więc to musi być wypełnione. Wyjaśnię więcej w opisie.
jacksonecac 12.10.16
@jacksonecac Dziękujemy za wyjaśnienie. Odpowiednio zaktualizowałem odpowiedź :)
Emigna,
Doskonały! Niezły robotnik!
jacksonecac
3

Pip , 41 40 38 36 bajtów

35 bajtów kodu, +1 dla -Sflagi.

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

Pobiera dane wejściowe z argumentu cmdline. Zastępuje się spacją (każdy inny znak jest możliwy dla +1 bajtu). Wyprowadza kolejne iteracje oddzielone pojedynczym znakiem nowej linii (co jest zgodne z prawem, ale może utrudnić czytanie). Wypróbuj online!

Wszystkie rodzaje brudnych sztuczek w tym. Krótsza wersja ma mniej brudnych sztuczek. : ^ (Objaśnienie:

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)
DLosc
źródło
Dobra robota! To działa idealnie
jacksonecac
W rzeczywistości, ponieważ n>=10randomizacja nie działa poprawnie, ale nadal trafia w sedno. W przypadku liczb większych niż 10 usuwa tylko gdzie index_i==index_j. Masz jakiś pomysł, dlaczego tak jest?
Magic Octopus Urn
1
@carusocomputing Nie do końca pewny, ale prawdopodobnie ma to związek z tym, jak wskaźniki są wybrane w (mi@##Pmi@0)części. Wprowadziłem kilka hacków redukujących bajty, które zależą od tego, że indeksy są jednocyfrowe.
DLosc
##, Rozumiem. Ładne wykorzystanie założeń. Dzięki za wyjaśnienie, haha.
Magic Octopus Urn
1

Groovy (202 bajtów)

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

Ten konkretny format wyjściowy pomieszał moją liczbę bajtów, ale meh.
Wypróbuj: https://groovyconsole.appspot.com/edit/5171951567896576 (+9 bajtów dla ładniejszego wydruku)

Nie golfowany:

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

Przykład wyjścia:

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 
Urna Magicznej Ośmiornicy
źródło
matryca powinna być NxN, więc idealny kwadrat.
jacksonecac
@jacksonecac To jest 4x4kwadrat o indeksie 0 . Sam kwadrat jest po prostu oddzielony znakiem nowej linii, a także każda iteracja jest oddzielona znakiem nowej linii, więc dane wyjściowe działają razem.
AdmBorkBork,
Jeśli chcesz, aby separatory występowały między iteracjami, określ je w skrócie.
Magic Octopus Urn
Tutaj spróbuj z nową
Magic Octopus Urn
Przepraszam, że doszedłem do wniosków. Pozwólcie mi to przeanalizować: D
jacksonecac
1

R, 84 81 74 bajty

Teraz używa jednego indeksowania zamiast zerowania. Pozbyłem się 7 bajtów dzięki @Billywob.

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

Przykładowe dane wyjściowe dla 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"
rturnbull
źródło
Dobra robota! Idź po to. Zapisz te bajty!
jacksonecac
Możesz zapisać kilka bajtów, stosując bezpośrednie podstawienie zamiast replace:for(i in sample(N^2)){m[i]="XX";print(m)}
Billywob
@Billywob Dzięki, edytowałem kod, aby uwzględnić Twoją sugestię. Ładny chwyt!
rturnbull
0

AWK, 229 bajtów

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

Dodałem kilka bajtów, aby nadać wyjściu spację między każdą matrycą.

Uwaga: aby uczynić go bardziej „losowym” między biegami, można dodać wywołanie do srand()7 dodatkowych bajtów.

Wykorzystanie i dane wyjściowe po zapisaniu powyższego kodu w 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
Robert Benson
źródło
0

PHP, 172 bajtów

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

Awaria

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
}
Jörg Hülsermann
źródło
0

Python 2, 190 bajtów

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()
Karl Napf
źródło