LINUX.ORG.RU

Говорили что Перл старый, ни на что не способный язык. Проверим?

 , , , ,


9

4

Говорили что Перл старый, ни на что не способный язык. Проверим?

Задачка:

Необходимо для каждой пары слов получить новое слово, так, чтобы окончание первого совпадало с началом второго, например, шлакоблок + окунь = шлакоблокунь. Это слово надо вывести в стандартный поток вывода.Если слова возможно соединить несколькими способами, надо выбрать тот, что обеспечивает максимальную общую часть, например папа + папаха = папаха (а не папапаха). Необходимо написать последнее условие.

Я просто взял практически первое попавшаяся задание.

На Перле программа заняла 5 строк не считая ввода-вывода. С вводом-выводом - 7 строк.

А как у вас? На ваших Супер-пупер языках?

Перемещено xaizek из general

Перемещено hobbit из talks



Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от micronekodesu

Разбиение строки на слова - это часть программы. Вы так пытаетесь сократить свою программу.

Отсутствие + - явное пренебрежение входными данными.

kompospec
() автор топика
Ответ на: комментарий от kompospec

ну раз ты так переобуваешься, то вот тебе решение

x = lambda x, y: x[-2:] + y[2:]
usi_svobodi
()
Ответ на: комментарий от kompospec

Делов-то.

<?php
for ($i = 1; $i <= mb_strlen(trim(explode('+', $argv[1])[0])) && $i <= mb_strlen(trim(explode('+',$argv[1])[1])); $i++)
    if (mb_substr(trim(explode('+', $argv[1])[0]), mb_strlen(trim(explode('+',$argv[1])[0])) - $i) === mb_substr(trim(explode('+',$argv[1])[1]), 0, $i)) 
        $j = $i;
echo (isset($j)) ?  trim(explode('+',$argv[1])[0]). mb_substr(trim(explode('+',$argv[1])[1]), $j) : 'error';

А в условии ничего нет про вид входных данных, там + — преобразование.

fernandos ★★★
()
Ответ на: комментарий от Nervous

Не увидел входную строку.

Я уже просил писать её в коде в виде строки.

kompospec
() автор топика
Ответ на: комментарий от fernandos

Я даю задание. я.

И я прошу вас написать с +

Это сильно сложно для вас?

kompospec
() автор топика
Ответ на: комментарий от kompospec

Когда задача будет поставлена точно, что бы потом не было «я подразумевал, а ты должен был угадать», может и будет.

anonymous-angler ★☆
()
Ответ на: комментарий от WitcherGeralt

Второе и первое слово — это порядок их написания при вводе.

Если бы задача звучала если первое число делиться на второе нацело, вывести результат, первое — 2, второе — 6, вы бы и тут местами меняли?

fernandos ★★★
()
Ответ на: комментарий от kompospec

Я же уже дал с плюсом.

➜ php i.php "папа + папаха"
папаха%                                                                                                                                                                   ➜ php i.php "шлакоблок + окунь"
шлакоблокунь%                                                                                                                                                              
➜ cat i.php
<?php
for ($i = 1; $i <= mb_strlen(trim(explode('+', $argv[1])[0])) && $i <= mb_strlen(trim(explode('+',$argv[1])[1])); $i++)
    if (mb_substr(trim(explode('+', $argv[1])[0]), mb_strlen(trim(explode('+',$argv[1])[0])) - $i) === mb_substr(trim(explode('+',$argv[1])[1]), 0, $i)) 
        $j = $i;
echo (isset($j)) ?  trim(explode('+',$argv[1])[0]). mb_substr(trim(explode('+',$argv[1])[1]), $j) : 'error';

Ответ был сюда, лорифай шалит.

fernandos ★★★
()
Последнее исправление: fernandos (всего исправлений: 2)
Ответ на: комментарий от kompospec

Вот так вот всего за час голубь обыграл в шахматы лоровцев

goingUp ★★★★★
()
Ответ на: комментарий от fernandos

Ну тогда это вообще не задача, слишком примитивно же. Видимо сложность в том чтобы посплитить по плюсику, ололо.

Впрочем, чего ещё ожидать от ТС?

WitcherGeralt ★★
()
Ответ на: комментарий от fernandos

О! Первое решение. PHP замечательный язык. После Перл, конечно. Сейчас проверю ваш код. Трудно было строку в код засунуть?

kompospec
() автор топика

Де ве по де те?

Зачем нам разговаривать с Андреем, что не знает про жадность?

javascript
()

Необходимо для каждой пары слов получить новое слово, так, чтобы окончание первого совпадало с началом второго, например, шлакоблок + окунь = шлакоблокунь.

Перл годится только для решения никому не нужных выдуманных задач. Так и запишем.

X512 ★★★★★
()
Ответ на: комментарий от WitcherGeralt

Ну тогда это вообще не задача, слишком примитивно же

