シフターを作成する


10

複数のn場所に「シフト」するには、次の操作を行います。

  • 最後のn桁を削除
  • n番号の最初に最初の数字のコピーを追加します

たとえば、31415数値を3桁シフトするには、最後の3桁を取り出してを取得し31、次に最初の桁の3つのコピーを最後に追加3して、を与え33331ます。

数値が負の場合、代わりに数字を左から取得し、最初の数字を右から「埋める」必要があります。たとえば、文字列31415を-3桁シフトすると、になります15555

数値が0の場合、変更は行われません。

シフトがプログラムの長さを超える場合、入力された数字が削除され始める可能性があります。つまり、指定された数値が文字列の長さよりも大きい場合、文字列全体が1桁になった後は、それ以上の変更は行われません。

チャレンジ

との2つの数値が与えられるns、リターンns場所をシフトしてシフトします。

テストケース

   n,  s -> result
7243,  1 -> 7724
 452, -1 -> 522
  12,  1 -> 11
 153,  4 -> 111

これはなので、有効な最短の送信(バイト単位)が優先されます。


勝つ基準は何ですか?
Xcoder氏2017

5
「シフティング」が何をするのか理解できないと思います。これは[binary]とタグ付けされており、バイナリシフトと関係があると思います。テストケースで数値をバイナリで表示することも役立つでしょうか?
2017

2
最初の桁または最後の桁をシフトして「ストレッチ」します。何が不明確ですか?
Luis Mendo 2017

2
ええ、彼らが何を求めているかはかなり明確です
wrymug

3
シフトは明確に定義されています:整数の乗算または底のべき乗による除算。しかし、どのテストケースも機能しないため、この質問は特異な定義を使用し、それが何であるかを述べていないようです。
Peter Taylor

回答:


2

APL(Dyalog)、32バイト

左引数としてシフトを取り、右引数として(文字列として)数を取る無名関数。

{a←|⍺⋄(≢⍵)↑(a-⍺)↓(a⍴⊃⍵),⍵,a⍴⊃⌽⍵}

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

{が左と右の引数 である無名関数

|⍺ シフトの絶対値

a← で店舗A

 その後

⌽⍵ 番号を逆にする

 最初の(つまり最後の)桁を選択する

a⍴Rの長さにそれをeshape A

⍵, 番号を前に付ける

(), 次を追加:

  ⊃⍵ 最初の桁

  a⍴Rの長さにそれをeshape A

()↓ 次の文字数をドロップします:

  a-⍺マイナスシフト

()↑ 次の文字数を取ります:

  ≢⍵ 元の数の長さ



2

Haskell、69バイト

s#n|l<-[1..abs n]=take(length s)$drop(-2*n)$(s!!0<$l)++s++(last s<$l)

数値を文字列として受け取ります。オンラインでお試しください!

使い方:

s#n                         -- s: input number as a string
                            -- n: shift amount

(s!!0<$l)++s++(last s<$l)   -- make a string:
                            -- n times the first digit, the whole number, n times the last digit
                            -- e.g. "567" 2 -> 5556777
drop(-2*n)                  -- drop the first (-2 * n) chars, i.e. 0 if n>0
take(length s)              -- take as may chars as there are in s

2

MATL、12バイト

tn:i-yn1&Xl)

入力は次のとおりです。文字列としてシフトされる数値。数値としてのシフトの量。

オンラインでお試しください!または、すべてのテストケースを確認します

Consisder入力'452'-1'

t     % Implicitly input string. Duplicate
      % STACK: '452', '452'
n     % Number of elements
      % STACK: '452', 3
:     % Range
      % STACK: '452', [1 2 3]
i     % Input number
      % STACK: '452', [1 2 3], -1
-     % Subtract, element-wise
      % STACK: '452', [2 3 4]
y     % Duplicate from below
      % STACK: '452', [2 3 4], '452'
n     % Number of elements
      % STACK: '452', [2 3 4], 3
1     % Push 1
      % STACK: '452', [2 3 4], 3, 1
