Это двойной разговор?


46

В более раннем испытании я попросил игроков в коде создать строки, которые копируют каждый символ в строке. Например:

TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!

Эта задача состоит в том, чтобы просто определить, соответствует ли какой-либо текст определению строки двойного разговора.

  • Существует четное количество символов.
  • При разбиении на пары каждая пара состоит из двух одинаковых символов.

Соревнование

  • Это код гольф, сделать это в несколько байтов.
  • Используйте любой язык, который вы выберете.
  • Пожалуйста, включите ссылку на онлайн-переводчика.
  • Код примет некоторый текст.
    • Для простоты ввод будет состоять только из печатных символов ASCII
  • Он вернет индикацию того, является ли вход двойным голосом. Возможно:
    • Логическое значение
    • Строки («истина», «ложь», «да», «нет» и т. Д.)
    • Целые числа 0 или 1

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

  • аба - ложь
  • абба - ложь
  • аабб - правда
  • ааабб - ложь
  • это правда
  • ttthhhiiisss - ложь

6
Можем ли мы допустить ошибку на входах длины <2?
Коул

3
Предлагаемый контрольный пример: abbaкакой должен быть фальси
Джузеппе

2
Предлагаемый тестовый пример: aabbbbкоторый должен быть правдивым
Хулдрасет на'Барья

2
@val Ну, я не собираюсь спорить со стандартным
вводом

2
Предлагаемый тестовый пример: 0который должен быть ложным.
640KB

Ответы:



24

брейкфук , 20 байт

Сохранено 1 байт благодаря Джо Кингу.

+>,[>,[-<->]<[<],]<.

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

Читаемый вывод!

Принимает по два символа за раз и удаляется от 1 на ленте, если какая-либо пара не совпадает. EOF обрабатывается как 0 и, таким образом, обрабатывается автоматически.

Выход - нулевой байт, если строка не является двойной речью, и 0x01, если это так. Читаемая версия выводит их в виде символов по стоимости 14 байтов.


Если бы я мог понизить комментарии, я бы понизил комментарий выше.
A _

@PerpetualJ A) Это очень популярный esolang, я не могу поверить, что вы еще не слышали об этом. B) Это не причина, чтобы поднимать голос
Программы

@RedwolfPrograms По правилам SE, вы должны проголосовать, если пост был полезным, и он помог мне научить меня названию языка, о котором я никогда не слышал. Кроме того, это отличное решение, заслуживающее повышения.
PerpetualJ

1
@PerpetualJ Согласился, что это отличное решение, но есть много esolangs со смешными именами и скучными решениями (в основном, варианты BF)
Redwolf Programs

17

MATL , 4 байта

Heda

Ввод - это строка, заключенная в одинарные кавычки. Выход 0для двойного разговора, в 1противном случае.

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

объяснение

Рассмотрим ввод 'TThhiiss iiss ddoouubbllee ssppeeaakk!!'в качестве примера.

H    % Push 2
     % STACK: 2
     % Implicit input (triggered because the next function requires two inputs): string 
     % STACK: 'TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!', 2
e    % Reshape as a 2-column matrix of chars, in column-major order. Pads with char(0)
     % if needed. Note that char(0) cannot be present in the input
     % STACK: ['This is double speak!';
               'This is double speak!']
d    % Difference of each column
     % STACK: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
a    % Any: gives 0 if and only if all elements are 0
     % STACK: 0
     % Implicit display

12
Хм ... кто такой "Хеда"? : D
Эрик Outgolfer

7
"Хеда" в переводе с немецкого означает "Эй! Ты!"
QBrute

14

05AB1E , 6 5 2 байта

ιË

Ввод в виде списка символов.

-3 байта при переносе ответа Япта @ Шегги , так что не забудьте отозвать его!

Попробуйте онлайн или проверьте еще несколько тестов .

Объяснение:

ι   # Uninterleave the (implicit) input-list of characters
    #  i.e. ["t","t","t","t","e","e","s","s","t","t","!","!","!"]
    #   → [["t","t","e","s","t","!","!"],["t","t","e","s","t","!"]]
 Ë  # Check if both inner lists are equal
    #  → 0 (falsey)
    # (after which the result is output implicitly)


