Codegolf - Толкание Поршня Майнкрафт

  • Автор темы Codarz
  • Обновлено
  • 22, Oct 2024
  • #1

В Майнкрафте поршни — это блоки, которые могут перемещать другие блоки. Однако они могут перемещаться не более чем на двенадцать блоков и вообще не будут работать, если на пути окажется какой-нибудь обсидиан. Кроме того, блоки слизи липкие и прилипают к другим блокам, кроме обсидиана.

Ваш вызов

Возьмите в качестве входных данных матрицу 5x5 или аналогичную матрицу, содержащую один поршень внизу, и выведите результат движения одного поршня вверх как 5x6. Формат ввода должен иметь пять различных значений для обсидиана, слизи, других блоков, поршня и пустого пространства, представленных здесь как

 
 
 
BBBBB
BBBBB
SSSSS

S   

P  
=> 

BBBBB
BBBBB
SSSSS

S  

P  
Because 16 is too many blocks.

SBS 

SBS 

SBS 

SBS 

P  
=>

B  

SBS 

SBS 

SBS 

SPS 
Because slime sticks to blocks, but blocks don't stick to slime.
O    
SSSSS

S

S

P
=>
O    
SSSSS

S

S

P

Because the obsidian is in the way, the whole thing can't move.
S S S

S S S

S P S
=>

S S S

S S S

P  
S   S

The stray blocks stay where they are.

SSSSS
B S B
B S B
B S B
B P B
=>
SSSSS
B S B

S  
B S B
B P B
B   B
The slime pulls the first two blocks, but the rest stay in place. 

OSO 

OSO 

OSO 

OSO 

OPO 
=>

S  

OSO 

OSO 

OSO 

OPO 

O O 
Slime doesn't stick to obsidian, so it's free to move. 
 
, B B B B P , B B B B P , P , и соответственно.

Например, предположим, что вы начинаете с

B

Выведите результат, если поршень был активирован, как 5x6:

S

Обратите внимание, что вся конфигурация с поршнем перемещается вверх, если это допустимо.

Тестовые примеры:

O

Подсчет очков

Вот чем короче, тем лучше!

#код-гольф #код-гольф #матрица

Codarz


Рег
16 Feb, 2007

Тем
51

Постов
192

Баллов
477
  • 26, Oct 2024
  • #2

Дж, 121 98 байт

Принимает

 
 
 
 
 
 
 
 
 
 
 
 
 §§υ⊟ι⊟ι
 
as digits J§ι⁰⁻§ι¹›‹Lη¹⁴⊙η⁼O§§υ§ι¹§ι⁰ . Вероятно, некоторые микрогольфы остались, эти длинные негласные определения имеют тенденцию сбивать с толку. :-)

Fη«

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

Как это работает

  • » » Start a will-be-pushed bitmap with the piston
  • ?✳⊗⁺²λF№⪪BS¹KK⊞η⟦ⅈⅉ⟧?✳⊗λ expand the bitmap until it does not expand further:
  • ↓F⁼SKKF³« Push the bitmap upwards (non-wrapping, thus F‹@KK⊞η⟦ⅈⅉ⟧ )
  • J§ι⁰⊖§ι¹ but only if a non-space was pushed.
  • ≔⟦⟦ⅈⅉ⟧⟧ηFη« Extend push of the will-be-pushed slimes towards
  • ≔⪫υ¶θPθ…θ⌕θP all 4 direction
  • WS⊞υι but only push slimes and blocks.
  • WS⊞υι≔⪫υ¶θPθ…θ⌕θP≔⟦⟦ⅈⅉ⟧⟧ηFη«J§ι⁰⊖§ι¹F‹@KK⊞η⟦ⅈⅉ⟧↓F⁼SKKF³«?✳⊗⁺²λF№⪪BS¹KK⊞η⟦ⅈⅉ⟧?✳⊗λ» »Fη«J§ι⁰⁻§ι¹›‹Lη¹⁴⊙η⁼O§§υ§ι¹§ι⁰§§υ⊟ι⊟ι OR old bitmap, slime pushes, and up pushes for the next iteration.
  • + Set the final bitmap to 0 if …
  • (0,~*) There is an obsidian block in it
  • 0,(*-.) or the sum (including the piston) is not less 14.
  • <14>+/@,@] Original map * not-pushed bitmap and an empty row above.
  • (2 e.#~&,) Original map * pushed bitmap and an empty row under.
  • [(]*…) Add both maps – as empty spaces are 0 they don't overlap.
 

Asdasdasd3423251435e


Рег
19 Jul, 2014

Тем
83

Постов
197

Баллов
632
  • 26, Oct 2024
  • #3

Древесный уголь, 144 120 байт

]*@+…+

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

2&<@[*[:+

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

((,-)=i.2)

Выведите макет и переместите курсор в положение поршня.

t]*3=[

Выполните поиск в ширину, начиная с положения поршня.

*@[*

Перейти на квадрат над текущей позицией.

!.0

Добавьте эту позицию в список, если он не пуст.

1(t=:|.!.0)]

Если текущая позиция представляет собой липкий блок, проверьте и остальные три стороны.

^:_

Если на этой стороне есть (липкий) блок, добавьте эту позицию в список.

=&1

Сотрите блок, предполагая, что он будет перемещен. Это также позволяет избежать повторного рассмотрения одного и того же блока.

((0,~*)+0,(*-.))[(]*(2 e.*&,)<14>+/@,@])[(]*@+(2&<@[*[:+/((,-)=i.2)t]*3=[)+*@[*1(t=:|.!.0)])^:_=&1

Прокрутите каждый блок.

01234

Перейдите на старую или новую позицию в зависимости от того, не слишком ли много блоков, которые нужно толкнуть, или обсидиана на пути.

POSB

Распечатайте блок.

 

Евгений Шатохин


Рег
14 Jul, 2011

Тем
69

Постов
164

Баллов
549
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно