Двоичные последовательности


23

Для двоичного числа A в качестве входных данных с d> 1 цифрой выведите двоичное число B с d цифрами в соответствии со следующими правилами для нахождения n-й цифры B:

  • Первая цифра B равна нулю, если первая и вторая цифры A равны; в противном случае это один.

  • Если 1 <n <d, то, если (n-1) -я, n-я и (n + 1) -я цифры A равны, то n-я цифра B равна нулю; в противном случае это один.

  • D-тая цифра B равна нулю, если (d-1) -я и D-я цифры A равны; в противном случае это один.

правила

Формат ввода / вывода строки / списка в порядке. Другой допустимый способ ввода / вывода - это целое число, за которым следует число предшествующих нулей (или после количества предшествующих нулей).

Сделайте ваш код как можно короче.

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

00 -> 00
01 -> 11
11 -> 00
010111100111 -> 111100111100
1000 -> 1100
11111111 -> 00000000
01010101 -> 11111111
1100 -> 0110

Тебе стоило подождать еще 10 минут, тогда у тебя была бы шляпа . Хороший вызов, хотя!
Caird Coneheringaahing

@cairdcoinheringaahing Я помню те в прошлом году ... о, хорошо. :-(
0WJYxW9FMN

2
Предлагаемый тестовый пример: 1100 -> 0110(первые 2 цифры выходных данных всегда идентичны во всех других тестовых случаях; то же самое для последних 2 цифр)
Арно

Приятно видеть, что ни по этому вызову, ни по его двадцати пяти ответам не было подано ни одного отрицательного голоса. Все молодцы!
0WJYxW9FMN

Ответы:


7

Haskell, 59 58 54 байта

f s=[1-0^(a-b+a-c)^2|a:b:c:_<-scanr(:)[last s]$s!!0:s]

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

f s=                        -- input is a list of 0 and 1
          s!!0:s            -- prepend the first and append the last number of s to s
      scanr(:)[last s]      --   make a list of all inits of this list
     a:b:c:_<-              -- and keep those with at least 3 elements, called a, b and c
    1-0^(a-b+a-c)^2         -- some math to get 0 if they are equal or 1 otherwise

Редактировать: @ Ørjan Йохансен сохранил 4 байта. Благодарность!


Если вы не возражаете переключиться на вывод строки, то "0110"!!(a+b+c)сохраните байт.
Лайкони

@Laikoni: Спасибо, но я нашел еще один байт в моей математике.
nimi

2
[last s]можно переместить в scanrначальное значение.
Орджан Йохансен

Вау. единицы (с учетом импорта); абс; если-то-иначе; карта (дубль 3); zipWith; takeWhile (not.null); chunksOf (с его импортом) ... все в гольфе ! Есть ли где-нибудь где-нибудь зал славы гольфа?
Уилл Несс

7

Желе , 9 байт

.ịṚjṡ3E€¬

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

Ввод / вывод в виде списка цифр.

Объяснение:

.ịṚjṡ3E€¬
.ịṚ       Get first and last element
   j      Join the pair with the input list, thus making a list [first, first, second, ..., last, last]
    ṡ3    Take sublists of length 3
      E€  Check if each has all its elements equal
        ¬ Logical NOT each

Почти то же самое с моей попыткой : P
Leaky Nun

@LeakyNun довольно легко получить идентичный код в более простых задачах; p
Эрик Игрок в гольф

2
Не могли бы вы добавить объяснение?
caird coinheringaahing

@cairdcoinheringaahing Скорее всего, вы понимаете код , но я добавляю его как ссылку для всех, пока Эрик не добавит один (если он это сделает): .ị- Получает элемент с индексом 0,5 . Поскольку floor (0.5) ≠ ceil (0.5) , возвращает элементы с индексами 0 и 1 . Jelly индексируется, поэтому 0 фактически захватывает последний элемент. переворачивает пару (потому что они возвращаются как last, first). Затем jсоединяет пару на входе и ṡ3разбивает ее на перекрывающиеся фрагменты длиной 3. E€Проверяет (для каждого списка), равны ли все элементы, и ¬логически отрицает каждый.
Г-н Xcoder

6

05AB1E , 6 байтов

¥0.ø¥Ā

Ввод / вывод в форме битовых массивов.

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

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

¥       Compute the forward differences of the input, yielding -1, 0, or 1 for each
        pair. Note that there cannot be two consecutive 1's or -1's.
 0.ø    Surround the resulting array with 0‘s.
    ¥   Take the forward differences again. [0, 0] (three consecutive equal 
        elements in the input) gets mapped to 0, all other pairs get mapped to a 
        non-zero value.
     Ā  Map non-zero values to 1.





2

Шелуха , 15 11 байт

Ẋȯ¬EėSJ§e←→

Принимает ввод в виде списка, попробуйте онлайн! Или попробуйте тот, который использует строки для ввода / вывода.

объяснение

Ẋ(¬Eė)SJ§e←→ -- implicit input, for example [1,0,0,0]
      SJ     -- join self with the following
        §e   --   listify the
                  first and
                  last element: [1,0]
             -- [1,1,0,0,0,0]
Ẋ(   )       -- with each triple (eg. 1 0 0) do the following:
    ė        --   listify: [1,1,0]
   E         --   are all equal: 0
  ¬          --   logical not: 1
             -- [1,1,0,0]

2

Желе , 8 байт

I0;;0In0

Ввод / вывод в форме битовых массивов.

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

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

I0;;0In0  Main link. Argument: A (bit array of length d)

I         Increments; compute the forward differences of all consecutive elements
          of A, yielding -1, 0, or 1 for each pair. Note that there cannot be
          two consecutive 1's or -1's.
 0;       Prepend a 0 to the differences.
   ;0     Append a 0 to the differences.
     I    Take the increments again. [0, 0] (three consecutive equal elements in A)
          gets mapped to 0, all other pairs get mapped to a non-zero value.
      n0  Perform not-equal comparison with 0, mapping non-zero values to 1.

Я I0,0jI¬¬
нашел

2

JavaScript (ES6), 45 байт

Принимает ввод как массив символов. Возвращает массив целых чисел.

a=>a.map((v,i)=>(i&&v^p)|((p=v)^(a[i+1]||v)))

Контрольные примеры

комментарии

a =>                  // given the input array a
  a.map((v, i) =>     // for each digit v at position i in a:
    (                 //   1st expression:
      i &&            //     if this is not the 1st digit:
           v ^ p      //       compute v XOR p (where p is the previous digit)
    ) | (             //   end of 1st expression; bitwise OR with the 2nd expression:
      (p = v) ^       //     update p and compute v XOR:
      (a[i + 1] ||    //       the next digit if it is defined
                   v) //       v otherwise (which has no effect, because v XOR v = 0)
    )                 //   end of 2nd expression
  )                   // end of map()


1

Желе , 16 байт

ḣ2W;ṡ3$;ṫ-$W$E€¬

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

Я собирался сыграть в гольф, но у Эрика уже есть более короткое решение, а игра в гольф просто приблизит мою к его. Я все еще играю в гольф, но я не буду обновляться, если я не смогу победить его или найти уникальную идею.

объяснение

ḣ2W;ṡ3$;ṫ-$W$E€¬  Main Link
ḣ2                First 2 elements
  W               Wrapped into a list (depth 2)
   ;              Append
    ṡ3$           All overlapping blocks of 3 elements
       ;          Append
        ṫ-$W$     Last two elements wrapped into a list
             E€   Are they all equal? For each
               ¬  Vectorizing Logical NOT

Использование меньше денег и больше не похоже на Эрика
caird coinheringaahing

1

Perl 5 , 62 + 1 ( -n) = 63 байта

s/^.|.$/$&$&/g;for$t(0..y///c-3){/.{$t}(...)/;print$1%111?1:0}

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


Сокращено до 49 байт: попробуйте онлайн!
Дада

Вы должны опубликовать это как ответ. Я не хочу брать кредит за вашу работу. Эта s;..$;конструкция в конце изящна. Я должен запомнить это.
Xcali


1

Japt , 14 13 12 байт

Частично перенесен из раствора желе Денниса. Ввод и вывод - это массивы цифр.

ä- pT äaT mg

Сохраненный байт благодаря ETHproductions.

Попытайся


объяснение

Неявный ввод массива U. ä-получает дельты массива. pTтолкает 0 к концу массива. äaTсначала добавляет еще 0 к началу массива, прежде чем получить абсолютные дельты. mgсопоставляет элементы массива, возвращая знак каждого элемента как -1 для отрицательных чисел, 0 для 0 или 1 для положительных чисел.


Хм, интересно, есть ли хороший способ создать метод, который помещает элемент в начало и конец массива, как в ответе 05AB1E. Я думаю, что это сделало бы это на 1 байт короче ...
ETHproductions

@ETHproductions, для подобного A.ä()которого добавляется второй аргумент, вы можете добавить третий аргумент, который добавляется. Так что, в этом случае, pT äaTможет стать äaTTэкономия 2 байта.
Лохматый


1

J, 32 байта

B=:2&(+./\)@({.,],{:)@(2&(~:/\))

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

B=:                              | Define the verb B
                       2&(~:/\)  | Put not-equals (~:) between adjacent elements of the array, making a new one
            ({.,],{:)            | Duplicate the first and last elements
   2&(+./\)                      | Put or (+.) between adjacent elements of the array

Я пропустил некоторые @s и круглые скобки, которые просто гарантируют, что они хорошо сочетаются.

Пошаговый пример:

    2&(~:/\) 0 1 0 1 1 1 1 0 0 1 1 1
1 1 1 0 0 0 1 0 1 0 0

    ({.,],{:) 1 1 1 0 0 0 1 0 1 0 0
1 1 1 1 0 0 0 1 0 1 0 0 0

    2&(+./\) 1 1 1 1 0 0 0 1 0 1 0 0 0
1 1 1 1 0 0 1 1 1 1 0 0

    B 0 1 0 1 1 1 1 0 0 1 1 1
1 1 1 1 0 0 1 1 1 1 0 0

0

Сетчатка , 35 байт

(.)((?<=(?!\1)..)|(?=(?!\1).))?
$#2

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Пояснение: регулярное выражение начинается с сопоставления каждой входной цифры по очереди. Группа захвата пытается сопоставить другую цифру до или после рассматриваемой цифры. Затем ?суффикс позволяет захватывать совпадения 0 или 1 раз; $#2превращает это в выходную цифру.


0

Pyth , 15 байт

mtl{d.:++hQQeQ3

Попробуй это здесь!

В качестве альтернативы:

  • mtl{d.:s+hQeBQ3,
  • .aM._M.+++Z.+QZ,

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


0

Gaia , 9 байт

ọ0+0¤+ọ‼¦

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

объяснение

+0 + 0¤ + ọ‼ ¦ ~ Программа, принимающая один аргумент, список двоичных цифр.

Del ~ Дельтас.
 0+ ~ Добавить 0.
   0 ~ Вставить ноль в стек.
    Sw ~ Поменяйте местами два верхних аргумента в стеке.
     + ~ Конкатенация (последние три байта в основном предшествуют 0).
      Del ~ Дельтас.
        And ~ И для каждого элемента N:
       ‼ ~ Выход 1, если N ≠ 0, иначе 0.

Gaia , 9 байт

ọ0¤;]_ọ‼¦

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


0

C , 309 байт

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char** argv){int d=strlen(argv[1]);char b[d + 1];char a[d + 1];strcpy(a, argv[1]);b[d]='\0';b[0]=a[0]==a[1]?'0':'1';for(int i=1;i<d-1;i++){b[i]=a[i]==a[i+1]&&a[i]==a[i - 1]?'0':'1';}b[d-1]=a[d-1]==a[d-2]?'0':'1';printf("%s\n",b);}

Не совсем подходит для игры в гольф, но, тем не менее, заслуживает ответа. Попробуйте это здесь !

объяснение

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char** argv) {
    /* Find the number of digits in number (taken in as a command line argument) */
    int d = strlen(argv[1]);

    /* d + 1 to account for d digits plus the null character */
    char b[d + 1];
    char a[d + 1];

    /* Saves having to type argv[1] every time we access it. */
    strcpy(a, argv[1]);

    /* Set the null character, so printf knows where our string ends. */
    b[d] = '\0';

    /* First condition */
    /* For those not familiar with ternary operators, this means b[0] is equal to '0' if a[0] equals a[1] and '1' if they aren't equal. */
    b[0] = a[0] == a[1] ? '0' : '1';

    /* Second condition */
    for(int i = 1; i < d - 1; i++) {
        b[i] = a[i] == a[i+1] && a[i] == a[i - 1] ? '0' : '1';
    }

    /* Third condition */
    b[d - 1] = a[d - 1] == a[d - 2] ? '0' : '1';

    /* Print the answer */
    printf("%s\n", b);
}

Добро пожаловать в PPCG :)
Shaggy

0

APL + WIN, 29 байт

(↑b),(×3|3+/v),¯1↑b←×2|2+/v←⎕

Запрашивает ввод с экрана в виде вектора цифр и выводит вектор цифр.

объяснение

b←×2|2+/v signum of 2 mod sum of successive pairs of elements

×3|3+/v signum of 3 mod sum of successive triples of elements

(↑b),...., ¯1↑b concatenate first and last elements of b for end conditions

0

SNOBOL4 (CSNOBOL4) , 273 байта

	I =INPUT
	D =SIZE(I)
N	P =P + 1
	EQ(P,1)	:S(S)
	EQ(P,D)	:S(E)
	I POS(P - 2) LEN(2) . L
	I POS(P - 1) LEN(2) . R
T	Y =IDENT(L,R) Y 0	:S(C)
	Y =Y 1
C	EQ(P,D) :S(O)F(N)
S	I LEN(1) . L
	I POS(1) LEN(1) . R :(T)
E	I RPOS(2) LEN(1) . L
	I RPOS(1) LEN(1) . R :(T)
O	OUTPUT =Y
END

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

	I =INPUT			;* read input
	D =SIZE(I)			;* get the string length
N	P =P + 1			;* iNcrement step; all variables initialize to 0/null string
	EQ(P,1)	:S(S)			;* if P == 1 goto S (for Start of string)
	EQ(P,D)	:S(E)			;* if P == D goto E (for End of string)
	I POS(P - 2) LEN(2) . L		;* otherwise get the first two characters starting at n-1
	I POS(P - 1) LEN(2) . R		;* and the first two starting at n
T	Y =IDENT(L,R) Y 0	:S(C)	;* Test if L and R are equal; if so, append 0 to Y and goto C
	Y =Y 1				;* otherwise, append 1
C	EQ(P,D) :S(O)F(N)		;* test if P==D, if so, goto O (for output), otherwise, goto N
S	I LEN(1) . L			;* if at start of string, L = first character
	I POS(1) LEN(1) . R :(T)	;* R = second character; goto T
E	I RPOS(2) LEN(1) . L		;* if at end of string, L = second to last character
	I RPOS(1) LEN(1) . R :(T)	;* R = last character; goto T
O	OUTPUT =Y			;* output
END


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.