10

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

(.)\1

^$

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

Объяснение:

Удалите все пары одинаковых символов:

(.)\1

Проверьте, не осталось ли символов:

^$

1
Вы можете предоставить более традиционный результат, используя в ^$качестве заключительного этапа.
Нил

@Neil Ну конечно, спасибо! Это действительно выглядит лучше. Я всегда думаю, что это странный вывод falseкак правдивый и trueкак фальшивый (но если он сохраняет байт и это разрешено, я все равно буду его использовать). ;) Но поскольку это решение с равными байтами, выдающее ожидаемые результаты, это лучше.
Кевин Круйссен

8

1
Эй, мне это нравится! Мне потребовалось 80 миллионов, чтобы сделать то же самое, лол, я выглядел как «эй, давай изучим Джелли сейчас», потом я узнал. Я собирался опубликовать это, но посмотрел, были ли ответы Jelly уже там ... и затем увидел это ^^ Мои шаги: ¹©s2L€=2Ạa®s2E€Ạ... ḢƝs2E€Ạ... но мне не удалось получить то, что я хотел, и тогда я увидел ŒœLOL
В. Куртуа


6

PHP ,58 56 байт

function f($s){return!$s?:$s[0]==$s[1]&f(substr($s,2));}

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

Как рекурсивная функция.

PHP ,61 56 52 байта

while(''<$l=$argn[$i++])$r|=$l!=$argn[$i++];echo!$r;

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

Или отдельная программа. Входная строка через STDIN, output is truthy( 1), если речь идет дважды, и falsey( 0), если речь не двойная.

-4 байта спасибо @ Night2 !


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

@AJFaraday попробуйте сейчас - это двойная речь , не двойная речь
640KB

6

машинный код x86, 9 7 байт

D1 E9       SHR  CX, 1          ; divide length in half 
AD          LODSW               ; load next two chars into AH/AL 
3A E0       CMP  AH, AL         ; compare AH and AL 
E1 FB       LOOPE -5            ; if equal, continue loop

Входная строка в SI, длина входной строки в CX. Выведите, ZFесли двойная речь.

Или 14 байтов как полный исполняемый файл PC DOS:

B4 01       MOV  AH, 01H        ; DOS read char from STDIN (with echo) 
CD 21       INT  21H            ; read first char into AL
92          XCHG DX, AX         ; put first char into DL
B4 08       MOV  AH, 08H        ; DOS read char from STDIN (no echo) 
CD 21       INT  21H            ; read second char into AL
3A C2       CMP  AL, DL         ; compare first and second char 
74 F3       JE   -13            ; if the same, continue loop 
C3          RET                 ; otherwise exit to DOS 

Ввод осуществляется через STDINканал или в интерактивном режиме. Повторяет ввод "de-doubled" до тех пор, пока не будет обнаружен не удвоенный символ, и в этот момент он выйдет (возможно, немного согнув правила ввода-вывода, но это всего лишь бонусный ответ).

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

Постройте и протестируйте ISDBL2.COM, используя xxd -r:

00000000: b401 cd21 92b4 08cd 213a c274 f3c3       ...!....!:.t..

Оригинальный 24-байтовый полный исполняемый файл PC DOS:

D1 EE       SHR  SI, 1          ; SI to DOS PSP (080H) 
AD          LODSW               ; load string length into AL 
D0 E8       SHR  AL, 1          ; divide length in half 
8A C8       MOV  CL, AL         ; put string length into BL 
        CLOOP: 
AD          LODSW               ; load next two chars into AH/AL 
3A E0       CMP  AH, AL         ; compare AH and AL 
E1 FB       LOOPE CLOOP         ; if equal, continue loop
        DONE: 
B8 0E59     MOV  AX, 0E59H      ; BIOS tty function in AH, 'Y' in AL 
74 02       JZ   DISP           ; if ZF, result was valid double 
B0 4E       MOV  AL, 'N'        ; if not, change output char to N 
        DISP: 
