Створіть перемикач


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 байти

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

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

Спробуйте в Інтернеті!

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

|⍺ абсолютне значення зсуву

a← зберігати в а

 тоді

⌽⍵ зворотне число

 виберіть першу (тобто останню) цифру

a⍴r сформуйте його по довжині a

⍵, додайте номер

(), Додайте наступне:

  ⊃⍵ перша цифра

  a⍴r сформуйте його по довжині 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)

Вхідні дані: число, яке слід змістити у вигляді рядка; кількість зсуву як число.

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Врахуйте вхідні дані '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 Дякую! До речі, я щойно додав пояснення
Луїс Мендо

1

J, 37 байт

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

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

J вбудований дієсловом shift дозволяє вам налаштувати символ "fill":

|.!.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 як рядок, яка (можливо, неправильно) передбачається, що ідентифікатор заборонений. хоч це врятувало б мені лише 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

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.