Заполните сетку случайно

9

Учитывая положительное целое число n < 10, создайте 2-мерную матрицу, где каждое местоположение заполнено своим xи yиндексом (начиная с верхнего левого угла).

Например:

Вход: 2

00 10
10 11

Вход: 3

00 10 20
01 11 21
02 12 22

Как только сетка будет создана, случайным образом заполните каждый индекс. Это может быть с «х» или любым другим способом обозначить место было заполнено.

Вы определяете, какое место заполнить, путем случайного создания индексов для заполнения матрицы. Вы можете заполнить только n ^ 2 раза, поэтому вы не можете заполнить столько раз, сколько хотите, пока матрица не будет полностью заполнена. В конце матрица должна быть заполнена, поэтому вы должны выполнить некоторую работу, чтобы убедиться, что вы проверяете случайные числа, которые вы используете для заполнения, чтобы убедиться, что место еще не заполнено.

Обновите или напечатайте после каждого заполнения, чтобы показать ход выполнения итераций заполнения.

Пример для заполнения:

Вход: 2

00 10
01 11

00 случайно выбран:

XX 10
01 11

01 случайно выбран:

XX 10
XX 11

00выбирается случайным образом, но так как он уже выбран, повторный бросок выбирает 10:

XX XX
XX 11

11 случайно выбран:

XX XX
XX XX

Не распечатывайте случайные числа, так как визуально я смогу увидеть, какой индекс был выбран. Под этим я подразумеваю не печатать " 11случайно выбранный". Это здесь для исследовательской цели.

Так как это код-гольф, выигрывает самый короткий код.

Веселитесь и радуйтесь игре в гольф!

jacksonecac
источник
Я не понимаю, что такого сложного в инструкциях, которые очень понятны. msgstr "создать 2-мерную матрицу, где каждое местоположение заполнено индексом xy (начиная с верхнего левого угла)" (не для печати строки). Msgstr "Обновить или напечатать после каждого заполнения, чтобы показать прогресс итераций заполнения." должен показать прогрессию. Зачем быть слишком конкретным, когда это просто сужает, насколько творческими пользователями могут быть их решения?
Jacksonecac
n>= 10Возможно ли ? (Вы должны начать знать о максимальной длине, чтобы правильно заполнить первые 0). Заполнением для этого случая является один индекс за раз, а не 1 цифра за раз, верно?
Тон Хоспел
@TimmyD Я согласен, что это должно было бы провести больше времени в Песочнице просто потому, что это то, для чего песочница, но для меня инструкции довольно ясно о том, что требуется. Неплохой вызов ИМХО.
ElPedro
@TonHospel Хороший вопрос. Я буду редактировать, чтобы обеспечить n <10
jacksonecac
1
Это выглядит намного лучше. Я бы все равно убрал ссылки на «Самый короткий код выигрывает с бонусом, если вместо ASCII был использован какой-то графический интерфейс». Это все еще не определено.
Морган Трепп

Ответы:

5

05AB1E , 29 байт

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

Попробуйте онлайн!

В качестве символа для удаленных чисел выбрано пространство (как это выглядит красиво), но его можно заменить любым символом, не влияя на количество байтов.

объяснение

                                # 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
источник
Это выглядит потрясающе, но, как я проверяю, кажется, что он не заполняет каждый квадрат?
Jacksonecac
@jacksonecac: Как я понял, я должен заполнить случайным образом n ^ 2 раза, с возможностью заполнения не всех квадратов, если один и тот же индекс выбирается случайным образом более одного раза. Если это не так, мне придется повторить это позже (придется бежать сейчас)
Emigna
«Вы определяете, какое место для заполнения, путем случайного генерирования индексов для заполнения матрицы. Вы можете заполнить только n ^ 2 раза, поэтому вы не можете заполнить столько раз, сколько хотите, пока матрица не будет полностью заполнена». Так что это должно быть заполнено. Я уточню больше в описании.
Jacksonecac
@jacksonecac Спасибо за разъяснения. Я обновил ответ соответственно :)
Emigna
Отлично! Хорошая работа, человек!
Jacksonecac
3

Пип , 41 40 38 36 байт

35 байт кода, +1 за -Sфлаг.

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

Принимает входные данные из аргумента cmdline. Заменяет пробел (любой другой символ возможен за +1 байт). Выводит последовательные итерации, разделенные одной новой строкой (что допустимо, но может усложнить чтение). Попробуйте онлайн!

Все виды подвохов в этом. Укороченная версия имеет меньше грязных трюков. : ^ (Объяснение:

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
источник
Хорошая работа! Это работает отлично
Jacksonecac
На самом деле, для n>=10рандомизации не работает правильно, но это все еще бьет по сути. Для чисел больше 10 он только удаляет где index_i==index_j. Есть какая-нибудь идея, почему это так?
Волшебная Урна Осьминога
1
@carusocomputing Не совсем уверен, но это, вероятно, связано с тем, как индексы выбираются в (mi@##Pmi@0)части. Я добавил несколько хаков, уменьшающих байты, которые зависят от того, являются ли индексы однозначными.
DLosc
##, понял. Хорошее использование предположений. Спасибо за объяснение, ха-ха.
Волшебная Урна Осьминога
1

Groovy (202 байта)

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

Этот конкретный выходной формат действительно испортил мой счетчик байтов, но не так.
Попробуйте: https://groovyconsole.appspot.com/edit/5171951567896576 (+9 байт для более красивой печати)

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

Пример вывода:

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 
Урна волшебного осьминога
источник
матрица должна быть NxN, поэтому идеальный квадрат.
Jacksonecac
@jacksonecac Это 4x4квадрат с 0 индексами . Сам квадрат просто разделен символом новой строки, а каждая итерация разделена символом новой строки, поэтому выходные данные вроде бы выполняются вместе.
AdmBorkBork
Если вы хотите разделить между итерациями, укажите это в краткой.
Волшебная Урна Осьминога
Вот, попробуйте это с новой строкой,
Волшебная урна осьминога
Прошу прощения, я спешил с выводами. Позвольте мне разобрать это: D
jacksonecac
1

R, 84 81 74 байта

Теперь используется одноиндексирование, а не нулевое индексирование. Избавился от 7 байтов благодаря @Billywob.

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

Пример вывода для 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
источник
Хорошая работа! Действуй. Сохраните эти байты!
Jacksonecac
Вы можете сохранить несколько байтов, используя прямую замену вместо replace:for(i in sample(N^2)){m[i]="XX";print(m)}
Billywob
@Billywob Спасибо, я отредактировал код, чтобы включить ваше предложение. Отличный улов!
rturnbull
0

AWK, 229 байт

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

Я добавил несколько байтов, чтобы дать выводу пробел между каждой матрицей.

Примечание: чтобы сделать его более «случайным» между запусками, можно добавить вызов srand()для 7 дополнительных байтов.

Использование и вывод после сохранения вышеуказанного кода в 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 байта

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

Сломать

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 байт

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()
Карл Напф
источник