Stwórz manetkę

10

Aby „przesunąć” na kilka nmiejsc, wykonaj następujące czynności:

  • Usuń ostatnie ncyfry
  • Dodaj nkopie pierwszej cyfry na początku numeru

Na przykład, aby przesunąć liczbę o 31415trzy miejsca, wyjmij trzy ostatnie cyfry, aby uzyskać 31, a następnie dodaj jeszcze trzy kopie pierwszej cyfry 3, do końca, dając 33331.

Jeśli liczba jest ujemna, cyfry należy pobierać z lewej strony, a pierwszą cyfrę należy „wypełnić” z prawej strony. Na przykład ciąg 31415przesunięty o -3 miejsca daje 15555.

Jeśli liczba wynosi 0, nie należy wprowadzać żadnych zmian.

Jeśli przesunięcie jest dłuższe niż długość programu, wówczas wypełnione cyfry mogą zacząć być usuwane. Oznacza to, że jeśli podana liczba jest większa niż długość łańcucha, dalsze zmiany nie zostaną wprowadzone, gdy cały łańcuch stanie się pojedynczą cyfrą.

Wyzwanie

Biorąc pod uwagę dwie liczby, ni spowrót nprzesunięty o smiejsca.

Przypadki testowe

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

To jest , więc wygrywa najkrótsze prawidłowe zgłoszenie (mierzone w bajtach).

K Split X
źródło
Jakie jest kryterium wygranej?
Pan Xcoder,
5
Nie sądzę, że rozumiem, co robi „zmiana”. Jest to oznaczone jako [binarne], co sprawia, że ​​myślę, że ma to coś wspólnego z przesunięciami binarnymi. Może pomogłoby to również wyświetlić liczby binarne w przypadkach testowych?
Esolanging Fruit 18.07.17
2
Przesuwa i „rozciąga” pierwszą lub ostatnią cyfrę. Co jest niejasne?
Luis Mendo,
2
tak, jest całkiem jasne, o co pytają
wrymug
3
Przesunięcie jest dobrze zdefiniowane: mnożenie lub dzielenie liczb całkowitych przez potęgę podstawy. Ale żaden z przypadków testowych nie działa, więc wydaje się, że to pytanie używa idiosynkratycznej definicji i nie mówi, co to jest.
Peter Taylor

Odpowiedzi:

2

APL (Dyalog) , 32 bajty

Anonimowa funkcja, która przyjmuje sift jako lewy argument, a liczbę (jako ciąg) jako prawy argument.

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

Wypróbuj online!

{ anonimowa funkcja gdzie i są argumentami lewymi i prawymi

|⍺ wartość bezwzględna zmiany

a← Przechowywać w A

 następnie

⌽⍵ odwróć numer

 wybierz pierwszą (tj. ostatnią) cyfrę

a⍴R eshape do długości A

⍵, wstaw numer

(),  Wstaw następujące:

  ⊃⍵ pierwsza cyfra

  a⍴R eshape do długości A

()↓ Upuść następującą liczbę znaków:

  a-⍺zaminus przesunięcie

()↑  Weź następującą liczbę znaków:

  ≢⍵ długość oryginalnego numeru

Adám
źródło
2

Haskell, 69 bajtów

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

Pobiera liczbę jako ciąg znaków. Wypróbuj online!

Jak to działa:

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
źródło
2

MATL , 12 bajtów

tn:i-yn1&Xl)

Wejściami są: liczba, która ma być przesunięta jako ciąg; ilość przesunięć jako liczba.

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Dane wejściowe Consisder '452i '-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
źródło
1
To zdecydowanie najmniej bajtów dobrej roboty!
K Split X
@KSplitX Thanks! BTW właśnie dodałem wyjaśnienie
Luis Mendo
1

J, 37 bajtów

To była jedna z tych sytuacji w J, w których wyraźny czasownik wydawał się właściwym (jedynym?) Wyborem, ale chciałbym wiedzieć, czy istnieje milczące przepisanie tego:

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

Wbudowany czasownik J umożliwia konfigurację znaku „fill”:

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

Logika określania, czy użyć pierwszego czy ostatniego znaku jako znaku wypełnienia, jest prosta

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

Wypróbuj online!

Jonasz
źródło
1

J , 23 bajty

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

Dane wejściowe n i dane wyjściowe są łańcuchami zawierającymi liczby.

Wypróbuj online!

Wyjaśnienie

(_&(]{.,],{:)~|)}.~_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
mile
źródło
piękny. podejrzewałem, że było lepsze podejście niż moje ...
Jonah,
chociaż zauważam, że bierzesz n jako ciąg znaków, który (prawdopodobnie niepoprawnie) id nie jest dozwolony. choć zaoszczędziłoby mi to tylko 4 znaki ...
Jonasz
1

05AB1E , 16 bajtów

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

Wypróbuj online!

Wyjaśnienie

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
źródło
0

Python 2 , 87 bajtów

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

Wypróbuj online!

Pobiera liczbę jako ciąg, a przesunięcie jako liczbę całkowitą. Zwraca ciąg.

Próbowałem osadzić odwrócenie w funkcji zamiast wykonywać rekurencyjne wywołanie, ale nie mogłem tego zrobić poprawnie.

musicman523
źródło
0

Python 3 , 73 bajty

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

Wypróbuj online!

wrymug
źródło
0

Haskell , 108 bajtów

No cóż, poszło gorzej niż myślałem ...

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

Wypróbuj online!

Nie golfił

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
ბიმო
źródło
0

Clojure, 121 bajtów

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

Ojej, paskudne radzenie sobie również z negatywnymi danymi wejściowymi.

NikoNyrh
źródło
0

Pyth, 28 bajtów

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

Wypróbuj online lub przetestuj niektóre dane wejściowe

Wyjaśnienie

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
źródło
0

05AB1E , 33 bajty

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

Wypróbuj online!


05AB1E nie jest tak gorący dzięki warunkom.

Urna Magicznej Ośmiornicy
źródło
0

JavaScript, 80 bajtów

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

Pobiera dane wejściowe jako ciąg znaków reprezentujący liczbę i liczbową wartość „przesunięcia”. Zwraca ciąg.

Test Snippet

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
źródło