Це подвійна розмова?


46

У попередньому виклику я попросив гольфістів коду створити рядки, які копіюють кожен символ у рядку. Наприклад:

TThhiiss  iiss  ddoouubbllee  ssppeeaakk!!

Ця задача полягає в тому, щоб просто визначити, чи якийсь текст відповідає визначенню двоканальної розмовної рядок.

  • Є парна кількість символів.
  • Розбившись на пари, кожна пара складається з двох однакових символів.

Змагання

  • Це кодовий гольф, зробіть це в кілька байтів.
  • Використовуйте будь-яку обрану вами мову.
  • Будь ласка, включіть посилання на онлайн-перекладача.
  • Код приймає текст.
    • Для простоти вхід буде складатися лише з друкованих символів ASCII
  • Він поверне вказівку на те, чи є вхід подвійним мовленням. Це може бути:
    • Булевий
    • Рядки ('true', 'false', 'yes', 'no' тощо)
    • Цілі числа 0 або 1

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

  • аба - хибний
  • abba - хибний
  • aabb - правда
  • aaabb - хибний
  • tthhiiss - правда
  • ttthhhiiisss - помилковий

6
Чи можемо помилитися на входах довжиною <2?
Коул

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

2
Запропонований тестовий випадок: aabbbbякий повинен бути правдоподібним
Khuldraeseth na'Barya

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

2
Пропонований тестовий випадок: 0який повинен бути фальси.
640 Кб

Відповіді:



24

мозковий ебать , 20 байт

Збережено 1 байт завдяки Джо Кінгу.

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

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

Зрозумілий вихід!

Вводить одночасно два символи та відсувається від 1 на стрічці, якщо жодна пара не відповідає. EOF трактується як 0 і таким чином обробляється автоматично.

Вихід - це нульовий байт, якщо рядок не є подвійним розмовою, і 0x01, якщо він є. Читаема версія виводить їх у вигляді символів вартістю 14 байт.


Якби я міг спростувати коментарі, я би спростував вищезазначений коментар.
А _

@PerpetualJ A) Це надзвичайно популярний езоланг, я не можу повірити, що ви про нього ще не чули B) Це не привід для того, щоб звернути увагу
програми

@ RedwolfPrograms За правилами SE, ви повинні проголосити, якщо публікація була корисною, і це було б корисно в тому, щоб навчити мене назву мови, про яку я ніколи не чув. Плюс, це чудове рішення, яке заслуговує на підвищення цінності.
ВвічливийJ

1
@PerpetualJ Погодився, що це чудове рішення, але є багато езолангів із кумедними іменами та нудними рішеннями (переважно варіанти BF)
програми Redwolf

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
Ерік Аутгольфер

7
"Хеда" є німецькою для "Ей! Ти!"
QBrute

14

05AB1E , 6 5 2 байти

ιË

Введіть як список символів.

-3 байти , перенісши відповідь на Japt @ Shaggy's , тому обов'язково підтримайте його!

Спробуйте в Інтернеті або перевірте ще кілька тестових випадків .

Пояснення:

ι   # 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як truthy та trueфальси (але якщо він зберігає байт і це дозволено, я все одно буду його використовувати). ;) Але оскільки це рівнобайтове рішення, що дає очікувані результати, це краще.
Кевін Кройсейсен

8

1
Гей, мені це подобається! Знадобилося мені 80 мільйонів, щоб зробити те ж саме, я був схожий на "ей, давайте навчимось Желі зараз", тоді я навчився. Я збирався розмістити це, але подивився, чи відповіді Джеллі вже були там ... а потім побачив це ^^ Мої кроки: ¹©s2L€=2Ạa®s2E€Ạ... ḢƝs2E€Ạ... але мені не вдалося отримати те, що я хотів, і тоді я побачив Œœлол
В. Куртуа


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, вихід - truthy( 1), якщо він є подвійним мовленням, і falsey( 0), якщо він не подвійний.

-4 байти thx до @ Night2 !


