Моделюйте побітовий циклічний тег


11

Виклик

Дано два рядки у будь-якому форматі вводу / виводу за замовчуванням, виконайте наступне:

ПРИМІТКА. Перший рядок буде викликом як "дані", а другий - "програма".

  1. Змініть програму на нескінченну рядок, яка є просто програмою, що повторюється нескінченно (наприклад 10-> 1010101010...). Виклик буде стосуватися цього як "нескінченної програми"
  2. Якщо дані не порожні, виконайте наступне, переглядаючи нескінченну програму:

    а. Якщо поточна команда "0", видаліть найбільшу ліву частину даних. Якщо дані порожні, "0" нічого не робить.

    б. Якщо поточна команда "1", додайте до даних наступний символ у програмі, якщо самий лівий біт у даних - це один.

    c. Якщо дані зараз не порожні, виведіть дані.

Випробування

Дані - ліва частина вводу, а програма - права.

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

Примітки

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

Як завжди у , виграє найкоротший код !


@Sanchises Схоже, що це дублікат прикордонної лінії, але ви повинні отримати результат у певному поколінні, і це стосується будь-якої системи циклічних тегів.
MilkyWay90

у першому тестовому випадку 100переходить до 10cmd 0, визначення якого - "видалити найбільш лівий біт у даних". НЕ крайній лівий біт 100бути 1?
Йона

@Jonah О, пропустив це
MilkyWay90

у випадку (б), якщо ви додаєте додаток, чи вказівник інструкції рухається вправо на один або два символи?
Sparr

@Sparr Він рухається правильним. Дивіться розділ із позначенням «Виклик».
MilkyWay90

Відповіді:



2

C # (Visual C # Interactive Compiler) , 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 лише я використовую рядок, а не масив.
Втілення невігластва

@EmbodimentofIgnorance, чому б не використовувати a 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на початок dif a==1. Це можна скоротити до[b]*a
  • Помістіть перший байт cу кінці dif a==1 and b==1. Це можна скоротити до c[0,a*b].
  • Якщо у нас є більше даних, роздрукуйте та повторіть.



0

Пітон 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''

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


Приємно! Ніггель: для даних "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 Розумне (аб) використання c[1]! Оновлено.
Ніл А.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.