สร้างสตริงอ้างอิงตัวเอง (ค่อนข้าง)


27

คุณต้องการให้สตริงที่ ( 1 จัดทำดัชนี ) ตัวละครที่ดัชนีคือn nเมื่อnน้อยกว่า 10 "123456789"นี้เป็นเรื่องง่าย: nตัวอย่างเช่นเมื่อเป็น 12 มันจะเป็นไปไม่ได้เนื่องจากตัวเลขที่มากกว่า 9 (ในฐาน 10) ใช้เวลามากกว่าหนึ่งตัว "020406081012"เราสามารถประนีประนอมโดยการหารสตริงสตริงเข้าไปในสองตัวละครนี้: ตอนนี้ดัชนีของการสิ้นสุดของแต่ละย่อย คือnn

สิ่งนี้สามารถวางนัยสำหรับdหมายเลข -digit ใด ๆ นี่คือคำอธิบายสำหรับส่วน "0991021" ของสตริงสำหรับตัวเลขสามหลัก:

Index:     ... * 97  98  99*100 101 102*103 ...
               *           *           *
               *---+---+---*---+---+---*---+
Character: ... * 0 | 9 | 9 * 1 | 0 | 2 * 1 | ...
               *---+---+---*---+---+---*---+

หากคุณยังไม่ได้คิดออกคุณจะต้องเขียนโปรแกรม / ฟังก์ชั่นที่รับสตริงหรือจำนวนเต็มและส่งออกสตริงอ้างอิงตัวเองตามที่ระบุไว้ข้างต้น นอกจากนี้คุณยังสามารถส่งออกอาเรย์ของตัวเลขหลักเดียวตัวอักษรหรือสตริงอักขระเดี่ยว

จำนวนเต็มที่กำหนดจะเป็นบวกและหารด้วยความยาวเสมอ (เช่น 126 หารด้วย 3; 4928 หารด้วย 4) โปรแกรมของคุณควรทำงานในทางทฤษฎีสำหรับอินพุตที่มีขนาดใหญ่ตามอำเภอใจ แต่คุณสามารถสมมติว่ามันมีขนาดเล็กกว่าจำนวนเต็มสูงสุดและ / หรือความยาวสตริง

ข้อสังเกตบางอย่างหากคุณยังไม่ได้รับ: ความยาวของเอาต์พุตจะเป็นอินพุตเองเสมอและตัวเลขที่ปรากฏในผลลัพธ์จะหารด้วยจำนวนหลักในอินพุต

นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ

กรณีทดสอบ

1    => 1
9    => 123456789
10   => 0204060810
105  => 003006009012015018021024027030033036039042045048051054057060063066069072075078081084087090093096099102105
1004 => 00040008001200160020002400280032003600400044004800520056006000640068007200760080008400880092009601000104010801120116012001240128013201360140014401480152015601600164016801720176018001840188019201960200020402080212021602200224022802320236024002440248025202560260026402680272027602800284028802920296030003040308031203160320032403280332033603400344034803520356036003640368037203760380038403880392039604000404040804120416042004240428043204360440044404480452045604600464046804720476048004840488049204960500050405080512051605200524052805320536054005440548055205560560056405680572057605800584058805920596060006040608061206160620062406280632063606400644064806520656066006640668067206760680068406880692069607000704070807120716072007240728073207360740074407480752075607600764076807720776078007840788079207960800080408080812081608200824082808320836084008440848085208560860086408680872087608800884088808920896090009040908091209160920092409280932093609400944094809520956096009640968097209760980098409880992099610001004

คำตอบ:


8

เยลลี่ 12 ไบต์

VRUmLDUz0ZFU

I / O อยู่ในรูปของอาร์เรย์หลัก ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทุก

มันทำงานอย่างไร

VRUmLDUz0ZFU  Main link. Argument: A (digit array)

V             Eval; turn the digits in A into an integer n.
 R            Range; yield [1, ..., n].
  U           Upend; reverse to yield [n, ..., 1].
    L         Yield the length (l) of A.
   m          Modular; keep every l-th integer in A.
     D        Decimal; convert each kept integer into the array of its digits.
      U       Upend; reverse the digits of each integer.
       z0     Zip/transpose with fill value 0.
         Z    Zip again.
              This right-pads all digit arrays with zeroes.
          F   Flatten the resulting 2D array.
           U  Upend/reverse it.