B4 0E       MOV  AH, 0EH 
CD 10       INT  10H 
C3          RET                 ; return to DOS

Ввод из командной строки, вывод на экран, 'Y'если двойной, 'N'если нет.

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

Создайте и протестируйте ISDBL.COM, используя xxd -r:

00000000: d1ee add0 e88a c8ad 3ae0 e1fb b859 0e74  ........:....Y.t
00000010: 02b0 4eb4 0ecd 10c3                      ..N.....

Кредиты:

  • -2 байта спасибо @ErikF!

2
Предложите использовать LOOPEвместо JNZ/, LOOPчтобы сохранить 2 байта.
ErikF

@ErikF, великолепно! Полностью забыл об этом!
640KB

6

Луа , 67 66 63 59 33 32 байта

-25 байт благодаря Джузеппе
-1 байт благодаря val

print(#(...):gsub("(.)%1","")<1)

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

Удаляет каждый удвоенный символ, затем проверяет, является ли результат пустым.


1
почему бы просто не i:gsub("(.)%1","")проверить и проверить i==""?
Джузеппе

1
это 34 байта, не совсем уверен, что это правильно, так как я никогда раньше не писал Lua, но, похоже, это работает.
Джузеппе

добро пожаловать на Code Golf Stack Exchange, хотя!
Джузеппе

Я предполагал, что "(.)%1"это само по себе включает столкновения, но мне не пришло в голову, что достаточно заменить его один раз для всех захватов. Должен ли я реализовать ваше решение или написать свой собственный ответ? И спасибо!
HugoBDesigner

1
Хорошая идея! arg[1]может быть заменен на, (...)чтобы сохранить один байт.
вал


5

MathGolf , 2 байта

½=

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

Как и в случае ответа 05AB1E, ½строка разбивается на четные и нечетные символы, а затем проверяется на равенство. Проходит за пустую строку.


5

JavaScript, 28 байт

s=>s.every((x,y)=>x==s[y|1])

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


23 байта, используя регулярное выражение wastl

s=>/^((.)\2)*$/.test(s)

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


24 байта, но выводит массив для true, nullдля false: попробуйте онлайн!
Wastl

27 байтs=>!s.some((x,y)=>x>s[y|1])
TSH


5

Haskell , 28 23 байта

f(x:y:z)|x==y=f z
f[]=1

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

Очень просто. Двойная речь - только пустое или повторяющийся символ, добавленный к двойной речи.

Менее просто сейчас. Выводы через наличие или отсутствие ошибки, в соответствии с мета-консенсусом ; нет ошибки означает двойной разговор. Сопоставление с образцом завершается неудачно, если первые два символа различаются или если имеется нечетное количество символов. Спасибо Laikoni за эти сбережения!




4

PowerShell , 39 38 байт

!$($args|?{+$p*($p="$_"[$p-eq$_])};$p)

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

где $pсодержит предыдущий символ

Нет рекурсии , нет регулярных выражений :). Принимает входные данные как массив символов через строку символов (см. Ссылку TIO).


PowerShell , 48 байт

for(;$b-eq$a-and$args){$a,$b,$args=$args}$b-eq$a

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

Нет рекурсии , нет регулярных выражений и нет трубы: D. Он также принимает входные данные в виде char-массива через строку символов. $b-eq$aВместо этого он используется $a-eq$bдля случая, когда последний символ имеет код # 0.


4

PowerShell , 64 59 байт

filter f($n){$a,$b,$r=$n;$a-eq$b-and$(if($r){f $r}else{1})}

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

Рекурсивная функция, без регулярных выражений. Принимает ввод как char-array (см. Ссылку TIO). Отшелушивает первые два элемента в $aи $bсохраняет остальные в $r. Если у нас еще остались элементы, рекурсивно вместе с $a -eq $b. В противном случае просто проверьте, есть ли $a -eq $b. Вывод неявный.

-5 байт благодаря маззи



