* 언어 이름 *은 대단합니다!


13

stdin에서 입력을 읽고 약간 수정 된 출력을 stdout으로 출력하는 모든 언어로 프로그램을 작성하십시오. 프로그램은 입력에서 일부 문자를 빌려와 가능한 한 큰 접두어를 입력하고 *language-name* is awesome!그 뒤에 줄 바꿈을 입력 한 다음 입력 된 문자를 가져와야합니다.

  • 입력에 대문자가 포함되어 있지 않습니다.
  • 언어 이름의 첫 문자가 문자열에 없으면 개행 문자 만 빌려야합니다.
  • 입력에 줄 바꿈 문자가 없으면 입력을 수정하지 않고 출력하십시오.
  • 빌릴 수있는 캐릭터 중 어느 것이 중요하지 않습니다.

내가 사용하고 \n개행 문자 (로 0x0a기록 할 때 공간을 절약하기 위해). 실제 프로그램은 \n문자열이 아니라 실제 개행 문자에만 관심을 가져야 합니다.

예 : 파이썬.
input : abcdefghijklmnopqrstuvwxyz\n0123456789
output : 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.
input : objectively, clojure is amazing.\nq.e.d.
output : obj\nectively, clojure is amazing.q.e.d.
입력에 쓸 수있는 문자가 충분 obj하지만이 ( -가) 없습니다.

소스 코드의 바이트 수에서 언어 이름의 바이트 수에서 utf-8로 인코딩 된 경우 (가능한 경우)는 점수입니다. 최저 승!


3
하자의 희망 사람 : 부정적인 점수의 이름에서 반복의 많은 언어를 발견
필립 Haglund

i don't\nsee anything!테스트 사례로 포함시킬 수 있습니까?
Dennis

좋은 테스트 사례! 추가되었습니다.
Filip Haglund

반복되는 문자 (이름 또는 입력)가있는 케이스는 어떻게 처리해야합니까? 출력에서 남은 문자의 순서가 중요합니까?
피터 테일러

웁스! 고쳤다. 또한 첫 번째 캐릭터뿐만 아니라 모든 캐릭터를 빌릴 수 있음을 분명히했습니다.
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

파이썬, 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

파이썬, 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

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

자바 스크립트 (ES6) 90 (100-10)

요청 된 출력을 반환하는 함수로. STDIN의 일반적인 대체 prompt()가 입력 문자열 내부에서 줄 바꿈을 허용하지 않는 I / O로 구현하기가 어렵습니다 .

실제 출력 (을 사용하여 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

자바 스크립트 (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 Ah, 그렇습니다. 테스트 케이스는 엣지 케이스의 75 % 만 커버합니다. 나는 심지어 제거 할 수 있었고 is awesome여전히 네 가지 모두에서 제대로 작동합니다. 최대한 빨리 수정하겠습니다.
ETHproductions
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.