Erstellen Sie einen Shifter

10

Gehen Sie nwie folgt vor, um über mehrere Stellen zu "verschieben" :

  • Entfernen Sie die letzten nZiffern
  • Fügen Sie nam Anfang der Nummer Kopien der ersten Ziffer hinzu

Zum Beispiel können die Zahl zu verschieben 31415drei Plätze, die letzten drei Ziffern nehmen zu erhalten 31, und fügen Sie dann drei weitere Kopien der ersten Ziffer 3, bis zum Ende, geben 33331.

Wenn die Zahl negativ ist, sollten stattdessen Ziffern von links genommen und die erste Ziffer von rechts "ausgefüllt" werden. Zum Beispiel 31415ergibt die um -3 Stellen verschobene Zeichenfolge 15555.

Wenn die Zahl 0 ist, sollte keine Änderung vorgenommen werden.

Wenn die Verschiebung länger als die Länge des Programms ist, werden möglicherweise ausgefüllte Ziffern entfernt. Dies bedeutet, dass, wenn die angegebene Zahl größer als die Länge der Zeichenfolge ist, keine weiteren Änderungen vorgenommen werden, nachdem die gesamte Zeichenfolge eine einzelne Ziffer geworden ist.

Die Herausforderung

Bei zwei Zahlen nund swird die Rückkehr num sOrte verschoben .

Testfälle

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

Dies ist , daher gewinnt die kürzeste gültige Übermittlung (gemessen in Bytes).

K Split X.
quelle
Was ist das Gewinnkriterium?
Herr Xcoder
5
Ich glaube nicht zu verstehen, was das "Verschieben" bewirkt. Dies ist mit [binär] markiert, was mich glauben lässt, dass es etwas mit binären Verschiebungen zu tun hat. Vielleicht würde es helfen, die Zahlen in den Testfällen auch binär anzuzeigen?
Esolanging Fruit
2
Es verschiebt und "streckt" die erste oder letzte Ziffer. Was ist unklar?
Luis Mendo
2
Ja, es ist ziemlich klar, was sie fragen
Wrymug
3
Die Verschiebung ist gut definiert: ganzzahlige Multiplikation oder Division durch eine Potenz der Basis. Da jedoch keiner der Testfälle funktioniert, scheint diese Frage eine eigenwillige Definition zu verwenden und nicht zu sagen, was es ist.
Peter Taylor

Antworten:

2

APL (Dyalog) , 32 Bytes

Anonyme Funktion, die das Sieben als linkes Argument und die Zahl (als Zeichenfolge) als rechtes Argument verwendet.

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

Probieren Sie es online aus!

{ anonyme Funktion, bei der und linke und rechte Argumente sind

|⍺ der absolute Wert der Verschiebung

a← speichern in einem

 dann

⌽⍵ die Zahl umkehren

 Wählen Sie die erste (dh letzte) Ziffer

a⍴r es auf Länge umformen a

⍵, Stellen Sie die Nummer voran

(), Stellen Sie Folgendes voran:

  ⊃⍵ die erste Ziffer

  a⍴r es auf Länge umformen a

()↓ Geben Sie die folgende Anzahl von Zeichen ein:

  a-⍺a minus die Verschiebung

()↑ Nimm die folgende Anzahl von Zeichen:

  ≢⍵ die Länge der ursprünglichen Nummer

Adam
quelle
2

Haskell, 69 Bytes

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

Nimmt die Nummer als Zeichenfolge. Probieren Sie es online aus!

Wie es funktioniert:

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
quelle
2

MATL , 12 Bytes

tn:i-yn1&Xl)

Eingaben sind: Zahl, die als Zeichenfolge verschoben werden soll; Verschiebungsbetrag als Zahl.

Probieren Sie es online aus! Oder überprüfen Sie alle Testfälle .

Consisder Eingänge '452und '-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
quelle
1
Dies ist bei weitem die geringste Anzahl von Bytes gute Arbeit!
K Split X
@KSplitX Danke! Übrigens habe ich gerade eine Erklärung hinzugefügt
Luis Mendo
1

J, 37 Bytes

Dies war eine dieser Situationen in J, in denen ein explizites Verb wie die richtige (die einzige?) Wahl schien, aber ich würde gerne wissen, ob es eine stillschweigende Neufassung davon gibt:

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

Mit dem in J eingebauten Shift-Verb können Sie das Füllzeichen konfigurieren:

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

Die Logik zum Bestimmen, ob das erste oder das letzte Zeichen als Füllzeichen verwendet werden soll, ist unkompliziert

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

Probieren Sie es online aus!

Jona
quelle
1

J , 23 Bytes

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

Eingabe n und Ausgabe sind Zeichenfolgen, die die Zahlen enthalten.

Probieren Sie es online aus!

Erläuterung

(_&(]{.,],{:)~|)}.~_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
Meilen
quelle
schön. Ich vermutete, es gab einen besseren Ansatz als meinen ...
Jonah
obwohl ich bemerke, dass Sie n als Zeichenfolge nehmen, von der (möglicherweise fälschlicherweise) angenommen wurde, dass sie nicht zulässig war. obwohl es mir nur 4 Zeichen gerettet hätte ...
Jonah
1

05AB1E , 16 Bytes

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

Probieren Sie es online aus!

Erläuterung

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
quelle
0

Python 2 , 87 Bytes

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

Probieren Sie es online aus!

Nimmt die Zahl als Zeichenfolge und die Verschiebung als Ganzzahl. Gibt eine Zeichenfolge zurück.

Ich habe versucht, die Umkehrung in die Funktion einzubetten, anstatt einen rekursiven Aufruf zu tätigen, aber ich konnte es anscheinend nicht richtig machen.

musicman523
quelle
0

Haskell , 108 Bytes

Na ja, das ging schlimmer als ich dachte ..

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

Probieren Sie es online aus!

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

Clojure, 121 Bytes

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

Autsch, böse, auch mit negativen Eingaben umzugehen.

NikoNyrh
quelle
0

Pyth, 28 Bytes

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

Probieren Sie es online aus oder testen Sie einige Eingaben

Erläuterung

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
quelle
0

05AB1E , 33 Bytes

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

Probieren Sie es online aus!


05AB1E ist nicht so heiß mit Bedingungen.

Magische Krakenurne
quelle
0

JavaScript, 80 Bytes

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

Übernimmt die Eingabe als Zeichenfolgendarstellung der Zahl und als numerischen "Verschiebungsbetrag". Gibt eine Zeichenfolge zurück.

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
quelle