Ми закінчилися там, де почали!…


29

Виклик:

Вхід:

Ви берете два входи:
- рядок, що містить тільки файл для друку ASCII (за винятком пробілів, вкладок або нових рядків)
- символ для друку ASCII

Вихід:

Перший рядок буде містити рядок-вхід. Кожне iперше виникнення цього персонажа -модуль-3 рухатиметься у південно-східному напрямку; кожне i-модулі-3 секунди виникнення буде рухатися у південному напрямку; і кожне iтретє явище -модуло-3 рухатиметься у південно-західному напрямку. Ви будете продовжувати, поки символи знову не стануть у початковому початковому положенні (а це означає, що при необхідності він обернеться з однієї сторони на іншу), а потім знову надрукуєте останній рядок із введенням рядка на закінчити. (Зверніть увагу, що всі тестові випадки закінчуються на їх початковому введенні не більше, ніж length(input)рядки, включаючи рядок, що містить провідний вхід. Це може бути швидше, як, як видно в цьому першому тестовому випадку нижче, довжиною 14, але закінчується після 9.)

Це все може бути досить невиразно, тому ось приклад:

Тестовий випадок 1:

Рядок-вхід: "This_is_a_test"
Символ-введення:'s'

Вихід:

This_is_a_test
    s s    s  
     ss   s   
      s  s    
      sss     
      sss     
      s  s    
     ss   s   
    s s    s  
This_is_a_test

Ось той самий тестовий випадок із кольоровими контурами трьох s:

введіть тут опис зображення

де перший 's'йде зеленою стежкою в південно-східному напрямку; другий 's'слід жовтою стежкою в південному напрямку; третя 's'йде по світло-блакитній стежці в південно-західному напрямку. (Якщо буде четверта, 's'вона пішла б знову в південно-східному напрямку, що можна побачити в деяких інших тестових випадках нижче.)

Правила виклику:

  • Вхідні дані містять лише ASCII для друку (за винятком пробілів, вкладок та нових рядків)
  • Формати вводу / виводу є гнучкими. Може бути рядком з обмеженою лінією, рядком символів тощо. Ваш дзвінок.
  • Можливо, що даний символ не присутній у рядку, і в цьому випадку вам дозволяється виводити рядок введення один або два рази (тобто "test", 'a'може мати будь-який з цих можливих результатів: "test\ntest"/ "test").
  • Провідні простори є обов’язковими; пробіли проміжки необов’язкові. Допускається одна чи кілька нових / рядків, що ведуть / відкладають.

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам коду-гольфу відштовхувати вас від публікації відповідей з не кодовими гольф-мовами. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Для вашої відповіді застосовуються стандартні правила , тому вам дозволяється використовувати STDIN / STDOUT, функції / метод з відповідними параметрами та повним програмами типу "повернення". Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду.
  • Також, будь ласка, додайте пояснення, якщо це необхідно.

Тестові приклади / більше прикладів:

Тест 2:

Рядок-вхід: "abcabcabcabcabc"
Символ-введення:'b'

Вихід:

abcabcabcabcabc
  b b b    b b 
   bbb      bb 
    b        b 
   bbb       bb
b b b b      b 
 b  b  b     b 
b b b   b    b
   bb    b   bb
    b     b  b 
    bb     bbb
    b b    bbb 
    b  b  b  b 
    b   bb   bb
b   b   bb   b 
abcabcabcabcabc

Ось такий же тестовий випадок із кольоровими стежками із п’яти a:

введіть тут опис зображення

Тест 3:

Рядок-вхід: "only_two_paths?"
Символ-введення:'o'

Вихід:

only_two_paths?
 o     o       
  o    o       
   o   o       
    o  o       
     o o       
      oo       
       o       
       oo      
       o o     
       o  o    
       o   o   
       o    o  
       o     o 
       o      o
only_two_paths?

Ось той самий тестовий випадок із кольоровими контурами двох o:

введіть тут опис зображення

Тестовий випадок 4:

String-input: "lollollollollol"
Введення символів:'l'

Вихід:

lollollollollol
lll   ll  ll   
 ll   ll  ll   
