* Имя языка * это здорово!

13

Напишите программу на любом языке, которая читает входные данные из стандартного ввода и выводит слегка измененные выходные данные в стандартный вывод. Программа должна заимствовать некоторые символы из ввода и вывода как можно большего префикса, за *language-name* is awesome!которым следует новая строка, а затем то, что осталось от ввода.

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

Я использую \nв качестве символа новой строки ( 0x0a), чтобы сэкономить место при записи. Настоящая программа должна заботиться только о настоящем символе новой строки, а не о\n строке.

Пример: питон.
вход: abcdefghijklmnopqrstuvwxyz\n0123456789
выход: python\nabcdefgijklmqrsuvwxz0123456789
Так как входные данные не имеют каких - либо пробелов, мы не можем продолжать , даже если у нас есть достаточное количество символов для следующего слова: is.

Пример: C.
input: i don't see anything!
output: i don't see anything!
C не найден в строке, поэтому изменение невозможно. Также нет символа новой строки.

Пример: C ++.
input: i don't\nsee anything!
output: \ni don'tsee anything!
C не найден в строке, поэтому никакая модификация невозможна.

Пример: Obj-C.
input: objectively, clojure is amazing.\nq.e.d.
output: obj\nectively, clojure is amazing.q.e.d.
вход содержит достаточно символов для записи, objно- отсутствует.

Количество байтов в вашем исходном коде за вычетом количества байтов в названии ваших языков, в кодировке utf-8 (если возможно), является вашим счетом; самые низкие победы!

Филип Хаглунд
источник
3
Будем надеяться, что кто-то найдет язык с большим количеством повторений в названии для отрицательного результата :)
Филип Хаглунд
Не могли бы вы включить i don't\nsee anything!в качестве теста?
Деннис
Хороший контрольный пример! Добавлен.
Филипп Хаглунд,
Как должны обрабатываться случаи с повторяющимися символами (либо в имени, либо во вводе)? Имеет ли значение порядок оставшихся символов в выводе?
Питер Тейлор,
Woops! Починил это. Также уточняется, что любой персонаж может быть заимствован, а не только первый.
Филип Хаглунд

Ответы:

4

Pyth, 37 байт

.-Jjb.zpef!.-TJ+,kb+Rb._"pyth is awesome!

Исходный код имеет длину 41 байт . Попробуйте онлайн.

Как это устроено

  Jjb.z                                      Save all user input in J.
                      ._"pyth is awesome!    Compute all prefixes that string:
                                               ["p", "py", ... ]
                   +Rb                       Append a linefeed to each prefix.
               +,kb                          Concatenate ["", "\n"] with the result.
         f                                   Filter the resulting array; for each T:
           .-TJ                                Perform bagwise difference between T
                                               and J (respects multiplicities).
         !                                     Take the logical NOT.
                                             Keep T if ! returned True, i.e., if J
                                             contains all of T's characters.
        e                                    Retrieve the last, longest match.
       p                                     Print it.
.-J                                          Remove its characters from J.
                                             (implicit) Print the result.
Деннис
источник
2

Питон, 186 - 6 = 180

import sys
a=sys.stdin.read()
s="python is awesome!"
r=''
if'\n'not in a:print a;exit()
a=a.replace('\n','',1)
for c in s:
 if c in a:a,r=a.replace(c,'',1),r+c
 else:break
print r+'\n'+a

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

Mego
источник
Он должен занимать только символы, поэтому, если на входе присутствует несколько новых строк, вы берете только один из них. Все символы должны присутствовать в выводе, но не обязательно в том же порядке.
Филипп Хаглунд,
1

Python, 146 байт

import sys
r=sys.stdin.read();y='\npython is awesome!';a=''
for i in y:
    if i in r:a+=i
    else:break
print a[1:]+'\n'+''.join(b for b in r if not b in a)
Доктор
источник
@Dennis это исправил -_-
TheDoctor
Еще одна новая строка слишком много, если ввод не содержит новых строк (второй пример).
Деннис
1

Цейлон, 235 - 6 = 229

