* Nama bahasa * luar biasa!

13

Tulis sebuah program dalam bahasa apa pun yang membaca input dari stdin dan mengeluarkan output yang sedikit dimodifikasi ke stdout. Program harus meminjam beberapa karakter dari input dan output sebagai awalan sebanyak mungkin *language-name* is awesome!diikuti oleh baris baru dan kemudian apa yang tersisa dari input.

  • Masukan tidak mengandung karakter huruf besar.
  • Jika karakter pertama dari nama bahasa tidak ada dalam string, hanya karakter baris baru yang harus dipinjam.
  • Jika tidak ada karakter baris baru dalam input, output input tidak dimodifikasi.
  • Tidak masalah karakter mana yang Anda pinjam.

Saya menggunakan \nsebagai karakter baris baru ( 0x0a) untuk menghemat ruang saat menulis. Program yang sebenarnya seharusnya hanya peduli pada karakter baris baru yang sebenarnya, bukan \nstring.

Contoh: python.
masukan: abcdefghijklmnopqrstuvwxyz\n0123456789
Output: python\nabcdefgijklmqrsuvwxz0123456789
Sejak input tidak memiliki spasi, kita tidak bisa terus meskipun kita memiliki cukup karakter untuk kata berikutnya: is.

Contoh: C.
input: i don't see anything!
output: i don't see anything!
C tidak ditemukan dalam string, jadi tidak ada modifikasi yang mungkin. Juga, tidak ada karakter baris baru hadir.

Contoh: C ++.
input: i don't\nsee anything!
output: \ni don'tsee anything!
C tidak ditemukan dalam string, jadi tidak ada modifikasi yang mungkin.

Contoh: Obj-C.
input: objectively, clojure is amazing.\nq.e.d.
output: obj\nectively, clojure is amazing.q.e.d.
Input berisi cukup banyak karakter untuk ditulis objtetapi -tidak ada.

Hitungan byte kode sumber Anda dikurangi hitungan byte nama bahasa Anda, utf-8 yang disandikan (jika memungkinkan), adalah skor Anda; kemenangan terendah!

Filip Haglund
sumber
3
Mari berharap seseorang menemukan bahasa dengan banyak pengulangan dalam nama untuk skor negatif :)
Filip Haglund
Bisakah Anda memasukkannya i don't\nsee anything!sebagai test case?
Dennis
Kasing uji bagus! Ditambahkan.
Filip Haglund
Bagaimana menangani kasus dengan karakter yang berulang (baik dalam nama atau dalam input)? Apakah urutan karakter sisa dalam output penting?
Peter Taylor
Aduh! Memperbaikinya. Juga diklarifikasi bahwa karakter apa pun dapat dipinjam, bukan hanya yang pertama.
Filip Haglund

Jawaban:

4

Pyth, 37 byte

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

Kode sumber panjangnya 41 byte . Cobalah online.

Bagaimana itu bekerja

  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
sumber
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

Cobalah online

Mego
sumber
Seharusnya hanya meminjam karakter, jadi jika ada beberapa baris baru di input, Anda hanya meminjam salah satunya. Semua karakter harus tetap ada di output, tetapi tidak harus dalam urutan yang sama.
Filip Haglund
1

Python, 146 byte

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)
Dokter
sumber
@Dennis memperbaikinya -_-
TheDoctor
Masih satu baris terlalu banyak jika input tidak mengandung baris baru (contoh kedua).
Dennis
1

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

Ini adalah versi yang diformat dan berkomentar:

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

Ini digunakan replaceLastalih-alih replaceFirstkarena lebih pendek.

Beberapa contoh input dan output dalam format yang sama seperti pada pertanyaan:

  • 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
sumber
0

JavaScript (ES6) 90 (100-10)

Sebagai fungsi mengembalikan ouput yang diminta. Sulit untuk diimplementasikan dengan I / O, karena pengganti STDIN yang biasa adalah prompt(), yang tidak menerima baris baru di dalam string input.

Sebagai fungsi dengan output nyata (menggunakan alert) jumlah byte adalah 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))

Tes menjalankan cuplikan di bawah ini di peramban yang mendukung EcmaScript 6 (menerapkan operator sebar dan fungsi panah - Saya menggunakan 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
sumber
0

Perl, 72 - 4 = 68 byte

Termasuk 2 sakelar.

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

Penjelasan : Untuk setiap karakter dalam string "\nperl is awesome", hapus karakter yang sesuai dari string input ( $_) hingga kami menemukan karakter yang tidak ada di $_. Karakter yang cocok disimpan di $pmana diawali dengan $_yang kemudian dicetak.

The -0beralih membaca di masukan lengkap daripada line-by-line dan -pswitch membuat masukan membaca dan mencetak output implisit.

svsd
sumber
0

JavaScript (ES7), 101 107 - 10 = 97

Itu lebih pendek sebelumnya, dan bahkan bekerja pada keempat kasus uji, tetapi ternyata saya melewatkan aturan, jadi ....

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)

Berfungsi dengan baik di Firefox 42. Ini awalnya dimulai pada 119 byte, tetapi trik dari jawaban @ edc65 membantu mempersingkat banyak. Saya pikir masih ada ruang untuk perbaikan. Seperti biasa, saran diterima!

Produksi ETH
sumber
Gagal saat kehilangan input baris baru. Tes obj-> job, tidak boleh dimodifikasi (aturan 3)
edc65
@ edc65 Ah, ya, semua test case hanya mencakup 75% dari edge case. Saya bahkan dapat menghapus is awesomedan itu masih akan bekerja dengan baik pada mereka berempat. Saya akan memperbaiki ASAP ini.
ETHproduk