l ll ll ll ll  
  lll l ll l ll
  llllll  ll ll
l l  ll    ll  
 ll  lll   ll  
l l l lll ll l 
  ll  l ll l  l
l l l l llll l 
 ll  lll  lll  
l l   l    ll  
  ll lll  lllll
  l l l ll l ll
lollollollollol

Ось такий же тестовий випадок із кольоровими стежками із десяти l:

введіть тут опис зображення

Тестовий випадок 5:

String-input: "AbCdEeDcBaAbCdEeDcBa_CCCCC"
Введення символів:'C'

Вихід:

AbCdEeDcBaAbCdEeDcBa_CCCCC
C  C        C       C  C  
 C  C       C      C  CCC 
  C  C      C     C  C C C
C  C  C     C    C  C  C  
 C  C  C    C   C  C   C  
  C  C  C   C  C  C    C  
   C  C  C  C C  C     C  
    C  C  C CC  C      C  
     C  C  CC  C       C  
      C  C CC C        C  
       C  C CC         C  
        CC CC C        C  
        CC CC  C       C  
       C  C CC  C      C  
      C  C CC C  C     C  
     C  C   C  C  C    C  
    C  C    CC  C  C   C  
   C  C     C C  C  C  C  
  C  C      C  C  C  C C  
 C  C       C   C  C  CC  
C  C        C    C  C  C  
  C         C     C  C CCC
 C          C      C  CCCC
C           C       C  C  
 C          C        CCCCC
AbCdEeDcBaAbCdEeDcBa_CCCCC

Ось такий же тестовий випадок із кольоровими доріжками із семи C:

введіть тут опис зображення

Тестовий випадок 6:

String-input: "XyX"
Введення символів:'X'

Вихід:

XyX
 XX
  X
XyX

Ось той самий тестовий випадок із кольоровими контурами двох X:

введіть тут опис зображення

Тестовий випадок 7:

String-input: "aaaa"
Введення символів:'a'

Вихід:

aaaa
aa  
aaa 
 aaa
aaaa

Ось такий самий тестовий випадок із кольоровими стежками із чотирьох a:

введіть тут опис зображення


Отже, коли рядок містить кратне 3 символу, у висновку може бути менше рядків, ніж довжина рядка?
Ніл

@Neil Я не впевнений, чи кратно це 3, не досліджував це так багато. Все, що я знаю, - це щонайбільше length(input)все знову збігається, але це може бути швидше, як доведеться перший тестовий випадок. Але, здається, ти справді маєш рацію щодо кратності 3 частини (хоча я не впевнений на 100%).
Кевін Круїссен

@Неіль будь-який рядок із символом, що з’являється лише 3 рази поспіль, надрукує 3 рядки, проте він довгий
Asone Tuhid

Чи дозволено проходження нових рядків між двома друкованими рядками?
Асона Тухід

@AsoneTuhid Вибачте, але ні. Мені не байдуже будь-яка кількість кінцевих або провідних нових рядків до або після всього очікуваного виводу, але я не допускаю між рядками. Діагональні лінії також більше не будуть правильними ..
Кевін Кройсейсен

Відповіді:


1

Стакс , 24 байти

»v↕*δó‼Γ█|q┬YM╨|·£↕fßßZo

Запустити та налагодити його в Інтернеті

Це представлення ascii тієї самої програми.