1
@mazzy Спасибо! Я скучал $по блоку оператора before и не мог понять, почему он не работает.
AdmBorkBork



4

Язык программирования Шекспира , 204 156 байт

-48 байтов благодаря Джо Кингу (в основном, путем изменения метода вывода)

A.Ajax,.Puck,.Act I:.Scene I:.[Exeunt][Enter Ajax and Puck]Ajax:Open mind.Puck:Open
mind.Is I worse zero?If soSpeak thy.Is you as big as I?If soLet usAct I.

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

Выход с ошибкой, если вход является двойным разговором, и с предупреждением, если это не двойной разговор (что разрешено по умолчанию).


4

Кег , 19 17 знаков

?{!1<|=[|0.(_)]}1

Объяснение:

?             # read input

{             # while
    !1<       # stack length greater than 1?
|             # end of while condition and beginning of while block
    =         # compare the 2 top values in the stack
    [         # if (the condition is the top of stack)
    |         # end of then block and beginning of else block
        0.    # output 0
        (_)   # clear stack (discard top of stack in for loop stack length times)
    ]         # end if
}             # end while

1             # stack is already empty, push a truthy value

              # implicitly output the stack content if there was no explicit output

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


3

R , 53 34 байта

-19 байт благодаря Джузеппе

function(a)gsub("(.)\\1","",a)==""

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


1
Я думаю, gsub("(.)\\1","",a)==""что сделал бы трюк также; многие другие используют то же регулярное выражение.
Джузеппе

@Giuseppe Это регулярное выражение для меня довольно ново. Благодарю.
Роберт С.

R + pryr дает вам 32-байтовую модификацию из этого ответа.
Хулдраесет на'Барья

2
Если входные данные могут быть приняты как вектор, то function(a)!sum(rle(a)$l%%2)для 28
MickyT

3

Brain-Flak , 26 , 22 байта

({<({}[{}])>{()<>}{}})

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

Выходы 1 для ложного и 0 для истинного.

Читаемая версия:

({
    <({}[{}])>
    {
        ()
        <>
    }
    {}
})

У меня изначально было это:

{
    ({}[{}])

    {
        <>([()])<>{{}}
    }{}
}
<>({}())

Что на 10 байт длиннее.


0 / non0 считается булевым значением? Если это так, вы можете сделать({({}[{}]){{}}{}})
Райли

3
LOL в «Читаемая версия» - это так очень читабельно: P
Куинн

@ Рили Нет, это не верно. Тем не менее, я нашел лучший трюк.
DJMcMayhem

@ Quinn выглядит читабельным для меня: P
DJMcMayhem


3

JavaScript, 26 23 байта

s=>/^((.)\2)+$/.test(s)

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

Рекурсивное решение, 30 байтов

Спасибо Arnauld за исправление стоимостью 0 байт.

f=([x,y,...s])=>x?x==y&f(s):!y

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



Спасибо, @Arnauld :)
Лохматый

@ Оливер, дерьмо; только видел ваше оригинальное решение, прежде чем публиковать мое. Я рад вернуться к 26, если вы дошли до 23 до меня - дайте мне знать.
Лохматый


3

Zsh , 36 байт

Мой ответ Zsh на предыдущий вызов можно найти здесь.

Выход из truey (0), если НЕ говорит дважды, и falsy (1), если говорит дважды. (Как разрешено в комментарии.)

for a b (${(s::)1})r+=${a#$b}
[ $r ]

for a b (${(s::)1})r+=${a#$b}
         ${(s::)1}             # split $1 characterwise
for a b (         )            # take pairs of characters from ${(s::)1}, assign to $a and $b
                      ${a   }  # first character
                      ${ #$b}  # remove second character as prefix
                   r+=         # append to $r as string
[ $r ]                         # exit truthy if $r is non-empty

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


3

Пролог (SWI) , 60 45 байт

благодаря несвязанной строке

+[].
+[A,A|T]:- +T.
-X:-string_chars(X,Y),+Y.

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

Преобразование его из строки в список атомов отчасти испортило счет, но хорошо ..



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