Мы оказались там, где начали!…


29

Вызов:

Входные данные:

Вы берете два ввода:
- Строка, содержащая только печатаемый ASCII (исключая пробелы, символы табуляции или новые строки)
- Печатный символ ASCII

Выход:

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

Это может быть довольно расплывчато, так что вот пример:

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

String-input: "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:

String-input: "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:

String-input: "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:

Строковый ввод: "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:

Строковый ввод: "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:

Строковый ввод: "XyX"
ввод символов:'X'

Выход:

XyX
 XX
  X
XyX

Вот тот же тестовый пример с цветными контурами двух X:

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

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

Строковый ввод: "aaaa"
ввод символов:'a'

Выход:

aaaa
aa  
aaa 
 aaa
aaaa

Вот тот же тестовый пример с цветными контурами четырех a:

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


Таким образом, когда строка содержит кратное 3 символа, выходные данные могут иметь меньше строк, чем длина строки?
Нил

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

@Neil любая строка с символом, появляющимся только 3 раза подряд, напечатает 3 строки,
сколько

Разрешены ли новые строки между двумя напечатанными строками?
Asone Tuhid

@AsoneTuhid Извините, но нет. Я не беспокоюсь о том, сколько трейлингов или лидирует новых строк до или после всего ожидаемого результата, но я не позволю между строк. Диагональные линии тоже не будут правильными ..
Кевин Круйссен,

Ответы:


1

Stax , 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. Обратите внимание, что ссылка Try It Online содержит 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$_

Код для гольфа Perl Highlighter думает #начать комментарий. Как наивно 😈

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

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

$lявляется счетчиком, для которого после первой строки мы находимся (хотя отсчитывается, например, -3 для 3 строк ниже верхней строки). После печати исходной строки один раз она повторяет следующее.

Найдите в первой строке вхождения целевого символа и рассчитайте, в каком смещении он должен появиться: (++$#$l%3*$l-$l+"@-")%@Fкакой является текущая позиция плюс номер строки (отрицательный) раз -1, 0, 1(циклический). Создайте строку с таким количеством раз, \0за которым следует целевой символ, а затем or- в аккумуляторе $$l(это отдельный аккумулятор для каждого, $lи причина $lотсчитывается, а не вверх, потому что $1и $2т. Д. Только для чтения). Simularly $#$lссылается на другой массив каждый раз через цикл. Результатом является $lth-я строка, но с \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))

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


Если цикл может выйти через исключение:

Python 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

C (gcc) , 261 байт

i,j,l,k;g(L,t,r,c)char**L;{L[r++][c]=k;c-=t?t-1?:0:-1;l<r||g(L,t,r,c<0?l-1:c%l);}f(S,K){char*s=S,*L[i=1+(l=strlen(s))];for(k=K;i--;)for(L[i]=calloc(j=l,1);j--;)L[i][j]=32;for(puts(s);s[++i];)s[i]-k||g(L,++j%3,0,i);for(i=1;strcmp(*L,L[i]);)puts(L[i++]);puts(s);}

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


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.