Імітувати обертову дошку


14

Вступ

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

Так це

O <- inserting this coin

OO O
OOOOO

стане цим

O
OO O
OOOOO

А тепер уявіть, що хтось обертає дошку за годинниковою стрілкою. Відбудеться наступне:

1. Дошка обертається

OOO
OO
O
OO
O

2. Монети падають внаслідок гравітації

O
O
OO
OO
OOO

Ваше завдання

Ваше завдання - імітувати обертання дошки, написавши програму чи функцію. Для простоти ми маємо справу лише з одним видом монети (це не надто захоплююча гра, що відповідає, чи не так ...). Можна припустити, що гравітація застосовується лише після завершення обертання. Дошка обертається за годинниковою стрілкою.

Вхідні дані

Вхід буде рядком, який містить 3 типи символів:

  • O (капітал o) АБО 0 (нуль) - монета (ви вирішите, яку саме підтримку має ваше рішення)
  • (пробіл) - порожнє поле
  • \ n (новий рядок) - кінець рядка

Вхід відображає стан дошки. Ви можете припустити, що вхід добре сформований і містить дійсний стан плати (жодні монети не плавають). Вхід може бути функціональним параметром, або зчитуватися зі стандартного вводу або з файлу.

Вихідні дані

Вихід - це новий стан плати після обертання. Вихід містить такі ж 3 типи символів, що і вхід. Вихід можна повернути з вашої функції або записати на стандартний висновок або у файл.

Зразок

Введення1:

O
OO O
OOOOO

Вихід1:

O
O
OO
OO
OOO

Введення2:

O O
O O

Вихід2:

OO
OO

Ви можете використовувати будь-яку мову та стандартну бібліотеку обраної мови. Виграє найкоротша програма в байтах.


Чи коротші лінії оббиті проміжками?
Вентеро

Якщо вам потрібно, то так.
Девід Френк

Які вимоги до розміру дошки? Чи можу я вибрати розумний максимальний розмір, або чи потрібно додатку / функції працювати для всіх можливих розмірів?
Форс

2
Якщо гравітація застосовується після обертання, як Input2 стає Output2? Я міг би подумати, що це скине верхню монету вниз, але не горизонтально?
Метт,

2
@Matt Зауважимо, що в Input2 або Output2 немає порожніх рядків (SE відображає поле між рядками).
Девід Френк

Відповіді:


16

GolfScript, 14 12 символів

' '-n%zip$n*

Вхід повинен бути вказаний на STDIN, символом для монет можуть бути будь-які символи, що не містять пробілів. Спробуйте тут . Дякую Пітеру за вказівку на зменшення двох символів.


О, що б я не віддав за transposeRuby, який може обробляти масиви різної довжини ...
Вентеро,

@Ventero Більшу частину часу я використовую цю Hacky версію: ([nil]*a.map(&:size).max).zip(*a). Не дуже добре для гольфу, хоча.
Говард

Ви можете зберегти 2 символи: оскільки найдовші рядки завжди закінчуються внизу, ви можете замінити -1%їх $.
Пітер Тейлор

@PeterTaylor Ви маєте рацію - ми можемо заощаджувати до символів. Дякую.
Говард

1
@PeterTaylor Добре, я включив псевдонім з одним символом для " ".
aditsu кинути, тому що SE - EVIL

6

Javascript (E6) 103

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

R=t=>(x=t.split('\n').reverse().map(x=>[...x].sort()),x.map((c,i)=>x.map(r=>r[i]).join('')).join('\n'))

Псевдокод

  1. рядок -> масив рядків
  2. вгору / вниз зворотний масив
  3. кожен рядок -> масив char
  4. сортувати кожен рядок (монети "падають" вправо)
  5. переносити
  6. кожен масив char підряд -> рядок
  7. join array -> одиночний рядок

О, вау, сортування розумне (+1)! Розум, якщо я його вкраду?
seequ

Я ніколи раніше не бачив синтаксису [...x]. Як це називається?
ComFreek