1
Це видається для виведення 1 для не подвійної розмовної рядка, а також для подвійної розмовної рядки.
AJFaraday


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 байт як повноцінний виконуваний комп'ютер 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або інтерактивний. Буде лунати "вдвоєним" входом до тих пір, поки не буде виявлено неподвоєний символ, в який момент вийде (можливо, правила згинання вводу / виводу трохи, але це лише бонусна відповідь).

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

Побудувати та протестувати ISDBL2.COM за допомогою xxd -r:

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

Оригінальний 24-байтовий повний виконаний 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 байти thx для @ErikF!

2
Запропонуйте використати LOOPEзамість JNZ/, LOOPщоб зберегти 2 байти.
ErikF

@ErikF, блискучий! Повністю забув про це!
640 Кб

6

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

-25 байт завдяки Джузеппе
-1 байт завдяки val

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

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

Видаляє кожен подвійний символ, а потім перевіряє, чи результат порожній.


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

1
це 34 байти, не зовсім впевнений, що це дійсно, оскільки я ніколи раніше не писав Луа, але, здається, працює.
Джузеппе

Ласкаво просимо до Exchange Exchange Stack Exchange!
Джузеппе

Я припускав, що "(.)%1"сам по собі включає зіткнення, але мені не спало на думку, що замінивши його один раз для всіх захоплень буде достатньо. Чи потрібно реалізувати ваше рішення чи ви повинні написати власну відповідь? І дякую!
HugoBDesigner

1
Хороша ідея! arg[1]можна замінити, (...)щоб зберегти один байт.
val



5

JavaScript, 28 байт

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

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


23 байти за допомогою регексу wastl

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

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


24 байти, але виводить масив для true, nullfor false: Спробуйте в Інтернеті!
wastl

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


5

Haskell , 28 23 байти

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

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

Дуже прямо. Подвійне розмовляння є лише порожнім або повторний символ, що мав вигляд подвійної розмови.

Менш прямо зараз. Виводи через наявність або відсутність помилки, за мета-консенсусом ; відсутність помилок означає подвійну розмову. Збірка шаблону не вдається, коли перші два символи відрізняються або коли є непарна кількість символів. Дякуємо Лайконі за ці заощадження!




4

PowerShell , 39 38 байт

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

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

де $pміститься попередня таблиця.

Ні рекурсії , ні регексу :). Приймає введення як масив char через рядок бризок (див. Посилання 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масив (див. Посилання TIO). Перші два елементи зліплює, $aа $bрешту зберігає $r. Якщо у нас ще залишилися елементи, повторіть разом із $a -eq $b. Інакше просто перевірте, чи є $a -eq $b. Вихід неявний.

-5 байт завдяки маззі



1
@mazzy Спасибі! Я бракував $до блоку операторів і не міг зрозуміти, чому це не працює.
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-байтну дрібницю з цієї відповіді.
Khuldraeseth na'Barya

2
Якщо введення можна сприймати як вектор, то function(a)!sum(rle(a)$l%%2)для 28
MickyT

3

Мозг-Флак , 26 , 22 байти

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

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

Виходи 1 для хибних і 0 для істинних.

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

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

У мене спочатку було таке:

{
    ({}[{}])

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

Що на 10 байт довше.


Чи 0 / non0 вважається булевим? Якщо так, ви можете зробити({({}[{}]){{}}{}})
Райлі

3
LOL у "Читальній версії" - її так легко читати: P
Квін

@riley Ні, це не вірно. Однак я знайшов кращу хитрість.
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 :)
Shaggy

@Oliver, лайно; бачив лише своє оригінальне рішення перед тим, як розмістити шахту. Я щасливий повернутися до 26, якщо ти потрапив до цього 23-го до мене, - дай мені знати.
Кудлатий


3

Zsh , 36 байт

Мою відповідь Zsh на попередній виклик можна знайти тут.

Виходить truthy (0), якщо НЕ розмовляє подвійно, і ложно (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, навіть якщо ви берете рядок як вхід, а не атом. Але це може бути неактуальним, якщо ви можете взяти рядок з обмеженим посиланням - тобто, список char-кодів.
Непов’язана струна
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.