코드 골프 : 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.