Создать шифтер

10

Чтобы «переместиться» на несколько nмест, сделайте следующее:

  • Удалить последние nцифры
  • Добавить nкопии первой цифры в начало номера

Например, чтобы сдвинуть число на 31415три позиции , достаньте последние три цифры, чтобы получить 31, а затем добавьте еще три копии первой цифры, 3в конце, давая 33331.

Если число отрицательное, цифры должны быть взяты слева, а первая цифра должна быть «заполнена» справа. Например, строка, 31415сдвинутая на -3 места, дает 15555.

Если число равно 0, никаких изменений не должно быть.

Если смещение превышает длину программы, заполненные цифры могут начать удаляться. Это означает, что если указанное число превышает длину строки, дальнейшие изменения не будут сделаны после того, как вся строка станет одной цифрой.

Соревнование

Учитывая два числа, nи sвозвращение nсдвинуто по sместам.

Контрольные примеры

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

Это , поэтому выигрывает самое короткое действительное представление (измеряется в байтах).

К Сплит Х
источник
Какой критерий победы?
мистер Xcoder
5
Я не думаю, что понимаю, что делает «сдвиг». Это помечено [двоичное], что заставляет меня думать, что это как-то связано с двоичными сдвигами. Может быть, это поможет также отображать числа в двоичном коде в тестовых случаях?
Esolanging Fruit
2
Это сдвиг и «растяжение» первой или последней цифры. Что неясно?
Луис Мендо
2
да, это довольно ясно, что они просят
wrymug
3
Сдвиг хорошо определен: целочисленное умножение или деление на степень основания. Но ни один из тестовых случаев не работает, поэтому этот вопрос, похоже, использует своеобразное определение и не говорит, что это такое.
Питер Тейлор

Ответы:

2

APL (Dyalog) , 32 байта

Анонимная функция, которая принимает sift в качестве левого аргумента и число (в виде строки) в качестве правого аргумента.

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

Попробуйте онлайн!

{ анонимная функция, где и - левый и правый аргументы

|⍺ абсолютная величина сдвига

a← магазин в а

 тогда

⌽⍵ поменять номер

 выбрать первую (т.е. последнюю) цифру

a⍴г eshape его длина а

⍵, предварять число

(), Добавьте следующее:

  ⊃⍵ первая цифра

  a⍴г eshape его длина а

()↓ Отбросьте следующее количество символов:

  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)

Входные данные: число, которое должно быть смещено в виде строки; количество сдвига как число.

Попробуйте онлайн! Или проверьте все тестовые случаи .

Консисдер входов '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 Split X
@KSplitX Спасибо! Кстати, я только что добавил объяснение
Луис Мендо
1

J 37 байт

Это была одна из тех ситуаций в J, где явный глагол казался правильным (единственным?) Выбором, но я хотел бы знать, есть ли молчаливое переписывание этого:

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
Emigna
источник
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]]

Попробуйте онлайн!

Принимает число в виде строки, а сдвиг в виде целого числа. Возвращает строку.

Я попытался встроить реверсирование в функцию, а не делать рекурсивный вызов, но я не мог понять, что это правильно.

musicman523
источник
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

Попробуйте онлайн!

Ungolfed

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 %)))))

Ох, противно также иметь дело с негативными данными.

NikoNyrh
источник
0

Pyth, 28 байт

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

Попробуйте онлайн или протестируйте некоторые материалы

объяснение

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).
К Чжан
источник
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>

Джастин Маринер
источник