Zrób (nieco) własny ciąg referencyjny

27

Chcesz, aby ciąg, gdzie ( 1-indeksowane ) znak o indeksie njest n. Gdy njest mniej niż 10, to jest proste: "123456789". Na nprzykład, kiedy jest 12, staje się to niemożliwe, ponieważ liczby większe niż 9 (w bazie 10) zajmują więcej niż jeden znak. Możemy kompromisu poprzez podzielenie ciąg na podciągi dwuznakowych: "020406081012". Teraz indeks końca każdego podciągu n wynosi n.

Można to uogólnić dla dowolnego dnumeru cyfrowego. Oto wyjaśnienie części „0991021” ciągu trzech cyfr:

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

Jeśli jeszcze tego nie rozgryzłeś, musisz napisać program / funkcję, która pobiera ciąg lub liczbę całkowitą i wyprowadza swój ciąg referencyjny, jak określono powyżej. Możesz także wypisać tablicę liczb jednocyfrowych, znaków lub ciągów jednoznakowych.

Podana liczba całkowita będzie zawsze dodatnia i podzielna przez swoją długość (np. 126 jest podzielna przez 3; 4928 jest podzielna przez 4). Twój program powinien teoretycznie działać na dowolnie duże dane wejściowe, ale możesz założyć, że jest on mniejszy niż maksymalna liczba całkowita i / lub długość łańcucha w twoim języku.

Pewne spostrzeżenia, jeśli nadal ich nie otrzymujesz: długością wyjścia zawsze będzie sam sygnał wejściowy, a liczby pojawiające się na wyjściu będą podzielne przez liczbę cyfr na wejściu.

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.

Przypadki testowe

1    => 1
9    => 123456789
10   => 0204060810
105  => 003006009012015018021024027030033036039042045048051054057060063066069072075078081084087090093096099102105
1004 => 00040008001200160020002400280032003600400044004800520056006000640068007200760080008400880092009601000104010801120116012001240128013201360140014401480152015601600164016801720176018001840188019201960200020402080212021602200224022802320236024002440248025202560260026402680272027602800284028802920296030003040308031203160320032403280332033603400344034803520356036003640368037203760380038403880392039604000404040804120416042004240428043204360440044404480452045604600464046804720476048004840488049204960500050405080512051605200524052805320536054005440548055205560560056405680572057605800584058805920596060006040608061206160620062406280632063606400644064806520656066006640668067206760680068406880692069607000704070807120716072007240728073207360740074407480752075607600764076807720776078007840788079207960800080408080812081608200824082808320836084008440848085208560860086408680872087608800884088808920896090009040908091209160920092409280932093609400944094809520956096009640968097209760980098409880992099610001004
NinjaBearMonkey
źródło

Odpowiedzi:

8

Galaretka , 12 bajtów

VRUmLDUz0ZFU

I / O ma postać tablic cyfrowych. Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

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.
Dennis
źródło
7
Spójrz, nie ma Unicode!
Dennis,
8
A jednak wygląda jak zły kierowca.
Jonathan Allan,
12

C, 64 bajty

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

Pobiera jedną liczbę całkowitą jako wejście na standardowe wejście.

orlp
źródło
9

JavaScript (ES6), 83 bajty

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

Tak, to zagnieżdżony ciąg szablonu. 79 bajtów w ES7:

n=>[...Array(n/(l=`${n}`.length))].map((_,i)=>`${10**l+l*++i}`.slice(1)).join``
Neil
źródło
7

MATL , 15 14 bajtów

VntG3$:10YA!1e

Wypróbuj online!

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
Luis Mendo
źródło
6

05AB1E , 15 bajtów

Kod:

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

Wyjaśnienie:

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.

Łączenie odbywa się w następujący sposób:

Z tych:

000
 12

Wynikiem tego jest:

012

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .

Adnan
źródło
Fajne! Nie wiedziałem, że ñtak to działa.
Emigna,
1
@Emigna Tak, ale wygląda raczej na trochę długi. Prawdopodobnie powinienem zrobić wbudowane dla tego wbudowanego: P.
Adnan,
Przydałby się również wbudowany padding.
Emigna
6

Python 2, 78 70 68 64 63 bajty

