Складіть (дещо) самореференційний рядок


27

Ви хочете , щоб зробити рядок , в якій ( 1-індексований ) символ за індексом nє n. Коли nменше ніж 10, це легко: "123456789". nНаприклад, коли 12, це стає неможливим, оскільки числа, що перевищують 9 (у базі 10), містять більше одного символу. Ми можемо поставити під загрозу шляхом ділення рядка на два символьних підрядка: "020406081012". Тепер індекс кінця кожної підрядки n є n.

Це можна узагальнити для будь-якого dчисла -знаків. Ось пояснення для частини "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

Введення / виведення у формі цифрових масивів. Спробуйте в Інтернеті! або перевірити всі тестові випадки .

Як це працює

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
І все-таки це схоже на якогось розлюченого водія.
Джонатан Аллан

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 . Спробуйте в Інтернеті! .


Класно! Не знав, що так ñпрацює.
Емінья

1
@Emigna Так, але це виглядає досить довго. Я, мабуть, повинен зробити вбудований для цього вбудований: P.
Аднан

Вбудований накладки також був би дуже корисний.
Емінья

6

Python 2, 78 70 68 64 63 байт

Насправді на основі ідеї Destructible Watermelon робить її ще меншою (використання inputще краще) (заповнення рядка назад заощаджує 4 байти) (немає ()в while):

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

Ось старий підхід на 70 байт (Збереження 8 байтів за допомогою зворотних лапок замість strта опускання квадратних дужок навколо генератора завдяки Деннісу):

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

Я забув про zfill ... чорт.
Зруйнований лимон

Ви можете використовувати ​`x`​замість str(x). Крім того, вам не потрібен []генератор навколо.
Денніс

Ти знову перевершив мене ... серйозні рази вимагають серйозних заходів: мені доведеться перейти на python 2
Руйнуючий лимон

боже, ти знову це зробив!
Зруйнований лимон

1
Вам не потрібні парони while(n).
Денніс


4

JavaScript (ES6), 66

Рекурсивний, введення nв якості рядка (а не число) та обмеження розміру вихідної рядки до 2 Гб (що вище межі рядка більшості двигунів javascript)

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

2 придатних , 13 байт

Код:

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

Використовує кодування CP-1252 .


чому ти не назвав цього 05AB1F? : 3
Conor O'Brien

1
@ ConorO'Brien Я насправді про це думав, але тоді назви виглядатимуть дійсно подібними та заплутаними: p.
Аднан

ви маєте на увазі15AB1E
лише ASCII


3

Баш, 31 22 байт

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

Перевірте це на Ideone .

Дякуємо @izabera за те, що ти граєш на 6 байт!


3

Ruby, 52 48 + nпрапор = 49 байт

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

Можливо, вам не потрібно, chopякщо ви припускаєте, що вхід передається без зворотного нового рядка? Я не впевнений, чи спрацювало б це. А як щодо припущення, що завжди є таке, і написання l=~-size?
Лінн

@Lynn дзвінки 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а потім зберігати байти, присвоюючи його змінній?
Карл Напф

Я не думаю, що так. Крім того, я би перемогла вас з python 2, але деякі дурні речі, що зараз трапляються ._.
Зруйнований лимон

Здається, ви перейшли на Python 2. Крім того, за умови консенсусу щодо мета , використання зворотної області для перезапису частини виводу дозволено лише в арт-завданнях ASCII.
Денніс

У Python 2 /виконує цілі поділи аргументів foe.integer.
Денніс

2

zsh, 28 байт

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

zsh + seq, 21 20 байт

Це майже та сама відповідь, що і Денніс, але в 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!

Безголівки:

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)'). Основні біти використовують forцикл і 1e${b}хитрість Ніла .
користувач81655

@ user81655 - це дає мені Uncaught SyntaxError: Invalid or unexpected token. Ще не налагоджено, оскільки я просто прокинувся: D
eithed

Хммм. Це можуть бути приховані символи, які іноді додаються до коментарів SO. Спробуйте записати це.
користувач81655

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, але наявність випадкових літер, котрі блукають у коді, робить її більш… загадковою

Недоліковані:
кожен 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першого елемента списку, а потім до цього iелемента вектора, записавшиstrsplit[[1]][i]


спробуйте використовувати str_pad ()
hedgedandlevered

@hedgedandlevered: ну для цієї функції потрібен пакет (тобто її не можна запускати з ваніллю 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;}

Поради більше вітаються. Управління гольфувати його на один байт, змінюючи його з циклу for на цикл.

Цей код передбачає, що це виконується з командного рядка і що $ argv [1] є int.

Завдяки:

@AlexGittemeier Його пропозиція (див. Коментарі) поширила це на 5 байт до 78 байт.


Ви можете змінити echo sprintf(...)->printf(...)
Alex Gittemeier

0

Perl 6, 69 59 46 байт

{my \a=.chars;(a,2*a...$_).fmt("%0"~a~"s","")}

1
Ви можете використовувати fmtв списку замість map, sprintfі [~]. 42 байти
Jo King
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.