ogl-edocfチャレンジ


22

入力

範囲のASCII文字で構成される空でないシャッフルされた文字列。[32..126]

出力

出力は、入力文字列に連続した回転を適用することにより取得されます。

[a-zA-Z]入力文字列の各文字()について、左から右へ:

  • 文字が大文字の場合、その前のすべての文字を左に1ポジションだけ回転します
  • 文字が小文字の場合、その前のすべての文字を1つ右に回転します

入力:「Cb-Ad」

  • 最初の文字は「C」です。左に回転する必要がありますが、この「C」の前に文字はありません。したがって、回転するものは何もありません。
  • 次の文字は「b」です。「C」を右に回転します。単一の文字であるため、変更されません。
  • 文字「-」は文字ではないため、回転をトリガーしません。
  • 次の文字は「A」です。「Cb-」を左に回転すると、「bC Ad」が得られます
  • 4番目の最後の文字は「d」です。「b-CA」を右に回転させると、「Ab-C d」が得られます

したがって、予想される出力は「Ab-Cd」です。

ルール

  • 入力は、文字列または文字の配列として受け取ることができます。これは、言語に応じて、同じである場合とそうでない場合があります。
  • 文字列の代わりに文字の配列を出力することもできます。
  • これは

テストケース

"cbad" -> "abcd"
"ACBD" -> "ABCD"
"Cb-Ad" -> "Ab-Cd"
"caeBDF" -> "aBcDeF"
"aEcbDF" -> "abcDEF"
"ogl-edocf" -> "code-golf"
"W o,ollelrHd!" -> "Hello, World!"
"ti HIs SSta ET!" -> "tHis IS a tEST!"
code-golf  string  code-golf  string  code-golf  string  parsing  brainfuck  code-challenge  python  hello-world  error-message  code-golf  string  code-golf  number  integer  counting  subsequence  code-golf  string  cipher  code-golf  array-manipulation  arithmetic  integer  matrix  code-golf  math  sequence  code-golf  restricted-source  pi  popularity-contest  cops-and-robbers  polyglot  popularity-contest  cops-and-robbers  polyglot  code-golf  file-system  king-of-the-hill  code-golf  number  sequence  integer  rational-numbers  string  code-challenge  source-layout  code-golf  ascii-art  king-of-the-hill  code-golf  array-manipulation  sorting  code-golf  string  code-golf  restricted-source  source-layout  tips  math  code-challenge  permutations  logic-gates  code-golf  number  random  integer  code-golf  math  code-golf  math  number  decision-problem  king-of-the-hill  python  board-game  code-challenge  brainfuck  busy-beaver  code-golf  number  cops-and-robbers  polyglot  obfuscation  answer-chaining  code-golf  number  integer  conversion  code-golf  string  parsing  code-golf  ascii-art  number  king-of-the-hill  javascript  code-golf  source-layout  radiation-hardening  code-golf  array-manipulation  matrix  code-golf  string  graph-theory  code-golf  array-manipulation  decision-problem  code-golf  string  ascii-art  code-golf  string  code-golf  array-manipulation 

回答:


5

Pyth、21 20バイト

VQ=k+.>k-}NG}Nr1GN)k

ここで試してみてください

説明

VQ=k+.>k-}NG}Nr1GN)k
VQ                )      For each N in the input...
     .>k                 ... rotate k (initially '')...
        -}NG}Nr1G        ... by (N is lowercase) - (N is uppercase)...
    +            N       ... then append N...
  =k                     ... and update k.
                   k     Output the result.

.U2番目の値から入力を減らすために使用できます。これにより、入力と印刷の両方が暗黙的である=kため、最初と)k最後からドロップできます。完全なプログラム:.U+.>b-}ZG}Zr1GZ- リンク
ソク


3

ゼリー、14 バイト

ØẠŒHċ€ḅ-N⁸ṙ;ð/

文字のリストを受け取る単項リンクは、文字のリストを生成します。

オンラインでお試しください!または、テストスイートを参照してください。

どうやって?

ØẠŒHċ€ḅ-N⁸ṙ;ð/ - Link - list of characters
             / - reduce by:
            ð  -   a dyadic chain:  1st call is f(L=1stCharacter, R=2ndCharacter)
               -                    ...then calls are f(L=previousResult, R=nextCharacter)
