Buat shifter

10

Untuk "bergeser" ke sejumlah ntempat, lakukan hal berikut:

  • Hapus ndigit terakhir
  • Tambahkan nsalinan digit pertama ke awal nomor

Misalnya, untuk menggeser nomor 31415tiga tempat, ambil tiga digit terakhir untuk mendapatkan 31, dan kemudian tambahkan tiga salinan dari digit pertama 3,, hingga akhir, memberi 33331.

Jika angka negatif, digit harus diambil dari kiri, dan digit pertama harus "diisi" dari kanan. Misalnya, string 31415bergeser lebih dari -3 memberi tempat 15555.

Jika angkanya 0, tidak ada perubahan yang harus dilakukan.

Jika pergeseran lebih dari panjang program, maka digit yang diisi mungkin mulai dihapus. Ini berarti bahwa jika jumlah yang diberikan lebih dari panjang string, tidak ada perubahan lebih lanjut akan dilakukan setelah seluruh string menjadi satu digit.

Tantangan

Diberi dua angka, ndan s, kembali nbergeser stempat.

Uji kasus

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

Ini adalah , sehingga pengiriman terpendek yang valid (diukur dalam byte) menang.

K Split X
sumber
Apa kriteria kemenangan?
Tn. Xcoder
5
Saya rasa saya tidak mengerti apa yang dilakukan "pergeseran". Ini ditandai [biner], yang membuat saya berpikir itu ada hubungannya dengan pergeseran biner. Mungkin akan membantu untuk juga menampilkan angka dalam biner dalam kasus uji?
Buah Esolanging
2
Ini menggeser dan "meregangkan" digit pertama atau terakhir. Apa yang tidak jelas?
Luis Mendo
2
ya itu cukup jelas apa yang mereka minta
wrymug
3
Pergeseran didefinisikan dengan baik: perkalian integer atau pembagian dengan kekuatan basis. Tapi tidak ada kasus uji yang berfungsi, jadi pertanyaan ini tampaknya menggunakan definisi khusus dan tidak mengatakan apa itu.
Peter Taylor

Jawaban:

2

APL (Dyalog) , 32 byte

Fungsi anonim yang mengambil saringan sebagai argumen kiri dan nomor (sebagai string) sebagai argumen benar.

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

Cobalah online!

{ fungsi anonim di mana dan adalah argumen kiri dan kanan

|⍺ nilai absolut dari pergeseran tersebut

a← simpan di a

 kemudian

⌽⍵ balikkan nomornya

 pilih digit pertama (yaitu yang terakhir)

a⍴r bentuknya menjadi panjang a

⍵, tambahkan nomornya

(... ), tambahkan yang berikut:

  ⊃⍵ digit pertama

  a⍴r bentuknya menjadi panjang a

(... )↓ jatuhkan jumlah karakter berikut:

  a-⍺a minus shift

(... )↑ ambil jumlah karakter berikut:

  ≢⍵ panjang nomor aslinya

Adm
sumber
2

Python 2 , 50 byte

lambda n,s:(n[0]*s+n+n[-1]*-s)[-s*(s<0):][:len(n)]

Cobalah online!

Chas Brown
sumber
2

Haskell, 69 byte

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

Mengambil nomor sebagai string. Cobalah online!

Bagaimana itu bekerja:

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
nimi
sumber
2

MATL , 12 byte

tn:i-yn1&Xl)

Input adalah: nomor yang akan digeser sebagai string; jumlah pergeseran sebagai angka.

Cobalah online! Atau verifikasi semua kasus uji .

Input consisder '452dan '-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'
Luis Mendo
sumber
1
Sejauh ini, ini adalah jumlah terkecil byte yang bagus!
K Split X
@KSplitX Terima kasih! BTW Saya baru saja menambahkan penjelasan
Luis Mendo
1

J, 37 byte

Ini adalah salah satu situasi di J di mana kata kerja eksplisit sepertinya pilihan yang tepat (satu-satunya?), Tapi saya ingin tahu apakah ada penulisan ulang diam-diam tentang ini:

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

Kata kerja shift bawaan J memungkinkan Anda untuk mengonfigurasi karakter "isi":

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

Logika untuk menentukan apakah akan menggunakan karakter pertama atau terakhir sebagai karakter isi sangat mudah

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

Cobalah online!

Jonah
sumber
1

J , 23 byte

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

Input n dan output adalah string yang berisi angka-angka.

Cobalah online!

Penjelasan

(_&(]{.,],{:)~|)}.~_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
mil
sumber
Cantik. saya curiga ada pendekatan yang lebih baik daripada pendekatan saya ...
Jonah
Meskipun saya perhatikan Anda mengambil n sebagai string yang (mungkin salah) id dianggap tidak diizinkan. meskipun itu akan menyelamatkan saya hanya 4 karakter ...
Jonah
1

05AB1E , 16 byte

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

Cobalah online!

Penjelasan

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
Emigna
sumber
0

Python 2 , 87 byte

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]]

Cobalah online!

Mengambil nomor sebagai string, dan menggeser sebagai integer. Mengembalikan string.

Saya mencoba menanamkan pembalikan di dalam fungsi daripada membuat panggilan rekursif, tetapi saya sepertinya tidak bisa melakukannya dengan benar.

musicman523
sumber
0

Python 3 , 73 byte

f=lambda s,i:(f(s+1,i[1:]+i[-1])if s<0else f(s-1,i[0]+i[:-1]))if s else i

Cobalah online!

tukang sihir
sumber
0

Haskell , 108 byte

Oh well, ini menjadi lebih buruk dari yang saya kira ..

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

Cobalah online!

Tidak disatukan

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
ბიმო
sumber
0

Clojure, 121 byte

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

Aduh, tidak enak berurusan dengan input negatif juga.

NikoNyrh
sumber
0

Pyth, 28 byte

AQ=Y<+*hJ?K<0H`G_`GHJlJ?KY_Y

Cobalah online atau uji beberapa input

Penjelasan

AQ=Y<+*hJ?K<0H`G_`GHJlJ?KY_Y
AQ                           | Split Q into 2 parts, G and H.
        J?K<0H`G_`G          | If 0 < H, J = str(G). Else, J = reverse(str(G)). Return J
       h                     | Find 1st element
      *            H         | Repeat H times
     +              J        | Concatenate with J
    <                lJ      | Find 1st length(J) elements
  =Y                         | Assign to Y.
                       ?KY_Y | If K, implicit print Y. Else implicit print reverse(Y).
K Zhang
sumber
0

05AB1E , 33 byte

ÄF¹0‹©i¨ë¦}}²®i¤ë¬}sg¹Ä‚Ws\×®i«ëì

Cobalah online!


05AB1E tidak begitu panas dengan kondisional.

Guci Gurita Ajaib
sumber
0

JavaScript, 80 byte

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

Mengambil input sebagai representasi string dari angka dan jumlah "shift" numerik. Mengembalikan string.

Cuplikan Tes

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>

Justin Mariner
sumber