W rzeczywistości bazując na idei Destructible Watermelon czyni go jeszcze mniejszym (użycie inputjest jeszcze lepsze) (wypełnienie łańcucha do tyłu oszczędza 4 bajty) (no ()at while):

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

Oto stare podejście 70-bajtowe (Oszczędność 8 bajtów poprzez użycie cudzysłowów zamiast stri upuszczanie nawiasów kwadratowych wokół generatora dzięki Dennisowi):

def f(n):l=len(`n`);print"".join(`x`.zfill(l)for x in range(l,n+l,l))
Karl Napf
źródło
Zapomniałem o zfill ... cholera.
Destructible Lemon
Możesz użyć ​`x`​zamiast str(x). Ponadto nie potrzebujesz []wokół generatora.
Dennis,
Znów mnie obezwładniłeś ... ciężkie czasy wymagają poważnych działań: będę musiał przejść na python 2
Destructible Lemon
cholera, znowu to zrobiłeś!
Destructible Lemon
1
Nie potrzebujesz parenów while(n).
Dennis,
5

Python 2, 63 bajty

def f(n):l=len(`n`);print'%%0%dd'%l*(n/l)%tuple(range(l,n+1,l))

Przetestuj na Ideone .

Dennis
źródło
3
Łańcuch formatu danych ° _ °
Karl Napf
4

JavaScript (ES6), 66

Rekurencyjne, wprowadzane njako ciąg (nie liczba) i ograniczające rozmiar ciągu wyjściowego do 2 GB (czyli powyżej limitu ciągu większości silników javascript)

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

Test

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>

edc65
źródło
4

R, 66 64 62 bajtów

edytować:

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

pierwsza próba golfa ...

żywopłot
źródło
2
Cześć, witamy w PPCG! Miły pierwszy post!
Rɪᴋᴇʀ
3

2sable , 13 bajtów

Kod:

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

Wykorzystuje kodowanie CP-1252 .

Adnan
źródło
dlaczego nie nazwałeś tego 05AB1F? : 3
Conor O'Brien
1
@ ConorO'Brien Właściwie o tym myślałem, ale wtedy nazwy wyglądałyby naprawdę podobnie i mylące: str.
Adnan,
masz na myśli15AB1E
tylko ASCII,
3

Brachylog , 53 45 42 37 28 bajtów

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

Wypróbuj online!

Leaky Nun
źródło
3

Bash, 31 22 bajtów

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

Przetestuj na Ideone .

Dzięki @izabera za grę w golfa z 6 bajtów!

Dennis
źródło
3

Ruby, 52 48 + nflaga = 49 bajtów

((l= ~/$/)..$_.to_i).step(l){|j|$><<"%0#{l}d"%j}
Wartość tuszu
źródło
Może nie musisz, chopjeśli zakładasz, że dane wejściowe zostały przekazane bez końcowego znaku nowej linii? Nie jestem pewien, czy to zadziała. A może założyć, że zawsze istnieje, i pisać l=~-size?
Lynn,
@Lynn dzwonienie w sizeten sposób nie działa dla mnie. No cóż, przypomniałem sobie sztuczkę, której użyłem we wcześniejszej odpowiedzi, która i tak jest krótsza
Value Ink
2

Python 3 2, 79 74 69 65 68 67 bajtów

Dzięki Dennis!

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

wzrost liczby bajtów ze złej metody wyjściowej

Zniszczalna cytryna
źródło
1
Czy nie powinno być len(x)zamiast fzapisywać bajty, a następnie przypisywać je do zmiennej?
Karl Napf,
Nie sądzę ... co masz na myśli. Poza tym rozgromiłbym cię python 2, ale niektóre głupie rzeczy to się teraz dzieje.
Destructible Lemon
Wygląda na to, że przeszedłeś na Python 2. Ponadto, zgodnie z konsensusem w sprawie meta , użycie backspace do zastąpienia części danych wyjściowych jest dozwolone tylko w wyzwaniach artystycznych ASCII.
Dennis,
W Python 2 /wykonuje argumenty dzielenia liczb całkowitych foe.integer.
Dennis,
2

zsh, 28 bajtów

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

zsh + seq, 21 20 bajtów

To jest prawie taka sama odpowiedź jak Dennis, ale w 20 bajtach, ponieważ zsh

seq -ws '' $#1{,} $1
izabera
źródło
2

