코드 골프 : sdrawkcaB 전달 sdrawkcaB 전달 sdrawkcaB 전달


14

직무

  • 사용자는 문장을 입력합니다 (단어 만). 정수 및 문장 부호를 포함하여 문자 나 공백 이외의 입력은 "문장 만 사용해야합니다"라는 예외를 발생시켜야합니다.
  • 출력에는 패턴이 있으며 일부 단어는 반전되고 다른 단어는 정상입니다.
  • 패턴은 일반 단어로 시작하고 다음 두 단어는 반대로 된 후 다음 두 단어는 정상이며 패턴은 계속됩니다.
  • 단어가 정상이어야하는 단어와 반대 단어의 예는 다음과 같습니다.

보통-반전-반전-보통-보통-반전-반전-보통 ...

입력 예

그녀는 바다 해안에 바다 조개를 판매

출력 예

그녀는 aeS 해안에 aeS 포탄을 훔칩니다

추가 규칙

  • 대문자를 사용하는 경우 원래 게시 된 문자에 남아 있어야합니다.
  • 처음에 입력에 게시 된 여러 공백은 하나의 공백으로 줄여야합니다. 예를 들어 Programming Puzzles and Code Golf진다Programming selzzuP dna Code Golf

최단 코드 승리!

행복한 코딩 ...


8
많은 프로그래밍 언어에는 예외가 없습니다.
— Doorknob

15
@nimi 그런 사소한 이유로 도전을 언어의 작은 하위 집합으로 제한하는 것은 전적으로 불필요합니다.
— Doorknob

10
그렇지 않으면 좋은 도전은 규칙에 의해 파괴됩니다. Any input other than letters or spaces, including integers and punctuation, should throw an exception: "Sentence must only use letters".이는 단어를 뒤집는 도전과 전혀 관련이없는 보조 작업을 구현하고, 예외가없는 언어를 잘라 내고, 많은 문자열을 차지하는 긴 문자열을 하드 코딩하거나 압축해야 함을 의미합니다. 바이트 수
— xnor

2
@Belfield 네, 당신의 바인드가 보입니다. 나는 당신이 지금 할 수있는 일이 없다고 생각합니다. 향후에는 샌드 박스 에 게시하여 게시하기 전에 피드백을 받으십시오.
— xnor

3
@Belfield 좋은 도전은 좋은 대답보다 훨씬 어렵습니다. 나는 어쨌든 이것을 즐겼고, 다음은 더 나아질 것이다.
— edc65

답변:


15

TeaScript , 55 바이트 58 60 69 76 78 80 87 89

