Напишите программу, которая принимает 2 строки в качестве входных данных и возвращает самый длинный общий префикс. Это код-гольф , поэтому выигрывает ответ с наименьшим количеством байтов.
Test Case 1:
"global" , "glossary"
"glo"
Test Case 2:
"department" , "depart"
"depart"
Test Case 3:
"glove", "dove"
""
"aca", "aba"
.global
иGLOSSARY
вернутьglo
или''
?Ответы:
Python 3, 54 байта
Спасибо Python за наличие встроенной функции для этой задачи! : D
Принимает ввод в виде двух слов, разделенных пробелом, например
glossary global
.источник
Haskell, 29 байт
Использование:
Рекурсивно определяет двоичную функцию
%
путем сопоставления с образцом. В двух строках с одинаковыми первыми буквами принимает эти первые буквы и добавляет их к функции остальных строк. На что-нибудь еще выдает пустую строку.источник
Pyth,
87 байтовСпасибо @isaacg за 1 байт
Принимает ввод в кавычки и запятую, как
"abc", "acc"
. Это происходит при ошибке (но оставляет стандартный вывод пустым), когда результатом является пустая строка. Если это недопустимо, добавьте 2 байта для#e@F._MQq
Тестирование
объяснение
источник
e|@F._M.z]k
.#...q
один байт меньше, я отредактирую в полном коде, думаю, это сбивает с толку"abc", "def"
и вы можете использоватьQ
вместо.z
C ++,
10110099 байтСчитывает две строки из
stdin
, печатает символ в текущей позиции из одной из строк, в то время как символ в текущей позиции равен символу в той же позиции в другой строке.Спасибо Zereges за сохранение одного байта.
источник
for
заявления ...int i
в глобальном пространстве (чтобы он был инициализирован 0)Haskell, 38 байт
Пример использования:
( ((map fst.fst.span(uncurry(==))).).zip ) "global" "glossary"
->"glo"
.Zip обе входные строки в список пар символов. Сделайте из него два списка: первый со всеми парами с начала до тех пор, пока оба символа равны, второй со всеми остальными. Удалите второй список и извлеките все символы из первого списка.
источник
CJam,
12119 байтЭто читает строки на две отдельные линии с Unix-стиле конца строки, то есть
<string>\n<string>\n
.Спасибо @ MartinBüttner за -1 байт и @ jimmy23013 за -2 байта!
Попробуйте онлайн в интерпретаторе CJam .
Как это работает
источник
l_q.-
.APL, 13
Это функция, которая принимает массив из двух строк и возвращает префикс:
источник
AppleScript, 215 байт
И я так старался ...; (
Я хотел бы видеть , насколько хорошо AppleScript может осуществить это, и человек является не построен для сравнения строк.
источник
tell app "System Events" to <something>
. Это является интересно посмотреть , как это имеет дело с такого рода вещи, хотя. @ kirbyfan64sosRS , 14 байт
Живая демоверсия и тестовые случаи.
Это довольно просто. Он просто соответствует ... самому длинному общему префиксу и удаляет остальную часть строки. Если нет самого длинного общего префикса, он просто очищает все.
источник
Сед, 18
Я имел в виду что-то гораздо более длинное и сложное, так что заслуга этой идеи принадлежит @ kirbyfan64sos .
Включает +1 за
-r
опцию sed.источник
CJam,
12826Попробуйте онлайн.
(Есть идея использовать. = Вместо .- после просмотра ответа Денниса.)
Со всеми крайними случаями начинающему CJam, как я, стало трудно держать это коротким. Надеюсь, это по крайней мере работает для всех случаев.
источник
C #,
201147 байтовЯ знаю, что это не очень конкурентоспособно. Я просто хотел посмотреть, как это будет выглядеть.
РЕДАКТИРОВАТЬ: Спасибо Эш Бурлакзенко, Беренд и Деннис_Е
источник
using System.*
?.ForEach(x=>Console.Write(x))
может быть сокращено до.ForEach(Console.Write)
using System.Collections.Generic;
не нужно Сбрейте еще один байт, удалив пробел изstring[] a
.Contains
ненужно. 2-Вы можете сохранить несколько байтов, удаливusing System;
и сказавSystem.Console.Write;
3-Этот код возвращает неправильный результат ("a") для ввода "aab", "aaab" из-заIndexOf
. Самое короткое исправление, о котором я могу подумать, это использованиеa[0].Take(a[1].Length)
Это длиной 147 байт: «использование System.Linq; класс a {static void Main (string [] a) {a [0] .Take (a [1] .Length) .TakeWhile» ((c, i) => a [1] [i] == c) .ToList (). ForEach (System.Console.Write);}} "Common Lisp, 39
Принимает два строковых аргумента, определяет индекс i, где они отличаются, и возвращает подстроку от 0 до i .
источник
Perl 5,
201918 байт19 байт плюс 1 за
-E
флаг вместо-e
:Это скопировано бесстыдно от Digital Trauma «s SED ответа . Предполагается, что ввод представляет собой пару слов без пробелов в них (или перед первым) и с одним пробелом между ними.
Обновить:
ThisSuitIsBlackNot предложил использовать
-pe
для сохранения байта следующее (спасибо!):И тогда Luk Storms предложил использовать
-nE
следующее для сохранения другого байта (спасибо!):(Я считаю
-E
как один байт вместо стандартного-e
, но-n
или-p
как два. У меня сложилось впечатление, что это СОП здесь.)источник
-M5.010
при необходимости - бесплатно» . За один и тот же мета пост-pe
или-ne
будет 1 дополнительный байт, а не 2. Таким образом,perl -nE 'say/^(.*).* \1/'
получится 16 байт.Python 3, 72
31 байт сохранен благодаря FryAmTheEggman. 8 сохранено благодаря DSM.
источник
zip
? : Dinput()
s вzip
и сохранитьa
иb
связывание.Python 3, 47
Функция, которая принимает список
w
из двух слов и печатает общий префикс перед завершением с ошибкой.print
Функция Python 3 позволяет печатать строки вплотную друг к другуprint(end=c)
(спасибо Sp3000 за сохранение 3 байтов с этим более коротким синтаксисом). Это многократно берет две буквы из слов и печатает первую из букв. Индексацияc[c!=d]
выдает ошибку «за пределами», при которойc!=d
прекращается выполнение, когда встречаются две неравные буквы.Явный цикл for на один символ длиннее, чем понимание списка:
источник
print(end=c[c!=d])
?print
был необязательным, означал, что его можно вызывать только с конечным аргументом, и он может содержать строку. Это действительно полезный трюк в целом. Вы должны сделать чаевые.Javascript ES6, 52 байта
Использование:
источник
ada,aca
...f=
(a,b)=>[...a].map((e,i)=>e==b[i]?e:b='').join``
Сетчатка , 14 байт
Использует ту же идею, что и kirbyfan64sos . К сожалению, несмотря на утверждение Мартина о том, что в конечном итоге режим соответствия будет содержать способ печати групп захвата, он еще не реализован. В противном случае
(.*).* \1
может использоваться вместе с 2 байтами или около того для некоторой еще не существующей опции строки конфигурации.Каждая строка будет идти в своем собственном файле с добавлением 1 байта на каждый дополнительный файл. В качестве альтернативы, запустите в одном файле с
-s
флагом.источник
\1
гарантирует, что оба слова начинаются с одинакового префикса. Поэтому независимо от того , как жадный(.*)
это,\1
не одно и то же.К, 24 байта
Найдите минимальную длину каждой строки. (
(&/#:'x)
). Обрежьте каждую строку до этой длины (#'x
). Затем сравните, намажьте и суммируйте полученную последовательность:Наконец, возьмите столько символов из первой предоставленной строки (
#*x
).В бою:
источник
Powershell, 65 байт
Сравнивайте строки, сжимая первую, пока она не совпадет (напечатайте и выйдите) или пока строка не станет нулевой и цикл не завершится.
источник
Юлия, 62 байта
Ungolfed:
Исправлена проблема (при огромных затратах в 14 байт) благодаря xnor!
источник
C99, 73 байта
Аналогичен этому ответу , но короче и соответствует спецификации (принимает данные из stdin).
источник
#include<stdio.h>
, что необходимо для компиляции программы.main(int c,char**a){for(;*a[1]==*a[2]++;putchar(*a[1]++));}
(59 байт).MATLAB,
5040 байтОпределяет функцию, которая принимает 2 строки в качестве входных данных, выводит в командное окно
Это решение будет работать для любой строки, выходы
если нет совпадения
Можно использовать с помощью скрипта вместо функции (используя локальные переменные a, b) (-16 байт).
так получая 34 байта
Стиль функции (который кажется принятым стилем) дает
(Спасибо @ Стиви Гриффин)
источник
@(a,b)a(1:find([diff(char(a,b)) 1],1)-1)
. =)Perl 6 , 28 байт
Я придумал два, которые берут свои значения из STDIN, которые основаны на ответе Perl 5.
Первый требует ровно один пробел между входами, а другой требует как минимум один символ пробела между входами.
Это немного короче, чем первое, что я попробовал, который берет значения из командной строки.
или даже лямбда-версия этого:
Хотя это гораздо проще настроить, чтобы он принимал любое количество входных строк, за счет одного удара.
источник
Japt, 27 байт
Japt - это сокращенная версия Ja vaScri pt . переводчик
(Строки идут в поле ввода , например , так:
"global" "glossary"
)Этот код в точности эквивалентен следующему JS:
Я еще не реализовал анонимные функции, для чего и
$...$
существует: все, что находится между знаками доллара, остается нетронутым при переходе на JS. После добавления функций этого 21-байтового кода будет достаточно:И после того, как я реализую еще несколько функций, в идеале это будет 18 байт:
Предложения приветствуются!
Получается, что эта программа занимает всего 15 байт в современном Japt:
Попробуйте онлайн!
источник
MATL ,
119 байтПопробуйте онлайн!
(-2 байта благодаря Джузеппе)
источник
y
Идея довольно хорошо, я пытался что - то вроде начальнойiti
вместо1Gw
, но не думать об использованииy
для этого.Clojure / ClojureScript, 51
Довольно просто. К сожалению, пробелы вокруг параметра разрушения необходимы (вот и
[a & b]
все). Не самый короткий, но я прибил некоторые другие ответы на языках, которые любят хвастаться их краткостью, поэтому я отправлю это.источник
Python 2, 50 байт
вход
Ввод принимается в виде двух строк:
Выход
Вывод - это каждый символ, за которым следует пробел; что, надеюсь, не проблема. Однако, если это так, я отредактирую свой ответ.
источник
"global" , "glossary"
(две отдельные строки). Сколько других ответов следует за письмом? @ThomasKwaprint(exit()if a!=b else a,end='')
? Я не знаю, сработает ли это или нет, но это можетTeaScript, 16 байт
20Принимает каждый вход через пробел.
источник
PHP, 52 байта
Не впечатляет, но делает работу:
Принимает два аргумента командной строки:
источник
while(($a=$argv)[1][$i]==$a[2][$i])echo$a[1][$i++];
- Еще одно решение для PHP7 (и лучше всего, если бы я смог получить @ 50 байт).<?=substr(($a=$argv)[1],0,strspn($a[1]^$a[2],~ÿ));
- Убедитесь, что ваш редактор работает в режиме ascii, важно, чтобы~ÿ
он не конвертировался в юникод.