Виконайте гравітаційне сортування


29

Виклик

Давши список цілих чисел, покажіть, як буде здійснюватися сортування гравітації.

Гравітаційний сорт

У гравітаційному сортуванні уявіть числа як рядки зірочок. Тоді все падає, і нові ряди будуть явно відсортовані. Розглянемо приклад:

[2, 7, 4, 6]:

**
*******
****
******
-------
**
****
*******
******
-------
**      | 2
****    | 4
******  | 6
******* | 7

Зауважте, що це майже просто паралельний сорт міхура.

Точні характеристики

На кожній ітерації, починаючи з верхнього ряду, візьміть кожну зірочку з рядка, у якого немає зірочки під ним, і перемістіть її вниз по рядку. Продовжуйте робити це, поки список не буде відсортований.

Вхідні дані

Введенням буде список суворопозитивних цілих чисел.

Вихід

Для виходу необхідно виводити кожен крок. Ви можете вибрати будь-які два символи ASCII, що друкуються без пробілів, один - "зірочки", а один - "тире". Рядки зірочок повинні бути відокремлені стандартним новим рядком якогось типу (наприклад, \nабо \r\f). Ряд тирею повинен бути не менше ширини самого широкого ряду (інакше зірочки зійдуть занадто далеко вниз!). Ряд тире в самому низу необов’язковий. У кінці дозволено новий рядок. Додаткові пробіли в кожному рядку дозволені.

Випробування

Вхід буде представлений у вигляді списку, тоді вихід буде вказано безпосередньо нижче. Тестові приклади розділені подвійним новим рядком.

[4, 3, 2, 1]
****
***
**
*
----
***
** *
* *
**
----
**
* *
** *
***
----
*
**
***
****

[6, 4, 2, 5, 3, 1]
******
****
**
*****
***
*
------
****
**  **
****
***
*  **
***
------
**
****
*** **
*  *
***
*****
------
**
***
*  *
*** **
****
*****
------
**
*
***
****
******
*****
------
*
**
***
****
*****
******

[8, 4, 2, 1]
********
****
**
*
--------
****
**  ****
* **
**
--------
**
* **
**  ****
****
--------
*
**
****
********

Будь ласка, не соромтесь виправляти мої тестові справи, якщо вони помиляються, я зробив їх вручну :)

Примітка: Не виводити відсортований список наприкінці. :)

Оцінка балів

Усі ваші програми будуть написані один на одного. Ви не хочете, щоб шматки вашої програми падали, тому переконайтеся, що у вас найкоротший код!


1
Чи можемо ми уникнути друкування тире? і замість того, щоб друкувати зірочки, ми можемо надрукувати матрицю 0s та 1s? Я думаю, що формат друку не додає нічого складного.
rahnema1

@ rahnema1 1. Ви можете замінити тире на якийсь інший символ, який не є пробілом. Ні.
HyperNeutrino

Я вважаю, вам не вистачає зірочки на 2-й ітерації останнього тестового випадку
MildlyMilquetoast,

1
Якщо ми не хочемо, щоб шматки програми падали вниз, чи означає це, що ми не можемо мати довші рядки коду на вершині наших коротших рядків коду? : o
Чорнило вартості

1
Гей, так я сортую свої книги!
Роберт Фрейзер

Відповіді:



4

Perl 5 , 118 байт

115 байт коду + -plaпрапори.

\@X[$_]for@F;s%\d+ ?%Y x$&.$"x($#X-$&).$/%ge;while(/Y.{$#X} /s){print$_,_ x$#X;1while s/Y(.{$#X}) /X$1b/s;y/bX/Y /}

Спробуйте в Інтернеті!

Здається, це занадто довго. Але знову ж таки, впоратися з багаторядковими рядками з регулярним виразом зазвичай непросто.

Я використовую Yзамість *і _замість -.


3

Октава, 104 байти

b=(1:max(L=input("")))<=L;do;disp(" *-"([b;max(b)+1]+1))until b==(b=imerode(b,k=[1;1])|imdilate(b,k)~=b)

* Потрібен пакет зображень.

Спробуйте в Інтернеті!

Пояснення:

input = [8 ;4 ;2 ;1]

L = input('');                    %input list
b=(1:max(L))<=L;                  % generate matrix of 0s and 1s as indexes of asterisks 

b =

  1  1  1  1  1  1  1  1
  1  1  1  1  0  0  0  0
  1  1  0  0  0  0  0  0
  1  0  0  0  0  0  0  0
do;
    disp(' *-'([b;max(b)+1]+1))  %display asterisks and dashes

    E = imerode(b,k=[1;1]);      %morphological erosion
    E =

      1  1  1  1  0  0  0  0
      1  1  0  0  0  0  0  0
      1  0  0  0  0  0  0  0
      1  0  0  0  0  0  0  0

    D = imdilate(b,k);           %morphological dilation
    D =

      1  1  1  1  1  1  1  1
      1  1  1  1  1  1  1  1
      1  1  1  1  0  0  0  0
      1  1  0  0  0  0  0  0

    b_temp = E | (D~=b)          %intermediate result
    b_temp =

      1  1  1  1  0  0  0  0
      1  1  0  0  1  1  1  1
      1  0  1  1  0  0  0  0
      1  1  0  0  0  0  0  0

until b==(b=b_temp)              %loop until no change

на жаль, напевно, немає бонусних балів за кадр за кадром: |
quetzalcoatl

зараз - мої вибачення, коментар відкликаний
TessellatingHeckler

3