Haskell, 51 bajtów

f n|k<-length$show n=[k,2*k..n]>>=tail.show.(+10^k)
Lynn
źródło
2

Perl, 40 bajtów

39 bajtów kodu + 1 dla -n.

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

Stosowanie

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
Dom Hastings
źródło
2

k4, 27

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

W rzeczywistości nie grałem w golfa, po prostu proste wdrożenie specyfikacji.

                        $ / 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)
Aaron Davies
źródło
2

JavaScript - 76

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

lub 71, jeśli dopuszcza się argumenty łańcuchowe:

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

Dzięki @ user81655!

Nie golfowany:

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

dużo miejsca do poprawy, ale jestem teraz zmęczony

eithed
źródło
Miły! Znalazłem kilka ulepszeń, które mogłyby zostać wprowadzone (76 bajtów) n=>eval('c="";for(a=b=(""+n).length;a<=n;a+=b)c+=`${+`1e${b}`+a}`.slice(1)'). Główne bity używają forpętli i 1e${b}sztuczki Neila .
user81655,
@ user81655 - daje mi Uncaught SyntaxError: Invalid or unexpected token. Nie debugowałem jeszcze, bo właśnie się obudziłem: D
wyjechałem
Hmmm. Mogą to być ukryte znaki, które czasami są dodawane do komentarzy SO. Spróbuj to zapisać.
user81655,
2

R, 149 142 138 bajtów

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="")

Pozostawienie ncharkodu daje programowi taką samą liczbę bajtów, jak zastąpienie go b, ale losowe litery wędrujące po kodzie sprawiają, że jest on bardziej ... tajemniczy

Niegolfowany:
Każdy nchar(strtoi(something))pozwala obliczyć liczbę cyfr w podanej liczbie.

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="")

strsplitFunkcji generuje listę wektorów zawierających splitten elementy. Właśnie dlatego musisz dotrzeć do 1elementu st listy, a następnie do ielementu th pismastrsplit[[1]][i]

Frédéric
źródło
spróbuj użyć str_pad ()
hedgedandleught
@hedgedandleught: cóż, ta funkcja potrzebuje pakietu (tzn. nie można jej uruchomić z wanilią R) i nie chcę tego używać podczas PPCG-ing
Frédéric
1

SQF - 164

Używając formatu pliku jako funkcji:

#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]}

Zadzwoń jako INTEGER call NAME_OF_COMPILED_FUNCTION

Obrzydliwe
źródło
1

PowerShell, 77 bajtów

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

Używa interpolacji ciągów w celu skrócenia rzutów ciągów. Części przed drugim średnikiem skracają nazwy ponownie używanych rzeczy. Następnie każda liczba całkowita do wejścia - i tylko te, które są wielokrotnościami długości wejścia - są dopełniane tak, aby były tak długie jak łańcuch wejściowy i ostatecznie były łączone w jedną.

Ben N.
źródło
1

Właściwie 30 bajtów

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

Wypróbuj online!

Nie jestem zadowolony z długości tego kodu, ale nie jestem pewien, czy można go znacznie skrócić (jeśli w ogóle).

Wyjaśnienie:

;╝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
Mego
źródło
0

CJam, 19 bajtów

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

Wypróbuj online . Nikt jeszcze nie pisał w CJam, więc jest to skrypt, którego użyłem dla przypadków testowych.

Wyjaśnienie

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
}/
NinjaBearMonkey
źródło
0

PHP, 83 78 bajtów

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

Wskazówki są więcej niż mile widziane. Zarządzaj golfem sam o jeden bajt, zmieniając go z pętli for na pętlę while.

Ten kod zakłada, że ​​jest on wykonywany z wiersza poleceń i że $ argv [1] to int.

Dzięki:

@AlexGittemeier Jego sugestia (patrz komentarze) grała w golfa o 5 bajtów do 78 bajtów.

Jeroen
źródło
Możesz zmienić echo sprintf(...)->printf(...)
Alex Gittemeier
0

Perl 6, 69 59 46 bajtów

{my \a=.chars;(a,2*a...$_).fmt("%0"~a~"s","")}
bb94
źródło
1
Możesz użyć fmtna liście zamiast map, sprintfi [~]. 42 bajty
Jo King