YxP|Ic{{i3%v-x%%mb-!Czny&PWxP

Він отримує індекси всіх символів, а потім мутує їх до тих пір, поки вони не будуть встановлені рівними вихідним індексам. Для кожної зміни виведіть рядок із символом у цих індексах.

Y                               Store character in y.  Now the inputs are x and y.
 xP                             Print x.
   |Ic                          Get all indices of y in x. Make a copy.
      {                   W     Loop until cancelled.
       {        m               Map index array using block.
        i3%v-                   Subtract i%3-1 from each element. i is the loop index.
             x%%                Modulo len(x)
                 b-!            Is the mutated array set-equal to the original?
                    C           If so, cancel W loop
                     zny&P      Print a string with y at all specified indices
                           xP   Finally, print x again

8

Perl 5 , -plF 101 100 99 98 97 96 байт

Замініть \0літералом 0 байт, щоб отримати 96. Зауважте, що посилання "Спробуйте в Інтернеті" має 97 байт, оскільки, здається, неможливо ввести туди буквальний символ 0.

#!/usr/bin/perl -plF
say;say$$l=~y/\0/ /runtil--$l,(s:\Q${\<>}:$$l|=v0 x((++$#$l%3*$l-$l+"@-")%@F).$&;v0:oreg^$$l)eq$_

Код для гольф-хайлайтера, що думає, #починає коментар Як наївно 😈

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

Як це працює

$lє лічильником, для якого рядка після першого ми знаходимося (хоча він відраховується, тому, наприклад, -3 на 3 рядки під верхньою рядком).

Шукайте в першій строці за появами цільового символу та обчисліть, при якому зсуві він повинен відображатися: (++$#$l%3*$l-$l+"@-")%@Fяка поточна позиція плюс номер рядка (від’ємний) разів -1, 0, 1(циклічний). Побудуйте рядок, який багато разів \0слідує за цільовим символом, а потім orу акумуляторі $$l(тобто, це різний акумулятор для кожного, $lі причина $lвідлічується замість до, тому що $1і $2т. Д. Лише для читання). Модульно $#$lпосилається на інший масив щоразу через цикл. Результат - це $lрядок, але \0замість пробілів.

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

Коли цикл закінчується, -pопція ще раз друкує першу рядок і програма виконується.

Цільовий персонаж підбирається досить хитро. У ${\<>}звернену лінії читати з STDIN в якості посилання , який потім негайно разименован і замещенной в регулярному виразі. \QПрефікс вислизає все символи , які є особливими в регулярному виразі (як .і *). Це \Eнеявне. oМодифікатор викликає пошук частина ніколи не буде оцінюватися ще раз , але тільки повторюється у всіх наступних матчах (це добре , тому що немає нічого на STDIN більше).


Я не думаю, що ти можеш поставити нульовий байт безпосередньо, але ти можеш запустити його в bash чи щось.
FryAmTheEggman

@FryAmTheEggman Спасибі, це приємне ухилення. Але я не думаю, що я буду турбувати. Людям доведеться просто довіряти мені, що це спрацює, якщо вони не хочуть спробувати це самі :-)
Тон Евангелія

Цілком справедливо, але я залишу коментар, щоб люди могли його побачити. Хороший гольф, до речі :)
FryAmTheEggman

4

Python 2 , 199 193 191 байт

s,c=input()
print s;l=len(s);r=range;I=j=[i for i in r(l)if s[i]==c]
while 1:
 j=[(j[i]-i%3+1)%l for i in r(len(I))]
 if sorted(j)==I:print s;break
 print''.join((' '+c)[i in j]for i in r(l))

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


Якщо цикл може вийти через виключення:

Пітон 2 , 187 байт

s,c=input()
print s;l=len(s);r=range;I=j=[i for i in r(l)if s[i]==c]
while 1:
 j=[(j[i]-i%3+1)%l for i in r(len(I))]
 if sorted(j)==I:print s;q
 print''.join((' '+c)[i in j]for i in r(l))

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


  • -4 байти завдяки Джонатану Фреху
  • -2 байти завдяки Лінні

Можлива 189 байт (вихід із циклу через виняток).
Джонатан Фрех

Ви можете скинути пару паролів (j[i]-i%3+1)%lна два байти.
Лінн


2

JavaScript (Node.js) , 197 194 байт

s=>c=>{(C=console.log)(s);w=0;g=[];while(~(w=s.indexOf(c,w)))g.push(w++);h=(H=_=>g.map(x=>A[x]=c,A=Array(l=s.length).fill` `)&&A.join``)();while(h!=(y=H(g=g.map((x,i)=>(l-~x-i%3)%l))))C(y);C(s)}

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

Бере введення в синтаксисі каррі, тобто f(s)(c) .

Зовсім не ідеальний, але мені потрібен JS. Дуже багато функцій.



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