* ชื่อภาษา * ยอดเยี่ยม!


13

เขียนโปรแกรมในภาษาใด ๆ ที่อ่านอินพุตจาก stdin และเอาต์พุตเอาต์พุตที่แก้ไขเล็กน้อยไปยัง stdout โปรแกรมควรยืมอักขระบางตัวจากอินพุทและเอาท์พุทที่มีขนาดใหญ่ของคำนำหน้ามากที่สุด*language-name* is awesome!ตามด้วยการขึ้นบรรทัดใหม่แล้วสิ่งที่เหลืออยู่ของอินพุท

  • อินพุตไม่มีอักขระตัวพิมพ์ใหญ่ใด ๆ
  • หากอักขระตัวแรกของชื่อภาษาไม่มีอยู่ในสตริงควรมีการยืมเฉพาะอักขระบรรทัดใหม่
  • หากไม่มีอักขระบรรทัดใหม่ในอินพุตให้เอาต์พุตอินพุตที่ไม่ได้แก้ไข
  • ไม่สำคัญว่าคุณจะยืมตัวละครตัวไหน

ฉันใช้\nเป็นอักขระบรรทัดใหม่ ( 0x0a) เพื่อประหยัดพื้นที่เมื่อเขียน โปรแกรมจริงควรสนใจอักขระที่ขึ้นบรรทัดใหม่จริงเท่านั้นไม่ใช่\nสตริง

ตัวอย่าง: python
การป้อนข้อมูล: abcdefghijklmnopqrstuvwxyz\n0123456789
เอาท์พุท: python\nabcdefgijklmqrsuvwxz0123456789
ตั้งแต่การป้อนข้อมูลที่ไม่ได้มีช่องว่างใด ๆ isเราไม่สามารถดำเนินการต่อไปแม้ว่าเราจะมีตัวละครพอสำหรับคำถัดไป:

ตัวอย่าง: C.
อินพุต: i don't see anything!
เอาต์พุต: i don't see anything!
ไม่พบ C ในสตริงจึงไม่สามารถทำการปรับเปลี่ยนได้ นอกจากนี้ยังไม่มีอักขระขึ้นบรรทัดใหม่

ตัวอย่าง: C ++
อินพุต: i don't\nsee anything!
เอาต์พุต: \ni don'tsee anything!
C ไม่พบในสตริงดังนั้นจึงไม่สามารถทำการปรับเปลี่ยนได้

ตัวอย่าง: Obj-C
อินพุต: objectively, clojure is amazing.\nq.e.d.
เอาต์พุต: obj\nectively, clojure is amazing.q.e.d.
อินพุตมีอักขระเพียงพอที่จะเขียนobjแต่-ขาดหายไป

จำนวนไบต์ของซอร์สโค้ดของคุณลบด้วยจำนวนไบต์ของชื่อภาษาของคุณ, utf-8 ที่เข้ารหัส (ถ้าเป็นไปได้) คือคะแนนของคุณ ชนะต่ำสุด!


3
หวังว่าบางคนจะพบภาษาที่มีการทำซ้ำจำนวนมากในชื่อของคะแนนลบ :)
Filip Haglund

คุณสามารถรวมi don't\nsee anything!เป็นกรณีทดสอบได้หรือไม่?
Dennis

กรณีทดสอบที่ดี! ที่เพิ่ม
Filip Haglund

ควรจัดการกับกรณีที่มีอักขระซ้ำ (ในชื่อหรือในอินพุต) ได้อย่างไร? ลำดับของตัวอักษรที่เหลือในการส่งออกสำคัญหรือไม่
Peter Taylor

woops! ซ่อมมัน. ชี้แจงด้วยว่าตัวละครทุกตัวสามารถยืมได้ไม่ใช่แค่ตัวแรก
Filip Haglund

คำตอบ:


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

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

ลองออนไลน์


ควรยืมตัวอักษรเท่านั้นดังนั้นหากมีการขึ้นบรรทัดใหม่หลายรายการคุณจะยืมได้เพียงหนึ่งบรรทัดเท่านั้น อักขระทั้งหมดควรยังคงอยู่ในผลลัพธ์ แต่ไม่จำเป็นต้องอยู่ในลำดับเดียวกัน
Filip Haglund

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

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

นี่คือรูปแบบที่จัดรูปแบบและแสดงความคิดเห็น:

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)

เป็นฟังก์ชันส่งคืน ouput ที่ร้องขอ เป็นการยากที่จะนำไปใช้กับ I / O เนื่องจาก 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.