ローゼンクランツとギルデンスタンはコードです


10

不条理なプレイで、Rosencrantz and Guildenstern is Deadの2人の主人公RosencrantzとGuildenstern(または彼らですか?)個人のアイデンティティ。彼らが自分の名前をシャッフルしたとしても、ばかげたことではないでしょうか?

あなたの仕事は、7文字を超える偶数の長さ(設計では4の倍数)の文字列を取り、分割してシャッフルする関数を記述することです。

分割は次のようになります。文字列はformat "abscd"で、sは区切り文字として機能します。最初のセクションとセパレータabsは文字列の前半となり、後半は次のようになりますcd

長さはaになります(string length / 4) - 1

長さはbになります(string length / 4)

長さはsになります1

長さはcになります(string length / 4) + 1

長さはdになります(string length / 4) - 1

これは本当に混乱するかもしれませんので、いくつかの例を紹介します

("a" + "bb" + "s" + "ccc" + "d").length //8
  1     2      1      3      1
|-------4--------|  |----4-----| <--- (4 is half of 8)

("rosen" + "crantz" + "&" + "guilden" + "stern").length  //24
    5         6        1        7          5

("foo" + "barr" + "?" + "barry" + "foo").length
   3       4       1      5         3

最後に:

次に、パーツをシャッフルして出力します adscb

例: "rosencrantz&guildenstern" --> "rosenstern&guildencrantz"

"foobarr?barryfoo" --> "foofoo?barrybarr"

Rulez:

  1. 標準の抜け穴は禁止されています
  2. 許容可能な回答:1つの入力文字列から入力を受け取り、1つの出力文字列を返す関数
  3. 入力文字列が上記の要件と一致しない場合は、コードでエラーが発生する必要があります(Exceptionまたはの 種類は関係ありませんError)。
  4. これはcode-golfなので、(各言語で)最も短い(有効な)回答が優先されます。
  5. ワンライナーのボーナスポイント:-)(本当にそうではなく、ただクールなポイントです)

6
ギャングスタのルールについて:一般的に「関数」を定義するのは難しいため、「関数」を使用することはお勧めしません。さらに、通常は煩わしいボイラープレートコードに要約されるため、無効な入力の処理もほとんど回避されます。
— Jonathan Frech

@JonathanFrech入力検証の課題は興味深い問題だと思います。これは、配列トラバーサルから分岐ロジック、RegExテストまで、さまざまな方法で処理できるため、これらの最適化によってさらに課題が追加される可能性があります¯_(ツ)_ /¯私はそれを別のコードゴルフチャレンジのために試してみる:-)
— Michael

2
tfwは誰もが、より柔軟なioメソッドを入手して、好きなゴルフ言語でコードを作成しようとしています。そして、tfwはほとんどすべての質問で発生します
— Windmill Cookies


1
@NathanMerrill仕様では、入力は7文字を超える必要があり、その長さは4で割り切れる必要があると述べられています
— 。JoKing

回答:


11

K(OK)、35 34 33バイト