void a(){variable value i="";variable value r="\nceylon is awesome!";while(exists l=process.readLine()){i=i+"\n"+l;}i=i.rest;for(j->c in r.indexed){if(c in i){i=i.replaceLast(c.string,"");}else{r=r[0:j];break;}}print(r.rest+r[0:1]+i);}

Вот отформатированная и закомментированная версия:

void a() {
    // our target string, with the \n shuffled to the start.
    variable value r = "\nceylon is awesome!";

    // read the whole input line by line
    // (there doesn't seem a way to do this shorter :-/)
    variable value i = "";
    while (exists l = process.readLine()) {
        i = i + "\n" + l;
    }
    // remove first \n:
    i = i.rest;
    for (j->c in r.indexed) {
        if (c in i) {
            // remove some occurence of c
            i = i.replaceLast(c.string, "");
        } else {
            // stop the loop, and take the part of `r` processed so far.
            r = r[0:j];
            break;
        }
    }
    // reshuffle first \n in r to its end.
    // This will result in the empty string if r is empty, i.e. no \n was found.
    print(r.rest + r[0:1] + i);
}

Он использует replaceLastвместо того, replaceFirstпотому что он короче.

Некоторые примеры входов и выходов в том же формате, что и в вопросе:

  • abcdefghijklmnopqrstuvwxyz\n0123456789ceylon\nabdfghijkmpqrstuvwxz0123456789
  • i don't see anything!i don't see anything!
  • i don't\nsee anything!\ni don't see anything!
  • objectively, closure is amazing.\nq.e.d.ceylon is a\nobjectivel, sureiamzng.\q..d.
Пауло Эберманн
источник
0

JavaScript (ES6) 90 (100-10)

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

Как функция с реальным выводом (используя alert) счетчик байтов равен 107

f=s=>alert(([...`
javascript is awesome`].every(c=>(z=s.replace(c,''))!=s&&(s=z,q?o+=c:q=c),q=o=''),o+q+z))

Протестируйте приведенный ниже фрагмент кода в браузере, совместимом с EcmaScript 6 (реализует оператор распространения и функцию стрелки - я использую FireFox)

f=s=>([...`
javascript is awesome`].every(c=>(z=s.replace(c,''))!=s&&(s=z,q?o+=c:q=c),q=o=''),o+q+z)

function test()
{
  O.innerHTML=f(I.value)
}

test()
#I {width: 80%}
<textarea id=I>
objectively, clojure is amazing.
q.e.d.</textarea><button onclick="test()">-></button>
<pre id=O></pre>

edc65
источник
0

Perl 72 - 4 = 68 байт

Включает 2 переключателя.

perl -0pe 'for$c("\nperl is awesome!"=~/./gs){s/$c//?$p.=$c:last}s/^/$p\n/;s/\n//'

Объяснение : Для каждого символа в строке "\nperl is awesome"удалите соответствующий символ из входной строки ( $_), пока мы не найдем символ, отсутствующий в $_. Сохраняются совпадающие символы, в $pкоторых указывается префикс, $_который затем печатается.

-0Переключатель считывает в полном вводе , а не строка за линией , а -pпереключатель ввода делает чтение и печать на выходе неявным.

svsd
источник
0

JavaScript (ES7), 101 107 - 10 = 97

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

x=>(i=r=q='',[for(c of`
javascript is awesome`)(y=x.replace(c,''),i||y==x?i=1:(c<' '?q=c:r+=c,x=y))],r+q+x)

В Firefox 42 работает должным образом. Первоначально он занимал 119 байт, но уловка из ответа @ edc65 помогла значительно сократить его. Я думаю, что есть еще место для улучшения. Как всегда, предложения приветствуются!

ETHproductions
источник
Сбой при отсутствии новой строки во вводе. Тест obj-> job, не следует изменять (правило 3)
edc65
@ edc65 Ах, да, тестовые случаи покрывают только 75% краевых случаев. Я мог бы даже удалить, is awesomeи это все равно будет работать должным образом на всех четырех из них. Я исправлю это как можно скорее.
ETHproductions