2
@ComFreak це називається spread[ developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
edc65

2
@ edc65 Ви порушили власне посилання з дужками. Ось правильне посилання
Chris Cirefice

6

Ruby 2.0, 59 символів

puts$<.map(&:chars).reverse.transpose.sort[1,50].map &:join

Введення через stdin, припускаючи, що рядки мають однакову довжину. Це, мабуть, набагато довше, ніж потрібно. Але принаймні це читається ...


Я думаю, що ви можете використовувати $<.mapзамість цього.
Говард

@Howard Це одне, що я завжди забуваю. Спасибі!
Вентеро

1
що там [1,50] робить?
Не те, що Чарльз

1
@Charles Пропускає перший рядок, який містить усі нові рядки з вхідних даних. Девід зазначив у коментарі, що 50x50 - це максимально можливий розмір, тому замість вибору всіх, крім першого рядка ( 1..-1), я просто вибираю 50 рядків, починаючи з другого ( 1,50).
Вентеро

@Ventero отримав це. круто. Спасибі!
Не те, що Чарльз

3

J - 49 31 24 байт

Я думаю, що там можуть бути непотрібні обертання, але в іншому випадку це прекрасно працює. Це функція, яка приймає введення, як зазначено, монети O. Ніяких пробілів у вводі не потрібно.

Нова версія, натхненна відповіддю Javascript на edc65 :

f=:[:|."1@|:[:/:~"1,;._2

Пояснення:

f=:[:|."1@|:[:/:~"1,;._2
                   ,;._2 Split the string at every fret, which is the last character in the string (newline).
              /:~"1      Sort every row separately.
     |."1@|:             Rotate the array clockwise.

Стара версія:

f=:[:|:((#~=&' '),=&'O'#])"1@|:@(|."1@|:)@(,;._2)

Пояснення:

f=:[:|:((#~=&' '),=&'O'#])"1@|:@(|."1@|:)@(,;._2)
                                          (,;._2) Split the string at every fret, which is the last character in the string (newline).
                                (|."1@|:)@        Rotate the array clockwise.
                             |:@                  Reverse the axes (columns become rows and vice-versa).
       ((#~=&' '),=&'O'#])"1                      Function that applies the "gravity"
                          "1                       Apply to every row separately:
                  =&'O'#]                           Get the O's in the row.
       (#~=&' ')                                    Get the spaces in the row.
                ,                                   Join them, spaces come first.
  [:|:                                            Reverse axes again.

Приклади (зауважте, що багаторядкові рядки починаються з 0 : 0дужки і закінчуються дужкою):

   f 0 : 0
O
OO O
OOOOO
) NB. output starts now
O  
O  
OO 
OO 
OOO
   f 0 : 0
O O
O O
) NB. Output starts now.

OO
OO

Якщо можете, сортуйте перед обертанням
edc65

@ edc65 Ти розумна людина.
seequ

2

Хаскелл - 86

Просто навчання, тому я впевнений, що це можна вдосконалити.

import Data.List
c=putStr.unlines.filter(/="").sort.map(filter(/=' ')).transpose.lines

Зразок введення:

let a = "O    \nOO O \nOOOOO"
let b = " O O \n O O "
c a
c b

Вибірка зразка:

O
O
OO
OO
OOO

OO
OO

2

Пітон 2 (69) (79)

for c in sorted(zip(*raw_input().split("\\n"))):print''.join(c[::-1])

Вводиться з пробілами, щоб усі рядки мали однакову довжину. splitСтворює arrat кожного рядка. zipЕфективно переставляє масив. Потім sortedсортують кортежі в лексикографічному порядку, внаслідок чого всі монети падають на дно. Нарешті, ми друкуємо кожен рядок, перетворюючи його назад у рядок, хоча спочатку треба його реверсувати. Виконання print'O'*c.count('O')рівнозначно і використовує однакову кількість символів.

Приклад виконання:

>> O    \nOO O \nOOOOO
O
O
OO
OO
OOO

1

C, 167 119 байт

Ця коротша версія (на жаль?) Набагато чіткіша за оригінал.

m;j;b[99];r;main(){while(j=getchar()+1)j-11?m+=j-33&&++b[r]>m:++r;for(j=r;m+1;putchar(j--?m<b[j]?79:32:(j=r,m--,10)));}

0

Ракетка: 130

(let l((a'()))(let((b(sort(string->list(read-line))char<?)))(if
(null? b)(apply map(λ x(map display x)(newline))a)(l(cons b a)))))

Для цього потрібно прокладати пробіли, щоб лінії були рівними довжиною.


0

C # - 209 174 байт

Правильно, я повинен спробувати цей гольф Code в якийсь момент, який я вважаю. Створено функцію (r), яка обертає дошку та друкує її. Я думаю, що я трохи обманюю, коли друкую свій масив char, але якщо ви не можете зрозуміти, чому ви не повинні злитися :)

Дякую ProgramFOX за поради :)

void r(string s){int x=s.IndexOf('\n'),j,i=-1,k,z=x+1;var y=new char[x*x+x];for(;++i<x;y[z*(i+1)-1]='\n')for(k=j=x;j>0;)if(s[i*z+--j]=='0')y[k--*z-i-2]='0';Console.Write(y);}

Чит

new char[x*x+x]заповнює масив '\0'і не' '


1
Видалення нових рядків та видалення пробілу між ними char[]та yскоротить кількість символів до 192 символів. Також не потрібно вводити ключове слово staticпід час публікації відповіді. Якщо вилучите його, кількість персонажів зменшиться до 185 символів.
ProgramFOX

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