{$[8>#x;.;<x!4!-&4#-1 0 2+-4!#x]}

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

入力検証なし(ngnのバウンティの場合)、25 24 23バイト

{<x!4!-&4#-1 0 2+-4!#x}

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

Kを少し習得し、動詞のリストを見ると、代替のアプローチ(カットを使用しない)がここで機能すると思いました。そして、それは完全に機能しました。

使い方

{<x!4!-&4#-1 0 2+-4!#x}
                 -4!#x    Length divided by four (floor division)
        4#-1 0 2+         Generate lengths (x/4-1, x/4, x/4+2, x/4-1)
       &                  Generate that many 0, 1, 2, 3's
    4!-                   Negate and modulo 4; effectively swap 1 and 3
 <x!                      Sort the original string by above

{$[8>#x;.; <code> ]}  Input validation
 $[8>#x           ]   If the length is less than 8
        .             Dynamically generate an error
           <code>     Otherwise, run the main code

@ngn私の目に起こったことOo
— バブラー

3

Perl 6の、60の 58バイト

-Jo Kingのおかげで2バイト

{[~] .rotor($_/4 X-1,0,+^-$_+>2,-1,1)[0,4,2,3,1;*]}o*.comb

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

エラーが発生した場合、「Rotorizing sublist length is out of range」がスローされます。

説明

{               # Anonymous block
 [~]            # Join
   .rotor(      # Split into sublists of specific length
     $_/4 X-    # Subtract from len/4
     1,
     0,
     +^-$_+>2,  # (len-1)>>2
                #   subtraction yields 1 if len is multiple of 4
                #   otherwise a value less than 1 causing an error
     -1,       
     1)
   [0,4,2,3,1;*]  # Rearrange sublists and take inner elements
}o*.comb          # Split into characters and feed into block

3

J、36 35バイト

5;@A.](<;.2~;)1<@{."+~1 0 _2 1-4%~#

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

-1バイト{.+負の長さ&;.2「終了」マーカーとして代わりに1を切ります。

元の回答、36バイト

5;@A.](<;.1~;)1<@{."+~_1 0 2 _1+4%~#

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

ngnが以前のK回答へのコメントで「カット」について言及し、同じ「カット」を持つJを試してみました(Kがどのように機能するのかわかりません)。

使い方

5;@A.](<;.1~;)1<@{."+~_1 0 2 _1+4%~#  Monadic train.
                                4%~#  Length divided by four
                      _1 0 2 _1+      Generate the four segment lengths
              1<@{."+~  Generate [1 0 0...] boxed arrays of those lengths
      (     ;)          Raze; unbox and concatenate
     ] <;.1~            Cut the input string on ones as starting marker, then box each
5  A.  Rearrange the boxes in the order 0 3 2 1
 ;@    Raze again

この関数は無効な入力を自動的に処理することに注意してください。

  • 入力の長さが4の倍数でない場合、その長さ引数は整数でなければならないため、{.スローしdomain errorます。
  • 入力の長さが4の場合、カットは2つのセグメントのみを生成し、を5 A.スローしindex errorます。
  • 入力の長さが0の場合、cutへの2つの引数は同じ長さではないためlength error、スローされます。

3

Pythonの3、103 102 101 97 88の 86の 84バイト

def f(s):l=len(s);l//=4*(l%4<1<l/4);return s[:l-1]+s[1-l:]+s[2*l-1:1-l]+s[l-1:2*l-1]

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

実際には1 ;行ではありませんが、改行やインデントよりも1行あたり1バイト少ないです。

ZeroDivisionError入力文字列の長さが8未満、または4の整数倍でない場合にスローされます。

Python 2でも動作します。

Jo Kingのおかげで-4バイト

ovsのおかげで-9バイト

-Jonathan Frechのおかげで2バイト

-バブラーのおかげで2バイト


ヒントをありがとう@JoKing、感謝します:)
— Axim


@ovs隣接するインデックスをうまくキャッチし、括弧については、少なくとも20分間試してみて、それらのいくつかを取り除くことができるかどうかを確認しました。その後//=、最も外側のペアへの変更が冗長になり、完全に見逃しました。本当にありがとう!
— Axim、

2
-l+1<-> 1-l?
— Jonathan Frech

1
2つの不等式をマージして84バイトにします。
— バブラー2018年

2

Perl 6、78バイト

*.comb[0..*/4-2,3* */4+1..*,*/2-1/(*>7)..3* */4,*/4-1/(*%%4)..*/2-2].flat.join

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

文字列を取り、有効な場合は変更された文字列を返し、それ以外の場合はゼロ除算エラーを返す匿名コードブロック。配列を直接変更できることはわかっているので、文字列の2つのセクションを入れ替えることはできますが、それを完全に理解することはできません。


2

K(NGN / K) 、120の 113 103 99 95バイト

{$[(r>7)&0=4!r:#:x;{g:(s:*|(y*2)#x)\x;((y-1)#*g),((-y-1)#*|g),s,((y+1)#*|g),(-y)#*g}[x;r%4];l]}

文字列の長さが4で割り切れるかどうかをテストするための追加の関数が含まれ、入力が無効な場合、宣言されていない変数を参照してエラーを出力します

編集:7を超える長さの欠落状態が含まれます

編集:1つの関数に結合され、冗長な変数宣言が削除されました

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


1
これはもっと短いかもしれません。「カット」(indices_string)について知っていますか?説明する必要がある場合は、果樹園で pingを実行してください
— ngn

1
私は34バイトでそれを行うことができます:)
— ngn

カットについては知っていますが、使用するつもりはありませんでした... 34バイト?私は家に帰ったときにこれをもう一度
— やり直さ

私は言及しなければなりません:私の解決策は無効な入力(長さ<= 7)がエラーを引き起こすことを確認しません
— ngn

1

Retina 0.8.2、58または73または83または93バイト

((((.)))*?)(.(?<-2>.)+)(...(?<-3>.)+)((?<-4>.)+)$
$1$7$6$5

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

((((.)))*?)

でキャプチャaし$1、できるだけ短くします*?。$#2、$#3そして$#4の長さになりaます。

(.(?<-2>.)+)

でキャプチャbし$4ます。(?<-2>.)+までの長さをキャプチャa他のながら、.必要に応じてその長さに1を加算します。

(...(?<-3>.)+)

キャプチャsしcてください$6。それらを組み合わせた長さは、の長さの3倍ですa。

((?<-4>.)+)

でキャプチャdし$7ます。その長さはの長さ以下ですa。

$

私たちは作っaできるだけ短く、我々はまだ入力の最後に到達したいです。

$1$7$6$5

交換bおよびd。

上記のステージはその入力を検証しません。Retinaには実行時エラーがないため、入力検証にはいくつかのオプションがあります。

G`^(....){2,}$

長さが8未満または4の倍数でない場合は何も出力しません(+15バイト)

^(?!(....){2,}$).*
Error

Error長さが8未満または4の倍数でない場合に出力します(+25バイト)。

+`^(....)*..?.?$|^(....)?$
.....$1

長さが8未満または4の倍数でない場合にハングします(+35バイト)。


これは無効な入力に対してエラーをスローしません(そのように煩わしいので)
— Jo King

1

C(GCC)を有する-Dx=memcpyと-DL=(l-1)、154の 158 160バイト

入力文字列の長さが4または8文字より短い場合はNULLを返します。

RogemとJonathan Frechに提案をありがとう。

編集:プリプロセッサの定義をコマンドラインに移動し、文字列を動的に割り当てて、パズルに厳密に準拠させました。

f(s,t,l)char*s,*t;{l=strlen(s);l%4|l<8?t=0:(t=malloc(l+1),l/=4,x(t,s,L),x(t+L,s+3*l+1,L),x(t+2*L,s+L+l,l+2),x(t+3*l,s+L,l),t[4*l]=0);l=t;}//-Dx=memcpy -DL=(l-1)

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


なんでt[80]?入力長に関する上限はないようです。
— Jonathan Frech

@JonathanFrech私はバイトを節約するためにそれをやったが、あなたは正しい。malloc()代わりに使用するソリューションを変更しました。
— ErikF 2018年

変更による戻り、戻り値はNULL無効な出力用memcpy()、関数のようなマクロからの戻り値を使用してタイプをスキップし、C99可変長配列を使用してスキップしmalloc()ます。

なぜ160バイトな//の-wか、または?
— l4m2

@ l4m2 -wは警告を抑制するのに便利です(エラーを見つけやすくなります)。通常、aの後にコマンドライン引数を追加//して、TIOにバイト数をカウントさせ、合計から1を差し引いて、それを行うために必要な1文字を追加します。

1

ゼリー、28 バイト

L7»4ḍİ×L:4;;ĖÄƲFÄœṖ⁸⁽%[D¤ị$F

(完全なプログラムが許可されている 場合は、末尾を削除できますF)
長さが8未満または4で割り切れない場合、(float)のValueError整数除算中にa が発生infします4-除算によりNaN(floatも)生成されます。にキャストされますint。

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

どうやって?

L7»4ḍİ×L:4;;ĖÄƲFÄœṖ⁸⁽%[D¤ị$F - Link: list of characters
L                            - length
 7                           - literal seven
  »                          - maximum (of length & 7)
   4ḍ                        - divisible by four? (yields 1 for good inputs; 0 otherwise)
     İ                       - inverse (1 yields 1; 0 yields inf)
      ×L                     - multiply by length (length or inf)
        :4                   - integer divide by 4 (errors given inf)
              Ʋ              - last four links as a monad (f(x)):
          ;                  -   concatenate -> [x,x]
            Ė                -   enumerate -> [1,x]
           ;                 -   concatenate -> [x,x,[1,x]]
             Ä               -   cumulative sum (vectorises at depth 1) -> [x,x,[1,1+x]]
               F             - flatten -> [x,x,1,1+x]
                Ä            - cumulative sum -> [x,2x,2x+1,3x+2]
                   ⁸         - chain's left argument (the input)
                 œṖ          - partition at indices (chops up as per requirements)
                          $  - last two links as a monad (f(z)):
                        ¤    -   nilad followed by link(s) as a nilad:
                    ⁽%[      -     10342
                       D     -     decimal digits -> [1,0,3,4,2]
                         ị   -   index into z (rearranges the pieces as per requirements)
                           F - flatten (back to a list of characters)




1

JavaScript(Node.js)、80バイト

s=>(g=s.substr.bind(s))(0,l=s.length/4-1)+g(-l)+g(l-~l,l+3)+g(l,l+1,l<1==l%1||Z)

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

JavaScript(Node.js)、84バイト

s=>(g=(a,b)=>s.substr(a,b))(0,l=s.length/4-1)+g(-l)+g(l-~l,l+3)+g(l,l+1,l<1==l%1||Z)

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

JavaScript(Node.js)、87バイト

s=>(l=s.length/4)<2||l%1?Z:(g=(a,b)=>s.substr(a,b))(0,l-1)+g(1-l)+g(l+l-1,l+2)+g(l-1,l)

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

RegExpより短い


0

Java 8、135バイト

s->{int l=s.length();l=l>7&l%4<1?l/4:l/0;return s.substring(0,l-1)+s.substring(3*l+1)+s.substring(2*l-1,3*l+1)+s.substring(l-1,2*l-1);}

ArithmeticException入力文字列が要件に一致しない場合、スロー(ゼロで除算)します。こちらからオンラインでお試しください。

非ゴルフ:

s -> { // lambda function taking a String argument and returning a String
    int l = s.length(); // take the length of the input ...
    l = l > 7 &         // ... if it's  greater than 7 and ...
        l % 4 < 1       // ... a multiple of 4 ...
      ? l / 4           // ... divide by 4; otherwise ...
      : l / 0;          // ... error out (division by zero throws ArithmeticException)
    return // concatenate and return:
           s.substring(0, l - 1)             // a
         + s.substring(3 * l + 1)            // d
         + s.substring(2 * l - 1, 3 * l + 1) // sc
         + s.substring(l - 1, 2 * l - 1);    // b
}

提案l/=l>7&l%4<1?4:0;の代わりにl=l>7&l%4<1?l/4:l/0;
— ceilingcat

0

C(gcc)、129バイト

変更により戻ります。コンパイル:

-Df(s)=({char t[l=strlen(s)];l%4|l<8?0:(l/=4,x(t,s+l*2-1,l-~l),x(x(x(s+l*3,s+l-1,l)-l-2,t,l+2)-l+1,t+l+2,l-1),s);}) -Dx=memcpy

ソースファイル:

l;

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

デゴルフ

-Df(s)=({ // Function-like macro f. Takes a char* as a parameter.
          // Return value is a pointer to s if successful, and to NULL if string was invalid.
     char t[l=strlen(s)]; // Allocate a local temp string.
     l%4|l<8?0: // Detect invalid strings. Return 0 (NULL) on invalid string.
         (l/=4, // We're only really concerned with floor(len/4), and this will yield that.
             memcpy(t,s+l*2-1,l-~l), // Copy the second half of chars to the temp storage.
             memcpy( // Because memcpy returns the address of the destination, we can chain
                     // the calls to save quite a few bytes, even after x->memcpy substitution.
                 memcpy(memcpy(s+l*3,s+l-1,l) // Next, copy the second quarter to the end.
                     -l-2,t,l+2) // After that, we copy back the third quarter to its place.
                          -l+1,t+l+2,l-1) // Finally, copy the fourth quarter to where the second
                                          // quarter was.
                      ,s);}) // And return the pointer.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.