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


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

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

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

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

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


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>

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.