(어떤) 자기 참조 문자열 만들기


27

당신은 (여기서 문자열을 만들고 싶어 1 인덱스 인덱스) 문자 n입니다 n. 때 n10 미만이는 간단하다 "123456789". 때 n12 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

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
봐봐, 유니 코드 없음!
Dennis

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

자바 스크립트 (ES6), 83 바이트

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

예, 중첩 된 템플릿 문자열입니다. ES7에서 79 바이트 :

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.
Adnan

패딩을위한 내장 기능도 정말 유용 할 것입니다.
Emigna

6

파이썬 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 바이트 접근 방식입니다 ( strDennis 덕분에 발전기 주위에 대괄호 대신 백 따옴표를 사용하여 8 바이트 저장 ).

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

나는 zfill을 잊었다. .. 아.
Destructible Lemon

​`x`​대신 사용할 수 있습니다 str(x). 또한 []발전기 주변이 필요하지 않습니다 .
Dennis

당신은 다시 나를 능가했습니다 ... 장황한 시간은 심각한 조치를 요구합니다 : 나는 파이썬 2로 변경해야합니다
Destructible Lemon

goddamnit 다시 했어!
Destructible Lemon

1
의 괄호가 필요하지 않습니다 while(n).
Dennis


4

자바 스크립트 (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

Brachylog , 53 45 42 37 28 바이트

lB,? ybeN : B % 0, N : ef : {, "0": "9"y :? m.} acAl : Br-: "0"rjb : Acw \ 
lB,? ybeN : B % 0,10 : B ^ : N + : ef : {, "0": "9"y :? m.} acbw \ 
lB,? ybeN : B % 0,10 : B ^ : N + : ef : {: 16 + : @ Prm .} acbw \ 
lB,? ybeN : B % 0,10 : B ^ : N + : efbe : 16 + : @ Prmw \
lB,? ybeN : B % 0,10 : B ^ : N + : efbew \

온라인으로 사용해보십시오!


3

배쉬, 31 22 바이트

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

Ideone에서 테스트하십시오 .

6 바이트를 골라 낸 @izabera에게 감사드립니다!


3

루비, 52 48 + n플래그 = 49 바이트

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

chop후행 줄 바꿈없이 입력이 전달되었다고 가정하면 필요하지 않습니까? 그것이 효과가 있는지 확실하지 않습니다. 아니면 항상 존재한다고 가정하고 글을 쓰는 것은 l=~-size어떻습니까?
Lynn

@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변수에 할당하여 바이트를 저장 하지 말아야 합니까?
Karl Napf

나는 그렇게 생각하지 않습니다. 무슨 뜻입니까? 또한, 나는 파이썬 2로 당신을 능가했지만, 지금 일어나고있는 바보 같은 것들 ._.
Destructible Lemon

또한 파이썬 2로 전환 한 것 같습니다. 또한 메타에 대한 합의에 따라 백 스페이스를 사용하여 출력의 일부를 덮어 쓰는 것은 ASCII 아트 문제에서만 허용됩니다.
Dennis

Python 2에서는 /정수 나누기 foe.integer 인수를 수행합니다.
Dennis

2

zsh, 28 바이트

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

zsh + seq, 21 20 바이트

이것은 Dennis와 거의 같은 대답이지만 zsh 때문에 20 바이트입니다.

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

2

하스켈, 51 바이트

f n|k<-length$show n=[k,2*k..n]>>=tail.show.(+10^k)

2

펄, 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

자바 스크립트-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}트릭을 사용하고 있습니다.
user81655

@ user81655-그것은 나를 준다 Uncaught SyntaxError: Invalid or unexpected token. 내가 깨어
났을 때

흠. 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함수는 분할 된 요소를 포함하는 벡터 목록을 출력합니다. 그래서 1리스트 의 st 요소에 도달 한 다음 i벡터 의 th 요소에 도달해야합니다.strsplit[[1]][i]


str_pad ()을 사용해보십시오
hedgedandlevered

@hedgedandlevered : 음,이 함수는 패키지를 (즉, 그것으로 실행할 수 없습니다 필요 바닐라 R), 나는 PPCG이 - 보내고있는 동안 등 사용하지 않는
프레데릭

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 루프에서 while 루프로 변경하여 1 바이트 씩 직접 골프를 타십시오.

이 코드는 이것이 명령 행에서 실행되고 $ argv [1]이 int 인 것으로 가정합니다.

덕분에 :

@AlexGittemeier 그의 제안 (의견 참조)은 이것을 5 바이트에서 78 바이트로 골프화했다.


변경 가능 echo sprintf(...)->printf(...)
Alex Gittemeier

0

펄 6, 69 59 46 바이트

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

1
당신이 사용할 수있는 fmt대신에 목록에 map, sprintf[~]. 42 바이트
Jo King
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.