* Назва мови * приголомшливий!


13

Напишіть програму будь-якою мовою, яка зчитує вхід зі stdin та видає трохи модифікований вихід у stdout. Програма повинна запозичити деякі символи з введення та виведення якомога більше префікса, за *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!як тестовий випадок?
Денніс

Гарний тестовий випадок! Додано.
Філіп Хаглунд

Як слід обробляти випадки з повторними символами (або в імені, або у вводі)? Чи має значення порядок залишених символів на виході?
Пітер Тейлор

Вупи! Виправлено це. Також уточнили, що будь-який персонаж може бути запозичений, не тільки перший.
Філіп Хаглунд

Відповіді:


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

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


Він повинен запозичувати лише символи, тому якщо у введенні є декілька нових рядків, ви позичите лише один з них. Усі символи повинні залишатися там у вихідному, але не обов'язково в одному порядку.
Філіп Хаглунд

1

Пітон, 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>


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перемикач введення робить читання і друк на виході неявним.


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 допомогла значно скоротити його. Я думаю, що ще є місце для вдосконалення. Як завжди, пропозиції вітаються!


Помилка при відсутності нового рядка у введенні. Тест obj-> job, не слід змінювати (правило 3)
edc65

@ edc65 Ага, так, тестові випадки охоплюють лише 75% кращих випадків. Я навіть міг зняти, is awesomeі він би все ще працював належним чином на всіх чотирьох. Я виправлю це якнайшвидше.
ETHproductions
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.