Имитация побитового циклического тега

11

Вызов

Имея две строки в любом формате ввода / вывода по умолчанию, сделайте следующее:

ПРИМЕЧАНИЕ. Задача будет называть первую строку как «данные», а вторую - как «программу».

  1. Измените программу на бесконечную строку, которая является просто программой, повторяемой бесконечно (например, 10-> 1010101010...). Задача будет называть это «бесконечной программой»
  2. Пока данные не пустые, выполните следующие действия во время цикла бесконечной программы:

    а. Если текущая команда "0", удалите самый левый бит в данных. Если данные пусты, «0» ничего не делает.

    б. Если текущая команда «1», добавьте следующий символ в программе к данным, если самый левый бит в данных равен единице.

    с. Если данные сейчас не пусты, выведите данные.

Тестовые случаи

Данные - это левая сторона ввода, а программа - это правая сторона.

100, 0 --> 00, 0
1111, 1 --> 11111, 111111, 1111111, ...
10, 011 --> 0, 0, 0
1110, 011 --> 110, 1101, 11010, 1010...

Заметки

  • Данные и программа будут состоять только из 0 и 1
  • Для данных / программ, которые не останавливаются, ваша программа не должна останавливаться.
  • Данные и программа не будут пустыми на входе.
  • У вас может быть несколько трейлингов и лидирующих новых строк
  • Стандартные лазейки запрещены
  • Вы можете использовать любой удобный формат ввода / вывода

Как всегда с , выигрывает самый короткий код !

MilkyWay90
источник
@Sanchises Похоже на пограничный дубликат этого, но вы должны получить результат в определенном поколении, и это для любой системы циклических тегов.
MilkyWay90
в первом тестовом примере 100происходит 10переход к cmd 0, определение которого «удалить самый левый бит в данных». не крайний левый бит 100быть 1?
Иона
@Jonah О, пропустил это
MilkyWay90
в случае (b), если вы добавляете, перемещает ли указатель инструкции вправо один или два символа?
Спарр
@Sparr Он движется прямо. Смотрите раздел с надписью Challenge.
MilkyWay90

Ответы:

4

Haskell, 77 71 62 байта

f@(d:e)#(p:q)=f:[e,f++take d q]!!p#q
_#_=[]
a!b=tail$a#cycle b

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

Изменить: -9 байт благодаря @xnor.

Ними
источник
1
В первой строке вы можете сделать f:[e,f++take d q]!!p#q.
xnor
2

C # (интерактивный компилятор Visual C #) , 82 байта

m=>n=>{for(int i=0;m!="";Print(m=n[i++]<49?m.Substring(1):m[0]>48?m+n[i]:m))n+=n;}

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

Воплощение невежества
источник
каково значение 48 и 49, из любопытства?
Иона
1
@Jonah 48 - значение ASCII 0, а 49 - значение ASCII1
Воплощение неведения
Вы не должны использовать 0 и 1 вместо этого здесь: P
только ASCII
@ ASCII-only Я использую строку, а не массив.
Воплощение невежества
@EmbodimentofIgnorance, почему бы не использовать Listи Skip, или что-то в этом роде
только ASCII
1

J 65 байт

(([:(][echo)(}.@[)`([,{.@[#1{],])@.({.@]));1|.])&>/^:(0<0#@{>)^:5

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

Я могу сыграть в гольф позже. Обратите внимание, что 5в конце _в реальной программе будет бесконечность , но я оставил ее там, чтобы упростить запуск примеров без остановки.

Ион
источник
1

05AB1E , 24 21 байт

[¹Nèi¬i¹N>è«}ë¦}DõQ#=

Принимает программу как первый ввод, а данные как второй input.input.

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

Объяснение:

[             # Start an infinite loop:
 ¹Nè          #  Get the N'th digit of the first (program) input
              #  (NOTES: N is the index of the infinite loop;
              #          indexing in 05AB1E automatically wraps around)
    i         #  If this digit is 1:
     ¬        #   Push the head of the current data (without popping it)
              #   (will take the second (data) input implicitly if it's the first iteration)
      i     } #   If this head is 1:
       ¹N   #    Get the (N+1)'th digit of the first (program) input
           «  #    And append it to the current data
    ë }       #  Else (the digit is a 0 instead):
     ¦        #   Remove the first digit from the current data
              #   (will take the second input (data) implicitly if it's the first iteration)
 DõQ          #  If the current data is an empty string:
    #         #   Stop the infinite loop
 =            #  Print the current data with trailing newline (without popping it)
Кевин Круйссен
источник
1

Рубин , 62 59 байт

->c,d{p(d)while(a,*c=c;b,*d=d;c<<a;[]!=d=[b]*a+d+c[0,a*b])}

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

Как

  • Получите первый бит из кода cи данных d, позвоните им aи b. Положите aобратно в конце c.
  • Положите обратно bв начале, dесли a==1. Это может быть сокращено до[b]*a
  • Поместите первый байт cв конце dif a==1 and b==1. Это может быть сокращено до c[0,a*b].
  • Если у нас есть больше данных, распечатайте и повторите.
гигабайт
источник
0

Желе , 40 байт

;€Ø2œịxØ1œị$Ʋ$Ḋ€2,1œị$?1¦ṙ€1$2¦µ⁺1ịGṄƲ¿Ḣ

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

Я предположил, что последние переводы строки в порядке. Я также пошел со списком из двух списков нулей и один в качестве ввода и вывода на стандартный вывод.

Ник Кеннеди
источник
0

Python 1 , 75 байт

a,b=input()
while a:b=b[1:]+b[:1];a=[a[1:],a+b[:1]*a[0]][b[0]];print a or''

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

Воплощение невежества
источник
Ницца! Niggle: для данных '100', программы '0', это напечатает пустую строку один раз: но правило c гласит: «Если данные не пусты сейчас, выведите данные».
Час Браун
@ChasBrown Маленькая опечатка, я жду разъяснений от ОП, если завершающие переводы новой строки в порядке
Воплощение Невежества
@ChasBrown ОП ​​говорит, что разрешены множественные завершающие переводы строк, см. Здесь
Воплощение невежества
Но после переключения на массивы 1 и 0 теперь вы печатаете пустой массив []вместо новой строки, например, данные [1,0,0], программы [0].
Час Браун
1
питон 1? Python 2 не работает?
Только для ASCII
0

C ++ (gcc) , 294 289 272 байта

-22 байта благодаря @ceilingcat

#import<cstdio>
#import<queue>
void a(char*e,char*p){std::queue<char>d;for(;*e;)d.push(*e++);for(char*c=p;d.size();c=*++c?c:p){*c-49?d.pop():d.front()-48?d.push(c[1]?c[1]:*p):a("","");if(d.size()){for(int i=0;i++<d.size();d.pop())d.push(putchar(d.front()));putchar(32);}}}

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

Довольно простой алгоритм. Копирует данные в очередь и многократно перебирает программу. На «0» он удаляет первый элемент в очереди (первый «бит»). На 1 он добавляет следующий «бит» программы к данным, если первый «бит» данных равен 1. Затем он циклически перебирает данные, печатая их «бит» на «бит», и, наконец, печатает пространство для разделения последовательных записей данных.

Нил А.
источник
@ceilingcat Умное (ab) использование c[1]! Обновлено.
Нил А.