ØẠ             -     alphabet characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
  ŒH           -     split in half = ["ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz"]
     €         -     for each:
    ċ          -       count occurrences (of R)
               -                          e.g.: 'W' -> [1,0]; 'c' -> [0,1]; '@' -> [0,0]
      ḅ-       -     convert from base -1             -1             1             0
        N      -     negate                            1            -1             0
         ⁸     -     chain's left argument (i.e. L)
          ṙ    -     rotate left by (the negate result)
           ;   -     concatenate R

私はゼリーをあまりよく知りませんが、この場合Iと同じことをすべきではありませんḅ-か?ここでは機能しているようですが、コードでは機能していません。少し混乱しています。また、リスト全体を個別のアイテムとしてJellyのスタックにプッシュするコマンドはありますか(待ってください、Jellyはスタックベースの言語ではありません。)。その場合、単純な減算を使用することができ、私が間違っていなければ、否定も必要ありません(私の05AB1E回答の最後の編集と同様)。
ケビンクルーッセン

1
IŒṘ 完全な表現を見るためにリストを追加します。だからØẠŒHċ€IṪN⁸ṙ;ð/動作します。
ジョナサンアラン

ああ、それは理にかなっています。説明してくれてありがとう。昨日はすでに賛成でした。:)
ケビンクルーイッセン

3

05AB1E18 17 16 14 バイト

õsvy.uy.l-._y«

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

õ            # Start with an empty string
 sv          # Loop over the characters `y` of the input
   y.u       #  Check if `y` is an uppercase letter (1 if truthy; 0 if falsey)
   y.l       #  Check if `y` is a lowercase letter (1 if truthy; 0 if falsey)
      -      #  Subtract them from each other
       ._    #  Rotate the string that many times (-1, 0, or 1) toward the left
   y«        #  Append the current character `y` to the string
             # (And implicitly output the string after the loop)

3

K443の 33バイト

溶液:

""{.q.rotate[-/y in'.Q`A`a;x],y}/

例:

q)k)""{.q.rotate[-/y in'.Q`A`a;x],y}/"Cb-Ad"
"Ab-Cd"
q)k)""{.q.rotate[-/y in'.Q`A`a;x],y}/"ogl-edocf"
"code-golf"
q)k)""{.q.rotate[-/y in'.Q`A`a;x],y}/"ti HIs SSta ET!"
"tHis IS a tEST!"

説明:

入力文字列を反復処理し、前の出力をリスト「a-zA-Z」内の位置に応じて1、-1、または0ずつ回転します。

""{.q.rotate[-/y in'.Q`A`a;x],y}/ / the solution
""{                            }/ / iterate (/) over, starting x as ""
                             ,y   / append y to
   .q.rotate[             ;x]     / rotate x by ...
                    .Q`A`a        / the lists "a..z" and "A..Z"
               y in'              / y in each (') alphabet?
             -/                   / subtract (-) over (/)

ノート:

  • 05AB1Eソリューションからインスピレーションを得て-10バイト

3

> <>45 43バイト

ii:2+7$.::&"`{"@)@(*?}"@["&::&@)@(*?{&!
ror

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

> <>にスタックの回転があるという事実は役立ちますが、文字の大文字と小文字を確認する必要はありません。

説明:

i    Get first inputted character
 i   Get second. This is to prevent errors from rotating an empty stack
  :2+7$.      Jump to the second line if that was EOF
        ::&   Create copies of the input and store one in the register
           "`{"@)@(*     Check if the char is lower case
                    ?}   If so rotate the stack
                      "@["&::&@)@(*?{   Rotate the other way if uppercase
                                     &  Push the new char
                                      ! Skip the first i instruction
Skip to the second line on EOF
ro      Reverse the stack and output
r r     Cancel out the first reverse
 o      Output the rest of the stack

2

Haskell101 91バイト

Curtis Bechtelの回答に触発された-10バイト(小文字を使用'@'<c,c<'['elem c['A'..'Z']、対応する範囲を使用)。

g(x:y)=foldl((<>pure).(!))[x]y
x@(a:b)!c|'`'<c,c<'{'=last x:init x|'@'<c,c<'['=b++[a]|0<1=x

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

説明/ゴルフなし

演算子(!)は、xパターンマッチングが可能な空でない文字列と文字を受け取ります。

x@(a:b) ! c
  | '`' < c, c < '{' = last x : init x  -- rotate x to the right by one
  | '@' < c, c < '[' = b ++ [a]         -- rotate x to the left by one
  | otherwise = x                       -- keep x as is

これで、入力の最初の文字から始めて、入力のテールを左から右に減らすことができます:

\b a -> b!a ++ [a]

2

Haskell122 92バイト

提案してくれたBWOに感謝します!私はまた、元の答えとは少し異なるアプローチを取ることで多くのことを節約しました。

l@(a:b)!c|'`'<c,c<'{'=last l:init l++[c]|'@'<c,c<'['=b++[a,c]|0<1=l++[c]
f(c:s)=foldl(!)[c]s

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


のパターンマッチを交換することができ(#)、使用,する&&、使用[l!!0,c]するhead l:[c]、の1>0代わりに使用する、Trueカウントする必要はなくf=l==[]ガードを節約する13バイトを節約する空でない入力を想定することができます:オンラインで試してみてください!
ბიმო

ところで 私は提出でゴルフisLowerisUpperゴルフを使用しましたが、それで大丈夫であることを願っています。そうでなければ、編集を元に戻します。
ბიმო

@BWO提案をありがとう、すぐに先に進みましょう!
カーティスベクテル

2

JavaScript(Node.js)116 102バイト

f=(s,i=1)=>s[i]?f(s.replace(RegExp(`^(.)(.{${i}})(?=[A-Z])|^(.{${i}})(.)(?=[a-z])`),"$4$3$2$1"),i+1):s

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

オリジナル(116 111 106B)

s=>Buffer(s).map((x,i)=>s=(t=s[S="slice"](i),i<2)?s:x>64&x<91?s[S](1,i)+s[0]+t:x>96&x<123?s[i-1]+s[S](0,i-1)+t:s)&&s

s=>Buffer(s).map((x,i)=>i<2|--x%32>25|x<64?s:s=[s[S="slice"](1,i)+s[0],s[i-1]+s[S](0,i-1)][+(x>95)]+s[S](i))&&s

s=>Buffer(s).map((x,i)=>!i|--x%32>25|x<64?s:s=(w=x>95,t=s.slice(1-w,i-w),w?s[i-1]+t:t+s[0])+s.slice(i))&&s


eval(`regex`)コンストラクターを使用するよりも恐らく短いでしょう
-Downgoat

@Downgoatの場合はスラッシュが必要なeval(`regex`)ので、そうではないのではないかと思います。そのため-2 + 2 = 0で、バイト数を減らすのに役立ちません。
朝琴シエル

@Downgoat eval()少なくとも1つのフラグが使用されている場合、使用する価値eval('/./g')がありRegExp('.','g')ます。
アーナルド

@Arnauldそれは本当ですが、ここではフラグを使用しません。
朝琴シエル

@ShieruAsakoto(もちろん。ここでやる価値がない理由を説明するために、私のコメントは主にDowngoatに宛てられました。)
Arnauld

2

Ruby、51バイト

->s{w=[];s.map{|x|w.rotate!(x=~/\W/||?_<=>x)<<x};w}

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

入力と出力は文字の配列です

トリック:

回転部分を除いて、コードは非常に簡単です。

(x=~/\W/||?_<=>x)

xは単一の文字で、文字の場合もあります。文字の場合は最初の式x=~/\W/が返されnil、それ以外の場合は0 が返されます。0であれば、完了です。そうでなければ、論理orは2番目の式をチェックし?_<=>xます。大文字の場合は-1、小文字の場合は1を返します。したがって、回転は次のとおりです。

  • -1(左に1)大文字の場合
  • 小文字の場合は+1(右に1)
  • 0(回転なし)が文字でない場合

2

、110バイト

func[s][p: s forall s[if all[(a: first s)>#"@"a < #"["][move p back s]if all[a >#"`"a <#"{"][move back s p]]p]

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

説明:

f: func [ s ] [
    p: s                                ; store the starting position of the string in p
    forall s [                          ; iterate through the entire string
        a: first s                      ; store the current character in a
        if all [ a > #"@" a < #"[" ] [  ; if `a` is a uppercase letter
            move p back s               ; move the starting char to the position before current
        ]
        if all [ a > #"`" a < #"{" ] [  ; if `a` is a lowercase letter
            move back s p               ; move the character before the current one to the start
        ]
    ]
    p                                   ; return the string 
]


2

Japt、17 16 14バイト

入力を文字の配列として受け取り、文字列を出力します

;rÏiXéCøY -BøY

それを試してみてください


説明

 rÏ                :Reduce by passing the current result (X) & the current element (Y) through a function
   i               :  Prepend to Y
    Xé             :  X rotated right by
;     B            :    Uppercase alphabet
       øY          :    Contains Y?
          -        :    Subtract
;          C       :    Lowercase alphabet
            øY     :    Contains Y?


1

Java 10、149 119バイト

s->{for(int i=1;i<s.length();)s=s.replaceAll("^(.)(.{"+i+"})(?=[A-Z])|^(.{"+i+++"})(.)(?=[a-z])","$4$3$2$1");return s;}

のポート @ShieruAsakoto JavaScript answerのので、必ず彼賛成してください。

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

説明:

s->{                          // Method with String as both parameter and return-type
  for(int i=1;i<s.length();)  //  Loop `i` in the range [1, length)
    s=s.replaceAll("^(.)(.{"+i+"})(?=[A-Z])|^(.{"+i+++"})(.)(?=[a-z])","$4$3$2$1");
                              //   Rotate the substring of [0, i] either left or right
  return s;}                  //  Return the modified input-String as result

1

スタックス、32 バイト

éG7[Æ┐äZ▬Θε♫∙~╞ÉH╔u╬←J╛ü╢(┼▒uX)Ü

実行してデバッグする

B]s{c97 123:bsaa|)sc65 91:bsaa|(s+c}fd  #Full program, unpacked, implicit input
B]s                                     #Unons-left, singleton, swap top 2 of stack
   {c                                   #Copy iterative letter
     97 123                             #Put 97 and 123 on stack(lower case)
           :bsaa                        #Check if iterative letter is between range, swap orientation back to proper order
                |)                      #Rotate if the letter is within range
                  sc                    #Swap top 2 and copy top
                    65 91               #Put 65 and 91 on stack (Capitals)
                         :bsaa          #Check if iterative letter is between range, swap orientation back to proper order
                              |(        #Rotate if the letter is within range
                                s+c     #swap, concat and copy
                                   }fd  #remove duplicate of original answer after loop and implicitly print

おそらく不要な多くのスタックスワッピング。これをもっと減らしたいと思っていますが、スタックの順序付けに苦労していました。もしかしたら退屈している人がいるかもしれません。それに取り組んでいきます。


1

アタッシュ、69バイト

~Fold[{s'r.=_'sp;Rotate[s,&`-!Has&r[0]=>ALPHA'alpha]+r}@SplitAt]#Iota

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

説明

一般的な形状

関数は一般的に次のようになります。

~Fold[{...}]#Iota

シードとしての入力から始めて、から()の{...}範囲で各メンバーを折り畳みます0#input - 1Iota

内部機能

以下の関数が呼ばれるf[building, index]とから各インデックスと呼ばれる0#input排他的。これらの引数を@SplitAt呼び出しSplitAt、入力文字列をで分割しますindex

{s'r.=_'sp;Rotate[s,&`-!Has&r[0]=>ALPHA'alpha]+r}
{                                               }    anonymous function taking the split string
                                                     e.g.: ["cd-", "Adf!"]
      _'sp                                           concat the input with a space
                                                     e.g.: ["cd-", "Adf!", " "]
                                                     (this is to handle index = 0)
 s'r.=                                               `s` is the first member, and `r` is the second
           Rotate[s,                         ]       rotate `s` by:
                                  ALPHA'alpha          over uppercase and lowercase alphabets:
                        Has&r[0]=>                       test if r[0] is in each alphabet
                                                       e.g.: [true, false]
                    &`-!                               subtract the second from the first
                                                       e.g.: (true - false) = 1 - 0 = 1
                                                     s is rotated according to the following map:
                                                       uppercase =>  1
                                                       symbol    =>  0
                                                       lowercase => -1
                                              +r     append the right portion of the string

基本的に、この関数は、右部分の最初の文字に従って文字列の左部分を回転させます。


1

、20バイト

FS≔⁺⭆ω§ω⁻⁺λ№αι№βιιωω

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

FS

入力文字をループします。

≔⁺⭆ω§ω⁻⁺λ№αι№βιιω

これまでに収集された文字の文字列にマップし、現在の文字がそれぞれ大文字または小文字の場合、インデックスをインクリメントまたはデクリメントして、これまでに収集された文字に周期的にインデックスを付けます。これで回転が完了しました。次に、次の文字が連結され、結果が文字列に割り当てられます。

ω

結果を印刷します。


1

R107の 102 100バイト

Rの文字列マニピュレータはかさばるので、巨大です。誰でも100未満にできますか?

「ループ変数をFに設定して初期化を回避する」トリックを使用した-5バイト。

-2バイト。すべての文字が印刷可能であると想定し、演算子の優先順位を使用して小文字をテストするの2*!k%%97>25ではなく2*k%in%97:122使用しています。

function(x){for(k in u<-utf8ToInt(x))u[1:F-1]=u[(1:(F=F+1)+k%in%65:90-2*!k%%97>25)%%F];intToUtf8(u)}

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


1
Rのゴルフチャットルームに参加して、アイディアをバウンスしましょう(今は私だけです)。私の推測では、順列部分はこのアプローチでできる限り短いものですが、自分で試したことはないので、確実に言うことはできません。
ジュゼッペ

1

Japt25 23バイト

私はあきらめます、短くすることはできません

@ETHproductionsから-2バイト

£=¯Y éXè\a -Xè\A)+UsYÃU

£=¯Y éXè\a -Xè\A)+UsYÃU     Full program. Implicit input U
£                           map each char
 =                          set U equal to:
  ¯Y                        U sliced to current mapped value
    éXè\a -Xè\A)            and rotated left or right 1 char
                +UsY        append the non-sliced U value
                      ÃU    Output U    

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


悲しいことに、私が行うには短い方法を見つけることができませんéXè\a -Xè\Aいずれか:-(あなたはに二重のスペースを変更することにより、2つのバイトを救うことができる)、および削除©(暗黙のコンマ手段Uはまだ出力されます)
ETHproductions

フラグをドロップÃUして使用することにより、さらに2バイトを節約します-h
シャギー

1

網膜67 64 58バイト

^
¶
+`(.*)(.)¶([a-z])|(.)(.*)¶([A-Z])|¶(.)
$2$1$3$5$4$6$7¶

-9バイトは、@ Neilが?私が追加した3つの不要なもの(.*)、およびelse-caseの不要なものを削除したおかげです。

オンラインそれを試してみたり、すべてのテストケースを検証します。(注:末尾の改行を含む出力。テストスイートのヘッダーは各入力行を個別のテストケースとしてテストし、フッターは末尾の改行を削除してよりコンパクトな出力にします。)

説明:

入力の前に改行を追加します。

^
¶

一致するものが見つかるまで交換を続けます。

+`

他のすべては一緒にマージされた3つの異なるチェックです:

改行の直後の文字が小文字の場合:改行の前をすべて右に1回回転してから、その文字と改行を追加します。

(.*)(.)¶([a-z])
$2$1$3¶

改行の直後の文字が大文字の場合:改行の前をすべて左に1回回転し、その文字と改行を追加します。

(.)(.*)¶([A-Z])
$2$1$3¶

そうでない場合(小文字でも大文字でもない):次の「反復」のために、改行を右に1回シフトするだけです。

¶(.)
$1¶

上記の3つのチェックは、正規表現ORステートメント(|)およびより大きなグループ置換とマージされ、if(lowercase) ... elseif(uppercase) ... else ...次のように動作します。


?s が必要だとは思わない-まだ回転するものが何もない場合は、文字があるかどうかは関係ない。
ニール

1
また、交換(.*)¶(.)$1$2¶交換に簡略化することが可能¶(.)$1¶、他のキャプチャが、結果には影響しませんよう。
ニール

@Neil Ah、もちろんありがとう。そこに-9バイト!:)
ケビンクルーイッセン

1

MATL、20バイト

ttYo-ZS"X@q:&)w@YSwh

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

ルイスメンドーのおかげで-4バイト。

大文字/小文字/非文字を[-1,0,1](プログラムの前半)に変換します。サーキュシフトを連続して適用します(後半)。大文字/小文字を[-1,0,1](2番目のバージョンを参照)にマッピングするより良い方法があり、おそらく2つを取り除くためにすぐに文字列を反転する方法がある場合、私は頭を痛めていますwに必要です&)



0

Pyth、16バイト

em=+.>k-F}RGrBd2

ここで試してみてください!

説明:

em=+.>k-F}RGrBd2dQ    Autofill variables
 m               Q    for each d in Q (the input):
            rBd2       Take [d, swapcase(d)]
         }RG           Figure out which are in the lowercase alphabet (returns [1,0] for lowercase, [0,1] for uppercase, [0,0] for non-letters)
       -F              Fold on subtraction (1 for lowercase, -1 for uppercase, 0 for non-letter)
    .>k                Cycle the processed part (k) of the input right by ^ steps
   +            d      Add in the new character at the end
  =   k                Store new process step back into k (k starts as an empty string)
e                     Get the (e)nd step's output.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.