7
ดูสิไม่มี Unicode!
เดนนิส

8
ถึงกระนั้นก็ดูเหมือนว่าคนขับรถที่โกรธแค้น
Jonathan Allan

12

C, 64 ไบต์

l,i;main(n){for(scanf("%d%n",&n,&l);i<n;)printf("%0*d",l,i+=l);}

ใช้จำนวนเต็มเดียวเป็นอินพุตบน stdin


9

JavaScript (ES6), 83 ไบต์

n=>[...Array(n/(l=`${n}`.length))].map((_,i)=>`${+`1e${l}`+l*++i}`.slice(1)).join``

ใช่นั่นคือสตริงแม่แบบซ้อนกัน 79 ไบต์ใน ES7:

n=>[...Array(n/(l=`${n}`.length))].map((_,i)=>`${10**l+l*++i}`.slice(1)).join``

7

MATL , 15 14 ไบต์

VntG3$:10YA!1e

ลองออนไลน์!

V        % Implicitly input number, n. Convert to string
n        % Length of that string, s
t        % Duplicate s
G        % Push n again
3$:      % 3-input range (s,s,n): generates [s, 2*s, ... ] up to <=n
10YA     % Convert each number to base 10. This gives a 2D array of char, with each
         % number on a row, left-padded with zeros if needed
!1e      % Reshape into a string, reading in row-major order. Implicitly display

6

05AB1E , 15 ไบต์

รหัส:

LD¹gÖÏvy0¹g×0ñ?

คำอธิบาย:

L                # Get the array [1, ..., input].
 D               # Duplicate this array.
  ¹g             # Get the length of the first input.
    Ö            # Check if it's divisible by input length.
     Ï           # Keep those elements.
      vy         # For each...
         ¹g      # Get the length of the first input.
        0  ×     # String multiply that with "0".
            0ñ   # Merge with the number.
              ?  # Pop and print without a newline.

การผสานทำเช่นนี้:

จากสิ่งเหล่านี้:

000
 12

มันเป็นผลลัพธ์นี้:

012

ใช้การเข้ารหัสCP-1252 ลองออนไลน์! .


เย็น! ไม่ทราบว่าใช้ñงานได้ดี
Emigna

1
@Emigna ใช่ แต่มันดูค่อนข้างยาว ฉันน่าจะสร้าง builtin สำหรับ builtin นั้น: P
Adnan

builtin สำหรับการรองจะมีประโยชน์เช่นกัน
Emigna

6

Python 2, 78 70 68 64 63 ไบต์

ตามจริงความคิดของแตงโมที่ถูกทำลายทำให้มันมีขนาดเล็กลง (ใช้inputดียิ่งขึ้น) (กรอกสตริงย้อนหลังบันทึก 4 ไบต์) (ไม่มี()ที่while):

n,s=input(),''
l=len(`n`)
while n:s=`n`.zfill(l)+s;n-=l
print s

นี่คือวิธี 70 ไบต์แบบเก่า (ประหยัด 8 ไบต์โดยใช้ backquotes แทนstrและปล่อยวงเล็บเหลี่ยมรอบเครื่องกำเนิดไฟฟ้าด้วยเดนนิส)

def f(n):l=len(`n`);print"".join(`x`.zfill(l)for x in range(l,n+l,l))

ฉันลืมเกี่ยวกับ zfill ... ยี้
มะนาวที่สามารถทำลายได้

คุณสามารถใช้แทน​`x`​ str(x)นอกจากนี้คุณไม่ต้องการ[]รอบเครื่องกำเนิดไฟฟ้า
Dennis

คุณแซงหน้าฉันอีกครั้ง ... เวลาที่เซรุ่มเรียกร้องให้มีมาตรการที่จริงจัง: ฉันจะต้องเปลี่ยนเป็นงูหลาม 2
เลมอนที่ถูกทำลายได้

goddamnit คุณทำมันอีกครั้ง!
เลมอนที่ถูกทำลายได้

1
คุณไม่จำเป็นต้องมี parens while(n)ค่ะ
เดนนิส


4

JavaScript (ES6), 66

เรียกซ้ำป้อนข้อมูลnเป็นสตริง (ไม่ใช่ตัวเลข) และ จำกัด ขนาดสตริงเอาท์พุทไว้ที่ 2GB (ซึ่งอยู่เหนือขีด จำกัด สตริงของเครื่องมือจาวาสคริปต์ส่วนใหญ่)

