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

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.

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.


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``

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

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


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

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 .


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>


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


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 .


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!


3

Bash, 31 22 bajtów

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

Przetestuj na Ideone .

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


3

Ruby, 52 48 + nflaga = 49 bajtów

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

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


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

2

Haskell, 51 bajtów

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

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

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)

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


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]


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


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


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

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
}/

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.


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","")}

1
Możesz użyć fmtna liście zamiast map, sprintfi [~]. 42 bajty
— Jo King
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.