Сделайте (несколько) самоссылочную строку


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
Смотри, не юникод!
Деннис

8
Все же это похоже на какого-то злого водителя.
Джонатан Аллан

12

C, 64 байта

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

Принимает одно целое число в качестве входных данных на стандартный ввод.


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 Да, но это выглядит довольно долго. Я, вероятно, должен сделать встроенный для этого встроенного: P.
Аднан

Встроенная функция для заполнения также была бы очень полезна.
Эминья,

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 байтов с использованием обратных кавычек вместо strиспользования квадратных скобок вокруг генератора благодаря Деннису):

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

Я забыл про zfill ... черт.
Разрушаемый Лимон

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

Вы снова превзошли меня ... серозные времена требуют серьезных мер: мне придется перейти на питон 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

2sable , 13 байт

Код:

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

Использует кодировку CP-1252 .


почему ты не назвал этот 05AB1F? : 3
Конор О'Брайен

1
@ ConorO'Brien Я действительно думал об этом, но тогда имена выглядели бы очень похожими и запутанными: с.
Аднан

Вы имеете в виду15AB1E
только ASCII


3

Баш, 31 22 байта

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

Проверьте это на Ideone .

Спасибо @izabera за отыгрывание 6 байтов!


3

Рубин, 52 48 + nфлаг = 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а затем сохранить байт, назначив его переменной?
Карл Напф

Я так не думаю .. что ты имеешь в виду. Кроме того, я бы переиграл вас с Python 2, но некоторые глупости, которые происходят прямо сейчас ._.
Разрушаемый Лимон

Похоже, вы перешли на Python 2. Кроме того, согласно консенсусу по мета , использование backspace для перезаписи части вывода разрешено только в художественных задачах ASCII.
Деннис

В Python 2 /выполняет целочисленное деление аргументов foe.integer.
Деннис

2

зш, 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

к4, 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)'). Главные биты используют forпетлю и 1e${b}трюк Нейла .
user81655

@ user81655 - это дает мне Uncaught SyntaxError: Invalid or unexpected token. Еще не отлажен, так как я только что проснулся: D
eited

Хммм. Это могут быть скрытые символы, которые иногда добавляются в SO комментарии. Попробуйте написать это.
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элемента th вектора: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 Его предложение (см. Комментарии) увеличило это значение на 5 байт до 78 байт.


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.