Я чего-то интересного и не ожидал.

Я просто взял практически первое попавшаяся задание.

Видимо сложность в том чтобы посплитить по плюсику, ололо

Сложность в том, чтобы хоть как-то оправдать нужность перла, пока не вышло.

fernandos ★★★
()
Ответ на: комментарий от kompospec

PHP замечательный язык

Для веба.

Трудно было строку в код засунуть

Чтобы для тестирования на нескольких примерах нужно было редактировать код? Нет, спасибо.

fernandos ★★★
()
Ответ на: комментарий от WitcherGeralt

Видимо сложность в том чтобы посплитить по плюсику, ололо.

Вангую, что у ОП припасен какой-то банальный перловский хак, которым он нас в конце собирается поразить

goingUp ★★★★★
()
Последнее исправление: goingUp (всего исправлений: 1)
Ответ на: комментарий от kompospec

Проверил. Работает. Итак. Задача решена для Перл и PHP

Для остальных Супер пупер языков решения пока нет

kompospec
() автор топика
Ответ на: комментарий от fernandos

Так не в сложности дело, а в том, чтобы на выполнение требовалось хоть какое-то значимое количество строк.

WitcherGeralt ★★
()
Ответ на: комментарий от X512

Написано - Первый курс института. Написано - срок неделя. Вроде даже как деньги обещают

kompospec
() автор топика
Ответ на: комментарий от kompospec

Ты чего придуриваешься? Есть у тебя решение.

Держи с плюсом:

import difflib, sys
s = difflib.SequenceMatcher(None, *sys.argv[-1].replace(' ', '').lower().split('+', 2))
m = s.find_longest_match()
print(s.a[:m.a]+s.b if m.a > m.b or m.a == m.b and len(s.a) < len(s.b) else s.b[:m.b]+s.a)


Пример использования: $ python s.py "рельса + форель"

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 2)
Ответ на: комментарий от kompospec

x = lambda x, y: x[-2:] + y[2:] if x != y[:len(x)] else y

переобувайся быстрей и проверяй. я же под тебя переобуваюсь. суперпуперпитон тебя побеждает, а ты молчишь. *лицонегр*

я и «+» туда впихну если чо.

usi_svobodi
()
Последнее исправление: usi_svobodi (всего исправлений: 1)

Необходимо для каждой пары слов получить новое слово, так, чтобы окончание первого совпадало с началом второго

Зачем?

ox55ff ★★★★★
()
Ответ на: комментарий от kompospec

Вы вообще просили решение задачи, про область применения и речь не шла.

А я про то, что как только вы вынимаете ПХП из среды веба и помещаете где-то далеко, начинается хаос.

fernandos ★★★
()
Ответ на: комментарий от WitcherGeralt

Мы решаем задачку для студента, чтобы ТС потом продал ему лучшее решение.

И все провалится, потому что никто не хочет хардкодить строку)

goingUp ★★★★★
()
Ответ на: комментарий от fernandos

Ты выложил код на форуме, дал слабину, выставил себя уязвимым.

Пока кода нету можно сколько угодно критиковать других, но не быть критикуемым. Ты как первый день на ЛОРе

vertexua ★★★★★
()
Ответ на: комментарий от WitcherGeralt

Вот вам смешно, а представьте, что где-то далеко студентов учат как-то так.

fernandos ★★★
()
Ответ на: комментарий от WitcherGeralt

miltorg@noutmiltorg:~$ python3 s.py «рельса + форель» Traceback (most recent call last): File «s.py», line 3, in m = s.find_longest_match() TypeError: find_longest_match() missing 4 required positional arguments: ‘alo’, ‘ahi’, ‘blo’, and ‘bhi’ miltorg@noutmiltorg:~$

kompospec
() автор топика
Ответ на: комментарий от micronekodesu

Втоплю тоже за питон!

wm.py

import sys
for line in sys.stdin:
    first, second = line.split()
    best = next(i for i in range(0, len(first)) if second.startswith(first[i:]))
    print(first[:best] + second) if best is not None else print(first + second)

input.txt

шлакоблок окунь
папа папаха
карусель сельдь
спорткар карась
форель рельса
cat input.txt | python3 wm.py
шлакоблокунь
папаха
карусельдь
спорткарась
форельса
anonymous-angler ★☆
()
Ответ на: комментарий от kompospec

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

import sys
for line in sys.stdin:
    first, second = line.replace('+', '').split()
    best = next(i for i in range(0, len(first)) if second.startswith(first[i:]))
    print(first[:best] + second) if best is not None else print(first + second)
шлакоблок + окунь
папа + папаха
карусель + сельдь
спорткар + карась
форель + рельса
anonymous-angler ★☆
()
Ответ на: комментарий от WitcherGeralt

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

WitcherGeralt ★★
()
Ответ на: комментарий от oxo

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

WitcherGeralt ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.