* Nazwa języka * jest niesamowita!

13

Napisz program w dowolnym języku, który odczytuje dane wejściowe ze standardowego wejścia i wysyła nieco zmodyfikowane dane wyjściowe na standardowe wyjście. Program powinien pożyczyć niektóre znaki z wejścia i wyjścia tak duży, jak to możliwe, *language-name* is awesome!a następnie nowy wiersz, a następnie resztę z wejścia.

  • Dane wejściowe nie zawierają wielkich liter.
  • Jeśli pierwszy znak nazwy języka nie jest obecny w ciągu, należy pożyczyć tylko znak nowej linii.
  • Jeśli na wejściu nie ma znaku nowej linii, wypisz dane wejściowe w niezmodyfikowany sposób.
  • Nie ma znaczenia, którą z dostępnych postaci pożyczysz.

Używam \njako znaku nowej linii ( 0x0a), aby zaoszczędzić miejsce podczas pisania. Prawdziwy program powinien dbać tylko o prawdziwy znak nowej linii, a nie o \nciąg znaków.

Przykład: python.
Wejście: abcdefghijklmnopqrstuvwxyz\n0123456789
Wyjście: python\nabcdefgijklmqrsuvwxz0123456789
Ponieważ wejście nie ma żadnych spacji, nie możemy kontynuować chociaż mamy wystarczającą ilość znaków do następnego słowa: is.

Przykład: C.
input: i don't see anything!
output: i don't see anything!
C nie znaleziono w łańcuchu, więc nie było możliwości modyfikacji. Ponadto nie ma znaku nowej linii.

Przykład: C ++.
input: i don't\nsee anything!
output: \ni don'tsee anything!
C nie został znaleziony w ciągu, więc nie było możliwości modyfikacji.

Przykład: Obj-C.
input: objectively, clojure is amazing.\nq.e.d.
output: obj\nectively, clojure is amazing.q.e.d.
Dane wejściowe zawierają wystarczającą liczbę znaków do napisania, objale -brakuje.

Liczba bajtów kodu źródłowego minus liczba bajtów nazwy twojego języka, zakodowana w utf-8 (jeśli to możliwe), jest twoim wynikiem; najniższe wygrane!

Filip Haglund
źródło
3
Miejmy nadzieję, że ktoś znajdzie język z dużą ilością powtórzeń w nazwie dla negatywnego wyniku :)
Filip Haglund
Czy możesz podać i don't\nsee anything!jako przypadek testowy?
Dennis
Dobra walizka testowa! Dodany.
Filip Haglund
Jak powinny być obsługiwane przypadki z powtarzającymi się znakami (w nazwie lub na wejściu)? Czy kolejność pozostawionych znaków w wydruku ma znaczenie?
Peter Taylor
Woops! Naprawione. Wyjaśniono również, że można pożyczyć dowolną postać, nie tylko pierwszą.
Filip Haglund,

Odpowiedzi:

4

Pyth, 37 bajtów

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

Kod źródłowy ma 41 bajtów . Wypróbuj online.

Jak to działa

  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.
Dennis
źródło
2

Python, 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

Wypróbuj online

Mego
źródło
Powinien pożyczać tylko znaki, więc jeśli na wejściu znajduje się wiele znaków nowej linii, pożyczasz tylko jeden z nich. Wszystkie znaki powinny nadal znajdować się na wyjściu, ale niekoniecznie w tej samej kolejności.
Filip Haglund
1

Python, 146 bajtów

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)
Doktor
źródło
@Dennis naprawił to -_-
TheDoctor
Nadal o jedną nową linię za dużo, jeśli dane wejściowe nie zawierają nowych linii (drugi przykład).
Dennis
1

Cejlon, 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);}

Oto sformatowana i skomentowana wersja:

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);
}

Używa replaceLastzamiast tego, replaceFirstponieważ jest krótszy.

Niektóre przykładowe dane wejściowe i wyjściowe w tym samym formacie co w pytaniu:

  • 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.
Paŭlo Ebermann
źródło
0

JavaScript (ES6) 90 (100-10)

Jako funkcja zwraca żądany wynik. Trudno go wdrożyć za pomocą I / O, ponieważ zwykłym zamiennikiem STDIN jest to prompt(), że nie akceptuje nowego wiersza w ciągu wejściowym.

Jako funkcja z rzeczywistym wyjściem (używaniem alert) liczba bajtów wynosi 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))

Przetestuj uruchomienie poniższego fragmentu w przeglądarce zgodnej z EcmaScript 6 (implementacja operatora rozkładania i funkcji strzałek - używam 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
źródło
0

Perl, 72–4 = 68 bajtów

Zawiera 2 przełączniki.

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

Objaśnienie : Dla każdego znaku w ciągu "\nperl is awesome"usuń odpowiedni znak z ciągu wejściowego ( $_), dopóki nie znajdziemy znaku, którego nie ma w $_. Przechowywane są pasujące znaki, w $pktórych jest przedrostek, $_a następnie drukowane.

-0Przełącznik odczytuje w pełnym wejściu zamiast linii po linii i -pprzełącznik umożliwia wejście czytanie i drukowanie wyjście niejawny.

svsd
źródło
0

JavaScript (ES7), 101 107–10 = 97

Było wcześniej krócej, a nawet działało na wszystkich czterech testowych przypadkach, ale najwyraźniej nie przestrzegałem żadnej reguły, więc ...

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)

Działa poprawnie w Firefoksie 42. Początkowo miał on 119 bajtów, ale sztuczka z odpowiedzi @ edc65 pomogła go znacznie skrócić. Myślę, że jest jeszcze miejsce na ulepszenia. Jak zawsze sugestie mile widziane!

ETHprodukcje
źródło
Nie działa, gdy brakuje nowego wiersza na wejściu. Test obj-> job, nie powinien być modyfikowany (reguła 3)
edc65
@ edc65 Ach, tak, przypadki testowe obejmują tylko 75% przypadków skrajnych. Mógłbym nawet usunąć is awesomei nadal działałby poprawnie na wszystkich czterech. Naprawię to jak najszybciej.
ETHprodukcje