สร้างจำแลง


10

หากต้องการ "เลื่อน" เหนือnสถานที่จำนวนหนึ่งให้ทำดังนี้:

  • ลบnตัวเลขสุดท้าย
  • เพิ่มnสำเนาของตัวเลขตัวแรกไปยังจุดเริ่มต้นของตัวเลข

ตัวอย่างเช่นการเปลี่ยนหมายเลข31415สามสถานที่ที่จะออกตัวเลขสามหลักสุดท้ายที่จะได้รับ31แล้วเพิ่มสามสำเนาของหลักแรกไปที่ปลายให้333331

หากตัวเลขเป็นลบตัวเลขควรนำมาจากด้านซ้ายแทนและหลักแรกควรเป็น "กรอก" จากด้านขวา ยกตัวอย่างเช่นสตริง31415ตัวเหนือ -3 15555ตำแหน่งให้

ถ้าตัวเลขเป็น 0 ไม่ควรทำการเปลี่ยนแปลง

หากการเปลี่ยนแปลงมีค่ามากกว่าความยาวของโปรแกรมตัวเลขที่ถูกกรอกไว้อาจเริ่มถูกลบออก ซึ่งหมายความว่าหากจำนวนที่กำหนดมีค่ามากกว่าความยาวของสตริงจะไม่มีการเปลี่ยนแปลงเพิ่มเติมหลังจากสตริงทั้งหมดกลายเป็นตัวเลขหลักเดียว

ความท้าทาย

ได้รับสองตัวเลขnและsผลตอบแทนnขยับมากกว่าsตำแหน่ง

กรณีทดสอบ

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

นี่คือดังนั้นการส่งที่ถูกต้องสั้นที่สุด (วัดเป็นไบต์) ชนะ


เกณฑ์การชนะคืออะไร
Mr. Xcoder

5
ฉันไม่คิดว่าฉันเข้าใจสิ่งที่ "ขยับ" ทำ นี่คือการติดแท็ก [ไบนารี] ซึ่งทำให้ฉันคิดว่ามันเกี่ยวข้องกับการเปลี่ยนแปลงแบบไบนารี บางทีมันอาจช่วยแสดงตัวเลขเป็นเลขฐานสองในกรณีทดสอบได้หรือไม่
แยกผลไม้

2
มันกำลังขยับและ "ยืด" หลักแรกหรือหลักสุดท้าย ไม่มีความชัดเจนอะไร
Luis Mendo

2
ใช่มันค่อนข้างชัดเจนว่าพวกเขากำลังถามอะไรอยู่
wrymug

3
การเลื่อนถูกกำหนดไว้อย่างดี: การคูณจำนวนเต็มหรือการหารด้วยกำลังของฐาน แต่กรณีทดสอบไม่ทำงานดังนั้นคำถามนี้ดูเหมือนจะใช้คำจำกัดความที่เป็นนิสัยและไม่ได้บอกว่ามันคืออะไร
Peter Taylor

คำตอบ:


2

APL (Dyalog) 32 ไบต์

ฟังก์ชั่นไม่ระบุชื่อซึ่งใช้เวลาร่อนเป็นอาร์กิวเมนต์ซ้ายและจำนวน (เป็นสตริง) เป็นอาร์กิวเมนต์ที่ถูกต้อง

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

ลองออนไลน์!

{ ฟังก์ชันที่ไม่ระบุชื่อโดยที่และเป็นอาร์กิวเมนต์ด้านซ้ายและขวา

|⍺ ค่าสัมบูรณ์ของการเปลี่ยนแปลง

a← เก็บใน

 แล้วก็

⌽⍵ ย้อนกลับจำนวน

 เลือกตัวเลข (เช่นสุดท้าย) หลัก

a⍴R eshape มันยาว

⍵, เติมหมายเลข

(), เพิ่มรายละเอียดต่อไปนี้:

  ⊃⍵ ตัวเลขตัวแรก

  a⍴R 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)

อินพุตคือ: ตัวเลขที่จะเลื่อนเป็นสตริง ปริมาณของการขยับเป็นจำนวน

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

ปัจจัยการผลิต Consisder และ'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 ขอบคุณ! BTW ฉันเพิ่งเพิ่มคำอธิบาย
Luis Mendo

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

สวย. ฉันสงสัยว่ามีวิธีการที่ดีกว่าของฉัน ...
Jonah

แม้ว่าฉันสังเกตเห็นว่าคุณใช้ n เป็นสตริงซึ่งรหัส (อาจไม่ถูกต้อง) สันนิษฐานว่าไม่ได้รับอนุญาต แม้ว่ามันจะช่วยชีวิตฉันให้เหลือเพียง 4 ตัวอักษรเท่านั้น ...
Jonah


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

รับอินพุตเป็นสตริงแสดงถึงจำนวนและจำนวน "shift" ที่เป็นตัวเลข ส่งคืนสตริง

ตัวอย่างการทดสอบ

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>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.