f=(n,i=1e9,s='',l=n.length)=>s[n-1]?s:f(n,i+=l,s+(i+'').slice(-l))

ทดสอบ

f=(n,i=1e9,s='',l=n.length)=>s[n-1]?s:f(n,i+=l,s+(i+'').slice(-l))

function test() {
  var v=I.value;
  Alert.textContent=v % v.length ?
    'Warning: input value is not divisible by its string length':'\n';
  Result.textContent=f(v);
}  

test()
<input type=number id=I value=105 oninput='test()' max=500000>
<pre id=Alert></pre>
<pre id=Result></pre>


4

R, 66 64 62 ไบต์

แก้ไข:

x=nchar(n<-scan());paste0(str_pad(1:(n/x)*x,x,,0),collapse="")

ความพยายามครั้งแรกของกอล์ฟ ...


2
สวัสดีและยินดีต้อนรับสู่ PPCG! โพสต์แรกที่ดี!
Rɪᴋᴇʀ

3

2sable , 13 ไบต์

รหัส:

g©÷F®N>*0®×0ñ

ใช้การเข้ารหัสCP-1252


ทำไมคุณไม่ตั้งชื่อ 05AB1F นี้ : 3
Conor O'Brien

1
@ จริง ConorO'Brien ฉันคิดว่าเกี่ยวกับที่ แต่แล้วชื่อจะมีลักษณะมันคล้ายกันและทำให้เกิดความสับสน: p
Adnan

คุณหมายถึง15AB1E
ASCII เท่านั้น


3

Bash, 31 22 ไบต์

seq -ws '' ${#1}{,} $1

ทดสอบบนIdeone

ขอบคุณ @izabera สำหรับการเล่นกอล์ฟที่มีขนาด 6 ไบต์!


3

Ruby, 52 48 + nflag = 49 ไบต์

((l= ~/$/)..$_.to_i).step(l){|j|$><<"%0#{l}d"%j}

บางทีคุณไม่จำเป็นต้องทำchopถ้าคุณคิดว่าอินพุตถูกส่งผ่านโดยไม่ขึ้นบรรทัดใหม่หรือไม่ ฉันไม่แน่ใจว่าทำงานได้หรือไม่ หรือวิธีการเกี่ยวกับการสมมติว่ามีเสมอและเขียนl=~-size?
ลินน์

@ ลินน์โทรsizeแบบนั้นไม่ได้ผลสำหรับฉัน โอ้ฉันจำเคล็ดลับที่ฉันใช้ในคำตอบก่อนหน้านี้ที่สั้นกว่านี้ได้บ้าง
Value Ink

2

Python 3 2, 79 74 69 65 68 67 ไบต์

ขอบคุณเดนนิส!

def f(n):i=l=len(`n`);s='';exec n/l*"s+=`i`.zfill(l);i+=l;";print s

จำนวนไบต์เพิ่มขึ้นจากวิธีการส่งออกที่ไม่ดี


1
มันควรจะเป็นlen(x)แทนที่จะเป็นfแล้วบันทึกไบต์โดยกำหนดให้กับตัวแปรหรือไม่?
Karl Napf

ฉันไม่คิดอย่างนั้น .. คุณหมายถึงอะไร นอกจากนี้ฉันจะทำให้คุณประหลาดใจด้วยงูหลาม 2 แต่บางสิ่งที่โง่มันเกิดขึ้นตอนนี้.
เลมอนที่ถูกทำลายได้

ดูเหมือนว่าคุณจะเปลี่ยนไปใช้ Python 2 และต่อฉันทามติเกี่ยวกับ metaโดยใช้ backspace เพื่อเขียนทับส่วนของผลลัพธ์ที่ได้รับอนุญาตใน ASCII art challenge เท่านั้น
Dennis

ใน Python 2 /ดำเนินการส่วนอาร์กิวเมนต์ foe.integer สำหรับการหารจำนวนเต็ม
เดนนิส

2

zsh, 28 ไบต์

printf %0$#1d {$#1..$1..$#1}

zsh + seq, 21 20 ไบต์

นี่เป็นคำตอบเดียวกับ Dennis แต่ใน 20 ไบต์เพราะ zsh

seq -ws '' $#1{,} $1


2

Perl, 40 ไบต์

39 รหัสไบต์ + 1 -nสำหรับ

$}=y///c;printf"%0$}d",$i+=$}while$i<$_

