コードゴルフ:フォワードsdrawkcaBフォワードsdrawkcaBフォワードフォワードsdrawkcaB


14

仕事

  • ユーザーは文を入力します-単語のみ。整数や句読点など、文字やスペース以外の入力は例外をスローする必要があります:「文は文字のみを使用する必要があります」。
  • 出力にはパターンがあり、一部の単語が反転し、他の単語は正常です。
  • パターンは通常の単語として始まり、次の2つの単語が逆になり、次の2つの単語が正常になり、パターンが続きます。
  • 単語が正常であり、単語が反転する場所の例を以下に示します。

正常-反転-反転-正常-正常-反転-反転-正常...

入力例

彼女は海岸で貝を売っています

出力例

彼女はEe AeS海岸でaeSシェルを投げます

追加の規則

  • 大文字を使用する場合、最初に投稿した文字に大文字を使用する必要があります。
  • 入力時に最初に投稿された複数のスペースは、1つのスペースに減らす必要があります。たとえばProgramming Puzzles and Code GolfなりましたProgramming selzzuP dna Code Golf

最短コードが勝つ!!

ハッピーコーディング...


8
多くのプログラミング言語には例外がありません。
ドアノブ

15
@nimiこのような些細な理由のために、言語の小さなサブセットへの挑戦を制限することは全く不要のようです。
ドアノブ

10
そうでなければ良いチャレンジはルールによって台無しになりAny input other than letters or spaces, including integers and punctuation, should throw an exception: "Sentence must only use letters".ます。つまり、単語を逆にするというチャレンジとはまったく関係のない二次的なタスクを実装し、例外のない言語をカットし、バイト数。
-xnor

2
@Belfieldはい、あなたのバインドが表示されます。今できることは何もないと思います。将来的には、投稿する前にSandboxに投稿してフィードバックを取得してください。
-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

テストを投稿してくれてありがとう-非常にいい。エラーになると、誰もが同じボートに乗っている
ベルフィールド

奇妙なことに、Firefoxで動作するようになりました。しかし、私は以前にもFirefoxを使用していました。
ジャクベ

これまでのベストアンサー!
ベルフィールド

何?あなたはPythを倒しましたか?!JSベースの言語で!?? それはどのように可能ですか?!?!
ETHproductions

2
@ETHproductionsデニスが競合していない限り、いつでも勝つことができます:p
Downgoat

4

Haskell、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...]、結果をスペースで結合して単一の文字列に戻す作業が行われます。

@Christian Irwanに2バイトをありがとう。


「センテンスはユーザー文字のみにする必要があります」を「センテンスは文字のみを使用する必要があります」に変更できます。
ベルフィールド

@Belfield:固定
nimi

どうしてr=reverse
アカンカ

@ChristianIrwan:ありがとう!(初期のバージョンでは、私はそう2回を使用して、名前なしpointfree機能を持っていたreverseし、r=reverse見つからないための、同じ長さを持っていたf=。非pointfreeに移動したときに再びチェックしていませんでした)。
nimi

3

JavaScript(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

2行目には1つのスペースが必要です。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],

Megoに感謝、15文字を削除しました!!


はい、怖いニミにはポイントがあります
...-ベルフィールド

シュート、私はそれを見逃した。修正します。
ムース

@Mego、結果が見つからない場合、re.searchはNone(インデックスとして使用できません)を返し、「!= None」を追加すると実際には元のメソッドより1バイト長くなります。ただし、最後の2行をマージして3バイト節約しました。ありがとう!
ムース

1

Bash + coreutils、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

Pyth、72

=zflTc?:z"[^A-Za-z ]"0"Sentence tsum ylno use letters"zdjd.e?%/hk2 2_bbz

他のPythの答えに勝るものはありませんが、私はすでにそれを書くことに時間を費やしました。基本的にはPythonのanswerの翻訳です。

オンラインで試す


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

グレンOのおかげで16バイトを節約できました!


何よりも先に、初期条件のロジックを逆にして、rその結果になるように割り当てることをお勧めしますか?つまり、r=ismatch(...)||error(...)-はいくつかの文字を削除し、を使用する条件を反転しますr。再びコメントします、私は、いくつかのさらなる節約と思う
グレン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...
グレン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)]," "))
グレンO

@GlenO素晴らしい提案、ありがとう!
アレックス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

Java、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つずつ反転するかしないかを交互に繰り返します)。これは2つの問題が原因です。iアイテムが空の場合でも増加i++%2<1するので、i++%4>1代わりにする必要があります。ここでは、固定の211バイトバージョンです。
ケビンCruijssen

@KevinCruijssenこれは私が十分に注意深く読んでいないために得られるものです
ベンジャミンアー

0

ゼリー、39バイト

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

オンラインでお試しください!

Erik the Outgolferに感謝します。彼は私を数バイトの余分なバイトと何時間ものフラストレーションから救ってくれました。

ここに46バイトのソリューションがあります

入力に無効な文字が含まれている場合、実際にはpython構文エラーがスローされます。

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

オンラインでお試しください!


0

Japt v2.0a0、41 -Sバイト

¸¬è\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 ]

(RuntimeError)文を整数に変換する必要があります。

説明:

ð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.