Пітон, 203 199 байт

def k(x):
 m,j=max(x),''.join;d=[*map(lambda i:('*'*i).ljust(m),x)];f=sorted(d);print(*d,sep='\n')
 while d!=f:d=[*map(j,zip(*[x.replace('* ',' *')for x in map(j,zip(*d))]))];print('-'*m,*d,sep='\n')

1
Де тире?
Leaky Nun

@LeakyNun виправлено
Уріель

Подумайте про використання Python 2 замість вашого поточного Python 3, де mapповертає масив негайно, так що вам не потрібно його заплітати. Ви хочете призначити змінну, яка '\n'.joinдопоможе вам компенсувати відсутність sep='\n', але це, мабуть, ще коротше.
Значення чорнила

@ValueInk як би ти пішов про блискавки? відсутність розпакування може коштувати багато байтів
Уріель

Python 2 дозволяє просто розпакувати функцію; Я чув лише, що розпакування в масив іноді має проблеми. Отримавши лише запропоновані зміни, код Python 2 становить 194 байти, спробуйте його онлайн
Value Ink

2

Japt , 69 62 байт

-7 байт завдяки @Shaggy


®ç'x +SpZnUrwÃpQpUrw¹·
V
l o ®V=z d" x""x " z3ÃuW
X¯XbXgJ)Ä ·

Навчаючись Japt і хотів спробувати складніший виклик. Виходи з xs і "s замість зірочок і тире; приймає введення як масив чисел. Передбачає, що сортування буде завершено протягом input.lengthкроків; поправте мене, якщо це колись не так.

Спробуйте в Інтернеті!

Пояснення

                              // implicit: U = input array
 ®   ç'x +SpZnUrwà pQpUrw¹ ·  // implicit: V = this line
UmZ{Zç'x +SpZnUrw} pQpUrw) qR // ungolfed
UmZ{             }            // U mapped by the function:
    Zç'x                      //   "x" times this item
         +SpZnUrw             //   plus " " times the max of the input array (Urw) minus this value (Z)
                   pQpUrw)    // push " (Q) times the max
                           qR // join with newlines

V                             // implicit: W = this line

 l o ®   V=z d" x""x " z3Ã uW // implicit: X = this line
Ul o mZ{ZV=z d" x""x " z3} uW // ungolfed
Ul o                          // the array of the range [0, U.length)
     mZ{Z                }    // mapped by the no-arg function:
         V=z                  //   set V to itself rotated 90deg
             d" x""x "        //   replace all " x" with "x " to "fall"
                       z3     // rotate back to normal
                           uW // add  W(the original) to the start

X¯XbXgJ)Ä ·                   // implicit: return this line
Xs0,XbXgJ)+1 qR               // ungolfed
Xs0,                          // get the substring of X from 0 to...
    XbXgJ)+1                  // the first index of the last item, plus one
             qR               // join with newlines

1
Кілька швидких заощаджень для вас . Я впевнений, що їх більше, але я дуже втомився.
Кудлатий

@Shaggy Спасибі велике! Це дійсно хороший приклад встановлення змінних відповідно до рядка, на якому йдеться. Якщо цього немає на посаді Japt tips, так і повинно бути.
Джастін Марінер

Зроблено . Залиште коментар, якщо ви бачите будь-яке місце для вдосконалення.
Кудлатий

@Shaggy Виглядає добре і вітаю з вашим золотим значком!
Джастін Марінер

2

R , 210 205 байт

l=scan();w=max(l);h=sum(l|1);a=1:h;p=h+1;m=matrix(' ',w,p);m[,p]='+';for(x in a)m[l[x]:1,x]='*';f=function()write(m,'',w,sep='');f();while(any(i<-m[,a]>m[,a+1])){s=which(i);m[,a][s]=' ';m[,a][s+w]='*';f()}

Спробуйте в Інтернеті!

читає в списку з stdin; розділені +символами замість -. Це набагато довше, ніж я б міг подумати. Користується тим, що порівняння '*'>'+'оцінює, FALSEале '*'>' 'є TRUE, принаймні, на TIO (на моїй машині я використовував, '='що виглядав трохи краще).

Вдалося пограти в гольф на 5 байт від усіх методик, яких я навчився після написання оригінальної відповіді.

Спробуйте в Інтернеті!



1

Javascript, 274 байт

a=>(r="",m=Math.max(...a),b=a.map(n=>Array(m).fill(0).map((_,i)=>i<n)),(k=_=>(b.map(c=>r+=c.map(v=>v?"*":" ").join``.trim()+`
`),r+="-".repeat(m)+`
`,n=0,b.map((r,i)=>(s=b[i+1])&&r.map((c,j)=>s[j]||(n|=s[j]=-(c>0),c>0&&(r[j]=0)))),b=b.map(c=>c.map(n=>n<0?1:n)),n&&k()))(),r)

Приклад фрагмента коду:

f =

a=>(r="",m=Math.max(...a),b=a.map(n=>Array(m).fill(0).map((_,i)=>i<n)),(k=_=>(b.map(c=>r+=c.map(v=>v?"*":" ").join``.trim()+`
`),r+="-".repeat(m)+`
`,n=0,b.map((r,i)=>(s=b[i+1])&&r.map((c,j)=>s[j]||(n|=s[j]=-(c>0),c>0&&(r[j]=0)))),b=b.map(c=>c.map(n=>n<0?1:n)),n&&k()))(),r)

o.innerText = f([6,4,2,5,3,1])
<pre id=o>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.