การใช้

echo -n 9 | perl -ne '$}=y///c;printf"%0$}d",$i+=$}while$i<$_'
123456789
echo -n 10 | perl -ne '$}=y///c;printf"%0$}d",$i+=$}while$i<$_'
0204060810
echo -n 102 | perl -ne '$}=y///c;printf"%0$}d",$i+=$}while$i<$_'
003006009012015018021024027030033036039042045048051054057060063066069072075078081084087090093096099102
echo -n 1000 | perl -ne '$}=y///c;printf"%0$}d",$i+=$}while$i<$_'
0004000800120016002000240028003200360040004400480052005600600064006800720076008000840088009200960100010401080112011601200124012801320136014001440148015201560160016401680172017601800184018801920196020002040208021202160220022402280232023602400244024802520256026002640268027202760280028402880292029603000304030803120316032003240328033203360340034403480352035603600364036803720376038003840388039203960400040404080412041604200424042804320436044004440448045204560460046404680472047604800484048804920496050005040508051205160520052405280532053605400544054805520556056005640568057205760580058405880592059606000604060806120616062006240628063206360640064406480652065606600664066806720676068006840688069206960700070407080712071607200724072807320736074007440748075207560760076407680772077607800784078807920796080008040808081208160820082408280832083608400844084808520856086008640868087208760880088408880892089609000904090809120916092009240928093209360940094409480952095609600964096809720976098009840988099209961000

2

k4, 27

{,/"0"^(-c)$$c*1+!_x%c:#$x}

ไม่ได้เล่นกอล์ฟเลยเพียงแค่นำสเป็คไปใช้งาน

                        $ / string
                       #  / count
                     c:   / assign to c
                   x%     / divide x by
                  _       / floor
                 !        / range (0-based)
               1+         / convert to 1-based
             c*           / multiply by count
            $             / string
       (-c)               / negative count
           $              / pad (negative width -> right-aligned)
   "0"^                   / fill blanks with zeros
 ,/                       / raze (list of string -> string)

2

Javascript - 76

n=>eval('c="";for(a=b=(""+n).length;a<=n;a+=b)c+=`${+`1e${b}`+a}`.slice(1)')

หรือ71ถ้าอนุญาตให้โต้แย้งสตริง:

n=>eval('c="";for(a=b=n.length;a<=n;a+=b)c+=`${+`1e${b}`+a}`.slice(1)')

ขอบคุณที่ @ user81655!

Ungolfed:

function x(n)
{ 
   c = "", a = b = (""+n).length; 
   while(a<=n)
   {
       c=c+"0".repeat(b-(""+a).length)+a
       a+=b;
   }
   return c;
}

สถานที่สำหรับการปรับปรุงมาก แต่ตอนนี้ฉันเหนื่อย


ดี! ผมพบว่าการปรับปรุงบางอย่างที่อาจจะทำ (76 n=>eval('c="";for(a=b=(""+n).length;a<=n;a+=b)c+=`${+`1e${b}`+a}`.slice(1)')bytes): บิตหลักกำลังใช้forลูปและ1e${b}เคล็ดลับของนีล
user81655

@ user81655 - Uncaught SyntaxError: Invalid or unexpected tokenมันทำให้ฉัน ยังไม่ได้ดีบั๊กขณะที่ฉันเพิ่งตื่น: D
eithed

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

2

R, 149 142 138 ไบต์

x=rep(0,n);a=strtoi;b=nchar;for(i in 1:(n=scan()))if(!i%%b(a(n)))x[i:(i-b(a(i))+1)]=strsplit(paste(a(i)),"")[[1]][b(a(i)):1];cat(x,sep="")

การปล่อยncharให้โค้ดให้โปรแกรมที่มีจำนวนไบต์เท่ากันแทนที่การแทนที่ด้วยbแต่การมีตัวอักษรแบบสุ่มเดินวนไปมาในโค้ดทำให้มันยิ่งลึกลับ ... ลึกลับ

Ungolfed:
แต่ละnchar(strtoi(something))ใบอนุญาตในการคำนวณจำนวนตัวเลขในจำนวนที่กำหนด

n=scan()   #Takes the integer 
x=rep(0,n) #Creates a vector of the length of this integer, full of zeros

for(i in 1:n)
    if(!i%%b(strtoi(n)))         #Divisibility check
        x[i:(i-nchar(as.integer(i))+1)]=strsplit(paste(a(i)),"")[[1]][nchar(as.integer(i)):1]; 
        #This part replace the zeros from a given position (the index that is divisible) by the numerals of this position, backward.

cat(x,sep="")

strsplitฟังก์ชั่นเอาท์พุทรายการเวกเตอร์ที่มีองค์ประกอบ splitten ที่ นั่นเป็นเหตุผลที่คุณต้องไปถึง1องค์ประกอบ st ของรายการจากนั้นiองค์ประกอบที่สามของเวกเตอร์เขียนstrsplit[[1]][i]


ลองใช้ str_pad ()
hedgedandlevered

@hedgedandlevered: ฟังก์ชั่นนี้ต้องการแพ็คเกจ (เช่นมันไม่สามารถใช้กับvanilla R ได้) และฉันไม่ต้องการใช้ในขณะที่ PPCG-ing
Frédéric

1

SQF - 164

การใช้รูปแบบฟังก์ชั่นเป็นไฟล์:

#define Q String""
l=(ceil log _this)+1;s='';for[{a=l},{a<=_this},{a=a+l}]do{c=([a]joinQ)splitQ;reverse c;c=(c+['0'])select[0,l];reverse c;s=format[s+'%1',c joinQ]}

โทรมา INTEGER call NAME_OF_COMPILED_FUNCTION


1

PowerShell, 77 ไบต์

$x="$($args[0])";$l=$x.Length;-join(1..($x/$l)|%{"$($_*$l)".PadLeft($l,'0')})

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


1

ที่จริงแล้ว 30 ไบต์

;╝R╛$l;)*@#"%0{}d"f╗`#╜%`MΣ╛@H