&Xl   % Clamp, with three inputs. Applies min function, then max
      % STACK: '452', [2 3 3]
)     % Reference indexing. Implicitly display
      % STACK: '522'

1
これは非常に少ないバイト数です。
KスプリットX

@KSplitXありがとう!ところで私はちょうど説明を追加しました
ルイスメンド2017

1

J、37バイト

これは、明示的な動詞が正しい(唯一の?)選択のように思われたJの状況の1つでしたが、これについて暗黙の書き換えがあるかどうか知りたいです。

4 :'(-x)(|.!.((x>0)&{({:,{.)":y))":y'

Jの組み込みシフト動詞を使用すると、「フィル」文字を構成できます。

|.!.f  NB. f is the fill character

最初または最後の文字をフィル文字として使用するかどうかを決定するロジックは簡単です

(x>0)&{ ({: , {.)

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


1

J、23バイト

(_&(]{.,],{:)~|)}.~_2*]

入力nと出力は、数値を含む文字列です。

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

説明

(_&(]{.,],{:)~|)}.~_2*]  Input: 'integer n' as a string (LHS), integer s (RHS)
(              )         Extend 'n' by copying its head and tail 's' times
              |            Abs(s)
 _&(]       )~             Nest 'Abs(s)' times on 'n'
          {:                 Tail
        ],                   Append the tail to itself
     {.                      Head
       ,                     Prepend the head to the previous
                   _2*]  Multiply 's' by -2
                }.~      Drop abs(-2*s) from the head if 's' < 0 else from the tail

綺麗な。私よりも良いアプローチがあったのではないかと思った...
ジョナ

私はあなたがnを(おそらく間違って)想定されたIDが許可されていない文字列として受け取ることに気づきましたが。たった4文字しか節約できなかったのに...
ジョナ


1

05AB1E、16バイト

0‹©iR}¹ÄF¨¬ì}®iR

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

説明

0‹                 # input_1 is negative
  ©                # store a copy in register
   iR}             # if true (input_1 is negative), reverse input_2
      ¹ÄF          # abs(input_1) times do
         ¨         # remove the last element
          “       # prepend the head
            }      # end loop
             ®iR   # if input_1 was negative, reverse result

0

Python 2、87バイト

f=lambda n,s:s<0and f(n[::-1],-s)[::-1]or n[0]*min(len(n),s)+n[:[0,len(n)-s][len(n)>s]]

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

数値を文字列として受け取り、シフトを整数として受け取ります。文字列を返します。

再帰呼び出しを行うのではなく、関数内に逆転を埋め込もうとしましたが、正しく理解できなかったようです。



0

Haskell、108バイト

まあ、これは思ったより悪くなった。

n#s=print$show n&s
r=reverse
n&s|s<0=r$r n&abs s|(a:b,c)<-splitAt s n=take(length n)$(a<$[0..s])++b++c|1>0=n

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

未ゴルフ

n # s = print $ show n & s
n & s
  | s < 0                = reverse (reverse n & abs s)
  | (a:b,c)<-splitAt s n = take (length n) (replicate s a ++ b ++ c)
  | otherwise            = n

0

Clojure、121バイト

#(let[T(if(pos? %2)reverse vec)](apply str(concat(repeat %2(first %))(T(drop(Math/abs %2)(T %)))(repeat(- %2)(last %)))))

痛い、負の入力にも対処するのは厄介。




0

JavaScript、80バイト

(n,s,k=n.length,p=s<=0)=>n.slice(p*-s,p?k:-s)[p?"padEnd":"padStart"](k--,n[p*k])

入力を数値のストリング表現と数値の「シフト」量として受け取ります。文字列を返します。

テストスニペット

let f=
(n,s,k=n.length,p=s<=0)=>n.slice(p*-s,p?k:-s)[p?"padEnd":"padStart"](k--,n[p*k])

I.value="31415";J.value="3";D.oninput()
<div id=D oninput="O.value=I.value.length&J.value.length?f(I.value,+J.value):''">n: <input id=I size=10> s: <input id=J size=2><br><input id=O disabled>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.