* Dil adı * harika!


13

Stdin'den girişi okuyan ve stdout'a biraz değiştirilmiş bir çıktı veren herhangi bir dilde bir program yazın. Program giriş ve çıkıştan bazı karakterleri olabildiğince büyük bir önek, *language-name* is awesome!ardından da bir satırsonu ve ardından girdiden geriye kalan kadar ödünç almalıdır .

  • Giriş, büyük harf içermiyor.
  • Dilde dil adının ilk karakteri yoksa, yalnızca yeni satır karakteri ödünç alınmalıdır.
  • Girişte yeni satır karakteri yoksa, girişi değiştirilmemiş olarak çıkarın.
  • Mevcut karakterlerden hangisini ödünç aldığınız önemli değildir.

Yazarken yerden tasarruf etmek \niçin yeni satır karakteri ( 0x0a) olarak kullanıyorum . Gerçek program \ndizgiyi değil, sadece gerçek yeni satır karakterini önemsemelidir .

Örnek: python.
girişi: abcdefghijklmnopqrstuvwxyz\n0123456789
çıkışı: python\nabcdefgijklmqrsuvwxz0123456789
giriş boşluk olmadığından, biz sonraki kelime için yeterli karakterler olsa bile devam edemez: is.

Örnek: C.
input: i don't see anything!
output: i don't see anything!
C dizede bulunamadı, bu nedenle değişiklik yapılamadı. Ayrıca, yeni satır karakteri yoktur.

Örnek: C ++.
input: i don't\nsee anything!
output: \ni don'tsee anything!
C dizede bulunamadı, bu yüzden hiçbir değişiklik mümkün değildi.

Örnek: Obj-C.
input: objectively, clojure is amazing.\nq.e.d.
output: obj\nectively, clojure is amazing.q.e.d.
Girdi yazmak için yeterli karakter içeriyor objancak -eksik.

Kaynak kodunuzun bayt sayısı eksi dillerinizin adının bayt sayısı, utf-8 kodlu (mümkünse) puanınızdır; en düşük kazanç!


3
Umarım birisi olumsuz bir puan için adında çok fazla tekrarlanan bir dil bulur :)
Filip Haglund

i don't\nsee anything!Test örneği olarak dahil edebilir misiniz ?
Dennis

İyi test örneği! Katma.
Filip Haglund

Tekrarlanan karakterleri (adında veya girişinde) olan vakalar nasıl ele alınmalıdır? Çıktıdaki kalan karakterlerin sırası önemli mi?
Peter Taylor

Woops! Onu düzeltti. Ayrıca, sadece birincinin değil, herhangi bir karakterin ödünç alınabileceği açıklandı.
Filip Haglund

Yanıtlar:


4

Pyth, 37 bayt

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

Kaynak kodu 41 bayt uzunluğundadır. Çevrimiçi deneyin.

Nasıl çalışır

  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

Çevrimiçi deneyin


Yalnızca karakterleri ödünç almalıdır, bu nedenle girdide birden fazla yeni satır varsa, bunlardan yalnızca birini ödünç alırsınız. Tüm karakterler çıktıda bulunmalı, ancak aynı sırada olmamalıdır.
Filip Haglund

1

Python, 146 bayt

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 -_- düzelttim
TheDoctor

Giriş yeni satır içermiyorsa yine de bir satırsonu çok fazla (ikinci örnek).
Dennis

1

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

İşte biçimlendirilmiş ve yorumlanmış bir sürüm:

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

Bunun replaceLastyerine replaceFirstdaha kısa olduğu için kullanır .

Bazı örnek giriş ve çıkışlar, sorudakiyle aynı formatta:

  • 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)

İstenen çıkışa dönen bir işlev olarak. STDIN'in olağan ikamesi olduğu gibi prompt(), giriş dizesinin içindeki bir yeni satırı kabul etmeyen G / Ç ile uygulanması zordur .

Gerçek çıktıya sahip bir işlev olarak (kullanarak alert) bayt sayısı 107'dir

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

Aşağıdaki snippet'i EcmaScript 6 uyumlu bir tarayıcıda çalıştırmayı test edin (forma operatörü ve ok işlevi uygulama - FireFox kullanıyorum)

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 bayt

2 anahtar içerir.

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

Açıklama : Dizedeki her karakter için, bulunmayan bir karakter bulana kadar "\nperl is awesome"ilgili karakteri giriş dizesinden ( $_) kaldırın $_. Eşleşen karakterler, $piçine ön ek olarak kaydedilir ve $_daha sonra yazdırılır.

-0Geçiş tamamlandığında girdi ziyade çizgi-by-line okur ve -panahtar okuma giriş yapar ve çıkış örtük yazdırın.


0

JavaScript (ES7), 101 107-10 = 97

Daha önce kısaydı ve dört test vakasında bile çalıştı, ama görünüşe göre bir kuralı kaçırdım, bu yüzden ....

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'de düzgün çalışıyor. Bu başlangıçta 119 baytta başladı, ancak @ edc65'in cevabından bir püf noktası , onu büyük ölçüde kısaltmaya yardımcı oldu. Bence hala iyileştirilmesi gereken bir yer var. Her zaman olduğu gibi, öneriler hoş geldiniz!


Girişte yeni satır eksik olduğunda başarısız olur. Test obj-> job, değiştirilmemelidir (kural 3)
edc65

@ edc65 Ah, evet, test senaryoları kenar vakaların sadece% 75'ini kapsıyor. Hatta çıkarabiliyordum is awesomeve dördünde de düzgün bir şekilde çalışıyordu. Bunu en kısa sürede çözeceğim.
ETHproductions 26:15
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.