ลองออนไลน์!

ฉันไม่พอใจกับความยาวของรหัสนี้ แต่ฉันไม่แน่ใจว่าสามารถทำให้สั้นลงได้มาก (ถ้าเลย)

คำอธิบาย:

;╝R╛$l;)*@#"%0{}d"f╗`#╜%`MΣ╛@H
;╝                              duplicate input, push a copy to reg1
  R                             range(1, input+1)
   ╛$l                          push input from reg1, stringify, length
      ;)                        duplicate and move copy to bottom of stack
        *                       multiply range by length of input
         @#                     swap range with length, make length a 1-element list
           "%0{}d"f             "%0{}d".format(length) (old-style Python format string for zero-padding integers to length of input)
                   ╗            save format string in reg0
                    `#╜%`M      for each value in range:
                     #            make it a 1-element list
                      ╜%          format using the format string
                          Σ     concatenate
                           ╛@H  take only the first (input) characters in the resulting string

0

CJam, 19 ไบต์

q_,:V\i,%{V+sV0e[}/

ลองมันออนไลน์ ยังไม่มีใครโพสต์ใน CJam ดังนั้นนี่คือสคริปต์ที่ฉันใช้สำหรับกรณีทดสอบ

คำอธิบาย

q_,:V  e# Store the length of the input as V
\i,    e# Push the range from 0 to the input
%      e# Keep only every V'th number in the array
{      e# Do this for each number:
  V+   e# Add V to get the right number of leading zeroes
  s    e# Convert to string for left padding
  V    e# Push V, the length to bring each string to, and...
  0    e# The character to add to the left
  e[   e# Left pad
}/

0

PHP, 83 78 ไบต์

<?$a=$argv[1];$i=$y=strlen($a);while($y<=$a){printf('%0'.$i.'d', $y);$y+=$i;}

เคล็ดลับเพิ่มเติมแล้วยินดีต้อนรับ จัดการเล่นกอล์ฟด้วยตัวเองหนึ่งไบต์โดยเปลี่ยนจากห่วงเป็นห่วงในขณะที่

รหัสนี้อนุมานว่าสิ่งนี้กำลังถูกดำเนินการจากบรรทัดคำสั่งและ $ argv [1] เป็น int

ขอบคุณที่:

@AlexGittemeier ข้อเสนอแนะของเขา (ดูความคิดเห็น) golfed นี้ 5 ไบต์ถึง 78 ไบต์


คุณสามารถเปลี่ยนecho sprintf(...)->printf(...)
Alex Gittemeier

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