xO`a-z `?xl(#~-i&2?l:lv(),/ +/):Ld`SÀZn­ Û § «e Ò5s`

이것은 매우 짧습니다, 나는 그것에 매우 만족합니다.

마지막 ~ 20자는 횡설수설처럼 보이지만 "문장은 문자 만 사용해야합니다."입니다. 모든 문자는 256 이하의 문자 코드를 가지므로 각각 1 바이트

설명

xO`a-z `?  // If input contains only a-z and space...

   xl(#       // Loop through input 
      ~-i&2?  // If (index - 1 "unary and"ed with 2) isn't 0...
          :l,     // Leave alone
          lv()    // Otherwise, reverse string
       / +/ // Loops on spaces
   )

:Ld`SÀZn­ Û § «e Ò5s` // Otherwise... decompress and print  the error string

테스트를 게시 해 주셔서 감사합니다. 매우 좋습니다. 오류가 발생하면 모든 사람이 같은 보트에 있습니다-그 라인 골프 없음
— Belfield

이상합니다. 이제 Firefox에서 작동합니다. 그러나 나는 또한 이전에 Firefox를 사용했습니다.
— Jakube

지금까지 가장 좋은 답변!
— Belfield

뭐? 피쓰를 이겼어?! JS 기반 언어로?!? 어떻게 가능합니까?!?!
— ETHproductions

2
@ETHproductions Dennis가 경쟁하지 않는 한 항상 이길 수 있습니다 : p
— Downgoat

4

하스켈, 141 바이트

r=reverse
f x|all(`elem`(' ':['a'..'z']++['A'..'Z']))x=unwords$zipWith($)(cycle[id,r,r,id])$words x|1<2=error"Sentence must only use letters"

코드의 거의 2/3가 오류 검사 용입니다. 최초의 실제 도전 과제 인 것 같습니다.

unwords$zipWith($)(cycle[id,reverse,reverse,id])$words x입력을 단어 목록으로 나누고, 사이클링 기능 목록으로 압축 한 다음 [id,reverse,reverse,id,id,reverse...]공백으로 결과를 단일 문자열로 결합하는 작업이 수행됩니다 .

2 바이트 동안 @Christian Irwan에게 감사드립니다.


"문장은 사용자 문자 만 사용해야합니다"는 "문장 만 사용해야합니다"로 변경할 수 있습니다. 오류가 잘못되었습니다!
— Belfield

@Belfield : 고정
— nimi

왜 안돼 r=reverse?
— Akangka

@ChristianIrwan : 감사합니다! (초기 버전에서는 이름이없는 포인트 프리 기능 이 있었으므로 누락으로 인해 두 번 사용 reverse하고 r=reverse길이가 동일했습니다 f=. 포인트 프리가 아닌 것으로 이동할 때 다시 확인하지 않았습니다).
— nimi

3

자바 스크립트 (ES6) 122

f=s=>/[^a-z ]/i.test(s)?"Sentence must only use letters":s.split(/ +/).map((w,i)=>~-i&2?w:[...w].reverse().join``).join` `

alert(f(prompt('?','She sells Sea shells on the Sea shore')))


입력에 줄 바꿈이 있으면 오류가 발생합니다. 예에서 나는 이것이 일어날 것으로 생각되지 않습니다.
— Downgoat

1
@ Vɪʜᴀɴ 그것은 까다 롭습니다.이 예제는 여러 공백에 관한 것이지만 여러 공백이 없습니다-단 1 줄 바꿈. 나는 그것이 SO 편집기에 의해 엉망이라고 생각합니다. 우리는 줄 바꿈 및 기타 일반적인 공간, 2에 의해 바이트 수의 증가를 관리해야하는 경우
— edc65

2

레티 나 , 103 바이트

\s+

(?<=^\S+ (\S+ )?((\S+ ){4})*)
;
+`(;\S*)(\S)
$2$1
;

i`.*[^a-z ].*
Sentence must only use letters

두 번째 줄에는 SE가 삼키는 것처럼 보이는 공간이 하나 있어야합니다. -s플래그 를 사용하여 단일 파일에서 코드를 실행하십시오 .

Retina에는 예외 개념이 없으므로 Sentence must only use letters입력에 공백이 아닌 비 공백 문자가 있으면 출력이 단순히 대체됩니다 .



2

파이썬 163 160 157 145

k=raw_input()
k=["Sentence tsum ylno use letters",k][k.replace(' ','').isalpha()]
for i,x in enumerate(k.split()):print x[::-1if(i+1)/2%2else 1],

15 자 삭제, Mego !!


그렇습니다. 두려운 니미에는 요점이 있습니다.
— Belfield

쏴 버렸어 수정하겠습니다.
— 무스

@Mego, re.search는 결과를 찾을 수없는 경우 None (인덱스로 사용할 수 없음)을 반환하며 "! = None"을 추가하는 것은 실제로 내 원래 방법보다 1 바이트 더 깁니다. 그래도 마지막 두 줄을 병합하여 3 바이트를 절약했습니다. 감사!
— Moose

1

배쉬 + 코어 유틸리티, 108

[ ${@//[a-zA-Z]/} ]&&echo Sentence must only use letters||for t;{
((++i/2%2))&&rev<<<$t||echo $t
}|tr \\n \ 

이 프로그램의 마지막 문자는 공백입니다.

입력은 명령 행에서 가져옵니다.

$ ./norrevvevnor.sh Programming Puzzles and Code$'\n' Golf
Programming selzzuP dna Code Golf $ 
$ ./norrevvevnor.sh Programming Puzzles and Code$'\n' Golf1
Sentence must only use letters
$ 


1

줄리아, 109 바이트

s->(i=0;join([isalpha(w)?(i+=1)%4>1?reverse(w):w:error("Sentence must only use letters")for w=split(s)]," "))

i=0그리고 (i+=1)%4>1각 단어가 도착 여부를 결정하는 데 사용되는 reverseD 또는 없습니다. 문자가 아닌 문자가 있는지 여부를 판별하기 위해 isalpha사용 된 단어에 적용됩니다 split(s)(이 시점에서 공백이 이미 제거되었습니다). join를 처리하지 않으면 조작 후 문자열을 복원합니다 error.


1

줄리아 150 134 바이트

s->ismatch(r"[^a-z ]"i,s)?error("Sentence must only use letters"):(i=3;join([(i+=1;isodd((i+1)i÷2)?reverse(w):w)for w=split(s)]," "))

언 골프 드 :

function f(s::AbstractString)
    if ismatch(r"[^a-z ]"i, s)
        error("Sentence must only use letters")
    else
        i = 3
        a = [(i += 3; isodd((i + 1)i ÷ 2) ? reverse(w) : w) for w = split(s)]
        return join(a, " ")
    end
end

Glen O 덕분에 16 바이트를 절약했습니다!


다른 것보다 먼저 초기 조건의 논리를 되돌리고 r그 결과로 할당하는 것이 좋습니다 . 즉, r=ismatch(...)||error(...)-몇 개의 문자를 잘라 내고 사용하는 조건을 반대로 바꿉니다 r. 더 절약 할 것으로 의심됩니다
— Glen O

사소한 수정-나는 ||부정을 다루어야했고 부정이 필요하지 않다는 것을 깨달았습니다. 로 되돌립니다 &&. 더 나은 방법으로 ?:대신 사용하십시오 . s->(r=ismatch(r"[^a-z ]"i,s))?error("Sentence must only use letters"):join([(iseven(i)&&(r=!r);r?reverse(w):w)for(i,w)=enumerate(split(s))]," ")144 바이트 그리고 나는 내가 더 잘할 수 있다고 생각합니다 join...
— Glen O

다음은 134 바이트의 능률적 인 솔루션 버전입니다.s->ismatch(r"[^a-z ]"i,s)?error("Sentence must only use letters"):(i=3;join([(i+=1;isodd((i+1)i÷2)?reverse(w):w)for w=split(s)]," "))
— Glen O

@GlenO 멋진 제안, 감사합니다!
— Alex A.

0

Pyth, 55 바이트

?--rz0Gd"Sentence must only use letters"jd.e_W%%k4 3bcz

%%k4 3Pietu1998 에서 조금 빌려 주었습니다. 추가 바이트 1 개를 저장했습니다.

온라인으로 사용해보십시오 : 데모 또는 테스트 스위트

설명

?--rz0Gd"..."jd.e_W%%k4 3bcz   implicit: z = input string
   rz0                         convert z to lower-case
  -   G                        remove all letters
 -     d                       remove all spaces
?                              if there is some chars left than
        "..."                    print the string "Sentence must only ..."
                               else:
                          cz     split z by spaces or multiple spaces
               .e                map each pair (k index, b string) of ^ to: 
                 _       b          b or reversed of b, depending on
                  W%%k4 3           (k mod 4) mod 3
             jd                  join the result by spaces


0

자바, 215 바이트

정규식은 재미있다

s->{if(s.split("[^a-zA-Z ]").length>1)throw new Error("Sentence must only contains letters");else{int i=1;for(String a:s.split(" "))System.out.print((i++%2<1?new StringBuffer(a).reverse():a)+(a.isEmpty()?"":" "));}}

온라인으로 사용해보십시오!


출력이 현재 올바르지 않습니다. 당신은 이제 출력 She slles aeS shells no the aeS shore하지만, She slles aeS shells on eht aeS shore대신 해야합니다 (첫 번째 정상; 2 쌍으로 번갈아 가며). 두 가지 문제가 발생합니다. i항목이 비어 있어도 증가 하고 대신 i++%2<1있어야합니다 i++%4>1. 여기 고정 211 바이트 버전입니다.
— Kevin Cruijssen

@KevinCruijssen 이것은 충분히주의 깊게 읽지 않아도 얻을 수있는 것입니다
— Benjamin Urquhart

0

젤리 , 39 바이트

³Ḳ¹ƇUJ2&TƲ¦K
“*[,ṛDṾȧƤ°Ġṛ©¦»
ØẠ” ṭ³eƇ⁼£

온라인으로 사용해보십시오!

Outgolfer Erik에게 감사합니다. 그는 약간의 여분의 바이트와 많은 시간의 좌절에서 나를 구했습니다.

다음은 46 바이트 솔루션입니다

입력에 유효하지 않은 문자가 포함되어 있으면 실제로 파이썬 구문 오류가 발생합니다.

³Ḳ¹ƇUJ2&TƲ¦K
“çỤḷṁŀDṀẠṠGmḟĖƲƑ⁽Ḳḟ»ŒV
ØẠ” ṭ³eƇ⁼£

온라인으로 사용해보십시오!


0

Japt v2.0a0 -S, 41 바이트

¸¬è\L ?`SÀZn­ Û § «e Ò5s`:UeS²S ¸ËzEc2

시도 해봐

¸¬è\L ?`...`:UeS²S ¸ËzEc2     :Implicit input of string U
¸                             :Split on spaces
 ¬                            :Join
  è                           :Count occurrences of
   \L                         :RegEx /[^A-Z]/gi
      ?`...`:                 :If truthy return the compressed string "Sentence must only use letters", else
             Ue               :Recursively replace in U
               S²S            :  Two spaces with one
                   ¸          :Split on spaces
                    Ë         :Map each element at 0-based index E
                     z        :  Rotate clockwise by 90 degrees multiplied by
                      Ec2     :    E rounded up to the nearest multiple of 2
                              :Implicit output, joined with spaces

0

05AB1E , 36 바이트

ðKDáÊi“¸–ƒ—€É€Å™ê“.ªFë#áεN4%>2÷iR]ðý

온라인으로 사용해보십시오.

입력에 포함되지 않은 경우 다음 오류가 발생합니다. [A-Za-z ] .

(런타임 오류) 문장을 변환 할 수 없음 문자는 정수로만 사용해야합니다.

설명:

ðK                   # Remove all spaces from the (implicit) input-string
  Dá                 # Create a copy, and remove everything except for letters from this copy
    Êi               # If the copy with letters removed and the original are NOT equal:
      “¸–ƒ—€É€Å™ê“   #  Push dictionary string "sentence must only use letters"
                  .ª #  With sentence capitalization
      F              #  And try to loop that many times, causing the error above
     ë               # Else:
      #              #  Split the (implicit) input-string on spaces
       á             #  Only keep letters (which will remove empty items caused by multiple
                     #  adjacent spaces in the input, which is shorter than `õK`)
        ε            #  Map each word to:
         N4%>2÷      #   Calculate ((index modulo-4) + 1) integer-divided by 2
                     #   (results in 0,1,1,2,0,1,1,2,0,1 for indices 0,1,2,3,4,5,6,7,8,9)
               i     #   If this is exactly 1:
                R    #    Reverse the current word
     ]               # Close the if-statement, map, and if-else statement
      ðý             # Join the modified word-list by spaces
                     # (and then output it implicitly as result)

내이 05AB1E 팁을 참조하십시오 (섹션 어떻게 사전을 사용하는 방법을? ) 이유를 이해하는 “¸–ƒ—€É€Å™ê“것입니다 "sentence must only use letters".


당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.