Puść mnie!


34

Jako golfiarze nie jesteśmy przyzwyczajeni do wydawania (na pewno ). Będziemy potrzebować kilku narzędzi, które nam w tym pomogą.

Oczywiście, aby pomóc w marketingu nowego wydania, potrzebujemy ładnej i błyszczącej wersji wydania. Kto nie jest podekscytowany, gdy słyszy o wersji 3.0.0?

Zadanie

Twoim zadaniem będzie napisanie programu / procedury / ... w celu zwiększenia numeru wersji.

Musisz zwiększyć numer wersji i zresetować te „mniej ważne” (tj. Wersję poprawki).

Otrzymasz dwa argumenty: bieżącą wersję (np. „1.0.3”) jako ciąg oraz indeks, aby dowiedzieć się, który z nich zaktualizować (0 lub 1-indeksowany).

Przykład, indeksowany 0:

next-version("1.0.3", 0) # 2.0.0
next-version("1.2.3.4.5", 2) # 1.2.4.0.0
next-version("10.0", 0) # 11.0
next-version("3", 0) # 4
next-version("1", 7) # ERROR
next-version("01", 0) # ERROR

Wersja jest ciągiem znaków, każda część jest liczbą oddzieloną kropką. Nie może być żadnych wiodących, końcowych ani kolejnych kropek (i nic poza liczbami / kropkami). Nie ma ograniczeń co do wielkości ciągu wersji.

^[1-9]\d*(\.[1-9]\d*)*$

Przypadek błędu (dwa ostatnie przykłady) jest niezdefiniowanym zachowaniem. To, co dzieje się w przypadku nieprawidłowych danych wejściowych, nie ma znaczenia dla tego wyzwania.

Jak zwykle standardowe luki są zabronione. Możesz wydrukować lub zwrócić ciąg.


1
Czy możemy poprosić o podanie jako danych wejściowych najpierw indeksu, a następnie numeru wersji?
Leo

@Leo tak, zamówienie nie stanowi problemu.
Ven

Mogę dodać przypadek testowy do zwiększenia końcowej liczby w ciągu lub przykład lub coś do przetestowania.
nmjcman101

@ nmjcman101 jak to jest szczególny przypadek?
Ven

3
Chciałbym móc podjąć takie samo wyzwanie z warunkiem wygranej jak „najbardziej czytelny”, aby ktoś napisał je dla mnie w prawdziwej pracy. =)
jpmc26

Odpowiedzi:


12

Japt, 16 11 bajtów

¡V«´V+ÂX}'.

Przetestuj online! Numer wejścia jest indeksowany 1.

Na podstawie mojej odpowiedzi JavaScript. Wykorzystuje to jedną z najbardziej pomocnych funkcji Japt: dzielenie jednego łańcucha na drugi przed mapowaniem każdego elementu, a następnie ponowne łączenie tego łańcucha po mapowaniu.

Bez golfa i wyjaśnienia

¡  V«  ´ V+Â X}'.
Um@V&&!--V+~~X}'.
                   Implicit: U = input string, V = input number
Um@           }'.  Split U at periods, then map each item X by this function:
   V&&               If V is 0, return V.
      !--V+~~X       Otherwise, decrement V and return X + !V (increments X iff V was 1).
               '.  Re-join the result with periods.
                   Implicit: output last expression

2
Rzeczywiście słodka funkcja!
Jonathan Allan,

1
Dobrze, pomyślałem, że mam to w torbie. Przepraszam, mam obsesję na punkcie mojej odpowiedzi V i wyciskam z niej każdy mały bajt. : P
DJMcMayhem

11

Vim 20 25 bajtów

Niestety zdałem sobie sprawę, że nie obsługuje przypadku aktualizacji ostatniego numeru, więc musiałem dodać bajty. Jest to indeks 1.

DJA.0@"t.qq2wcw0@qq@qx

TryItOnline

Materiały niedrukowalne:

DJA.^[0@"t.^Aqq2wcw0^[@qq@qx

To przyjmuje argumenty w odwrotnej kolejności, jako osobne linie:

3
1.2.3.4.5

Wyjaśnienie:

DJ                           # Delete the input argument, and join lines
  A.^[0                      # Add a period to the end
       @"t.                  # Move to the "Copy register"th period
           ^A                # Increment the number under the cursor
             qq       @qq@q  # Until an error
               2w            # Move the cursor forward to the next number
                 cw0^[       # Change the number to 0
                           x # Delete the last '.'

1
Miły! Pomocne byłoby wyjaśnienie
Kritixi Lithos

@KritixiLithos Dodano. Niestety musiałem dodać kilka bajtów, aby obsłużyć zwiększanie ostatecznego numeru wersji, ale tak się dzieje.
nmjcman101

Myślę, że gdybyś poszedł na 0 indeksów, możesz po prostu zrobić, DJ@"t.<C-a>qq2wcw0<esc>@qq@qco jest z powrotem do dwudziestu
DJMcMayhem

@DJMcMayhem Nie sądzę, żebym mógł to zrobić, ponieważ wtedy nie byłbym w stanie rozróżnić 0 i 1.
nmjcman101

1
O tak, dobra uwaga. Jak o DJ@"f.@"<esc><C-a>qq2wcw0<esc>@qq@q?
DJMcMayhem

11

JavaScript (ES6), 44 42 40 37 bajtów

Zaoszczędź 3 bajty dzięki @Neil

x=>i=>x.replace(/\d+/g,n=>i&&+n+!--i)

Numer wejścia jest indeksowany 1.

Testowy fragment kodu

f = x=>i=>x.replace(/\d+/g,n=>i&&+n+!--i)

console.log(f("1.0.3")(1))
console.log(f("1.2.3.4.5")(3))
console.log(f("10.0")(1))
console.log(f("1")(8))


2
Przekreślone 44 to wciąż 44 :)
Kritixi Lithos

1
@KritixiLithos Co jest nie tak z moją przeglądarką? cubeupload.com/im/ofJySU.png
Gustavo Rodrigues

n=>i&&+n+!--i
Neil,

@Neil Thanks! Po prostu nie mogłem wymyślić, jak
zagrać w

10

V , 13 , 12 bajtów

Àñf.ñò2wcw0

Wypróbuj online!

To jest indeksowane na 0.

Jest tam ctrl-a(ASCII 0x01), więc oto czytelna wersja:

Àñf.ñ<C-a>ò2wcw0

Wyjaśnienie:

À                   " 'arg1' times
 ñ  ñ               " Repeat the following:
  f.                "   Move to the next '.' character
     <C-a>          " Increment the next number
          ò         " Recursively:
           2w       "   Move two words forward
              cw    "   Change this word
                0   "   to a '0'

7

Perl, 40 37 34 + 1 = 35 bajtów

-2 bajty dzięki @Dada. -3 bajty dzięki pomysłowi, który otrzymałem po przeczytaniu kodu Japt @ ETHproductions.

Uruchom z -pflagą.

$a=<>;s/\d+/$a--<0?0:$&+!($a+1)/ge

Wypróbuj online!

Podział kodu

-p          #Wraps the program in a while(<>){ ... print$_} statement.
            #Input is read into the $_ variable
$a=<>;s/\d+/$a--<0?0:$&+!($a+1)/ge
$a=<>;                              #Reads the version update into $a
      s/   /                   /ge  #Substitution regex:
                                g   #Repeats the substitution after first match
                                 e  #Interprets replacement as Perl code
       \d+                          #Matches 1 or more digits, and stores match in $&
                  ? :               #Ternary operation
            $a--<0                  #Checks if $a is negative and then decrements $a
                  ?0                #If negative, we've passed our match; print 0 instead
                    :$&+!($a+1)     #Otherwise, we're either printing $& + 0 (if $a was positive) or $& + 1 (if $a was 0).
#Since substitution implicitly modifies $_, and -p prints $_, it prints our answer

Usuń wszystkie nawiasy po obu stronach! (i $&zamiast $1tego)
Dada,

Wiedziałem, że czegoś mi brakuje! Dzięki!
Gabriel Benamy,

Korzystanie z liczb indeksowanych 1 pozwala zaoszczędzić 4 bajty: Wypróbuj online!
Xcali

5

Galaretka , 19 17 bajtów

ṣ”.V€‘⁹¦µJ’<⁹×j”.

1-indeksowany.

TryItOnline!

W jaki sposób?

ṣ”.V€‘⁹¦µJ’<⁹×j”. - Main link: currentVersion, theIndex
ṣ”.               - ṣplit left (currentVersion) at occurences of '.'
   V€             - eVal €ach (creates a list of integers)
      ⁹           - right argument (theIndex)
       ¦          - apply to given index(es)
     ‘            -    increment
        µ         - monadic chain separation (call the above result z)
         J        - range(length(z))  i.e. ([1,2,3,...,length])
          ’       - decrement         i.e. ([0,1,2,...,length-1])
            ⁹     - right argument (theIndex)
           <      - less than?        i.e. ([1,1,...,(1 at theIndex),0...,0,0,0]
             ×    - multiply by z (vectortises) - zeros out all of z after theIndex
              j”. - join with '.'

3
Gratulacje na 10k !!
Luis Mendo

Nie mogę się doczekać Jelly 2.0, więc możesz się tego pozbyć V€:).
Ven

@LuisMendo - dzięki! Jestem tak nieobserwowalny (Dennis zauważył mój kamień milowy 1K, zanim to zrobiłem).
Jonathan Allan

5

MATLAB, 85 bajtów

function f(s,j);a=split(s,'.');a(j)=string(double(a(j))+1);a(j+1:end)='0';join(a,'.')

Jedna oparta i pierwsza próba gry w golfa!


Dobra robota! Pierwszy raz widzę nowy stringtyp w akcji :-)
Luis Mendo,

5

C # 116 104 bajtów

using System.Linq;(v,i)=>string.Join(".",v.Split('.').Select(int.Parse).Select((x,n)=>n==i?x+1:n>i?0:x));

Wyjaśnienie

using System.Linq;(v,i)=>   //Anonymous function and mandatory using
    string.Join(".",                    //Recreate the version string with the new values
        v.Split('.')                    //Get individual pieces
            .Select(int.Parse)          //Convert to integers
                .Select(            
                    (x,n)=>             //Lambda with x being the part of the version and n being the index in the collection
                        n==i                    
                            ?x+1        //If n is the index to update increment x
                            :n>i        //Else if n is greater than index to update
                                ?0      //Set to zero
                                :x));   //Otherwise return x

Wypróbuj tutaj


Nie potrzebne stringi intw anonimowym podpisem funkcji
TheLethalCoder

@TheLethalCoder ahh tak oczywiście, dziękuję.
JustinM - Przywróć Monikę

4

Python 2, 84 bajtów

Wydaje mi się, że to może być naprawdę krótsze. Może potrzebuję sposobu, aby mieć opcję niepoliczalną.

lambda s,n:'.'.join(str([-~int(x)*(i==n),x][i<n])for i,x in enumerate(s.split('.')))

Gdybyśmy mogli wziąć wersję za listę ciągów, istnieje 75-bajtowe rozwiązanie:

g=lambda s,n:(str(-~int(s[0]))+'.0'*~-len(s))*(n<1)or s[0]+'.'+g(s[1:],n-1)

Ponadto, jeśli zarówno dane wejściowe, jak i wyjściowe były listami liczb, istnieje 64-bajtowe rozwiązanie:

g=lambda s,n:([-~s[0]]+[0]*~-len(s))*(n<1)or [s[0]]+g(s[1:],n-1)

4

V 14 20 bajtów

Znowu musiałem dodać kod w przypadku narożnika zwiększania ostatniej cyfry. (1-indeksowany)

DJA.0@"t.ò2wcw0òx

TryItOnline

Materiały niedrukowalne:

DJA.^[0@"t.^Aò2wcw0^[òx

To przyjmuje argumenty w odwrotnej kolejności, jako osobne linie:

3
1.2.3.4.5

1
Niezła odpowiedź! Zawsze cieszę się, że ktoś inny używa V! Właśnie dlatego wiesz, że jeśli umieścisz pierwsze wejście w args, to z góry zdefiniuje rejestr „a” pod tym numerem, abyś mógł zrobić @a(lub nawet krócej À), co powinno zaoszczędzić ci sporo bajtów.
DJMcMayhem

4

Partia, 119 bajtów

@set s=%1
@set i=%2
@set t=
@for %%i in (%s:.=,%)do @set/an=!!i*(%%i+!(i-=!!i))&call set t=%%t%%.%%n%%
@echo %t:~1%

1-indeksowany.


4

Perl 6, 67 bajtów, indeksowany 0

->$v,$i {$v.split('.').map({++$>$i??($++??0!!$_+1)!!$_}).join: '.'}

Wyjaśnienie:

->$v,$i {$v.split('.').map({++$>$i??($++??0!!$_+1)!!$_}).join: '.'}
->$v,$i {                                                         } # function taking version/index to increment
         $v.split('.')                                              # split by dot
                      .map({                          })            # for each version number
                            ++$>$i??                                # if an anonymous variable ($), incremented,
                                                                    #  is greater than $i (index to increment)
                                    ($++??       )                  # if it's not the first time we've been over $i
                                                                    # (using another anonymous value, which gets default-init'd to 0)
                                          0                         # then 0 (reset lower version numbers)
                                           !!$_+1                   # otherwise, increment the number at $i
                                                  !!$_              # otherwise return the number part
                                                        .join: '.'  # join with a dot

3
Po prostu, odpowiedzi własne są całkowicie kwalifikowalne. W rzeczywistości są nawet zachęcani
DJMcMayhem

@DJMcMayhem Wiedziałem o tym, ale myślałem, że nie kwalifikują się
Ven

3

PowerShell 3+, 75 74 bajtów

($args[0]-split'\.'|%{$m=!$b;$b=$b-or$args[1]-eq$i++;(+$b+$_)*$m})-join'.'

Bez golfa

(
    $args[0] -split '\.' | 
        ForEach-Object -Process {
            $m= -not $b
            $b = $b -or ($args[1] -eq $i++)
            (([int]$b) + $_) * $m
        }
) -join '.'

Wyjaśnienie

Parametry są akceptowane przy użyciu $argstablicy.

  1. Podziel ciąg wersji na ., a następnie dla każdego elementu:
    1. $mma być -not $b. Przy pierwszym uruchomieniu $bbędzie niezdefiniowany, z którym zostanie połączony $false, więc $mzacznie się jako $true. $mma być mnożnikiem, który zawsze jest 0lub 1będzie używany później. $mnależy to tutaj ocenić, ponieważ chcemy, aby opierało się ono na wartości ostatniej iteracji $b.
    2. $bjest ustawiany -orna wynik porównania iteratora $iz $args[1](parametr indeksu). Oznacza to, $bże zostanie ustawiony $truetutaj, gdy będziemy na elemencie, który ma zostać zwiększony. Dodatkowo będzie się $truepojawiał w każdej kolejnej iteracji, ponieważ warunek to -ord bieżącą wartością.
    3. $bjest konwertowany na liczbę za pomocą unary +( $false=> 0, $true=> 1), a następnie dodawany do elementu bieżącej wersji, $_który jest [string], ale PowerShell zawsze próbuje połączyć argument po prawej stronie z typem po lewej, więc zostanie wykonana arytmetyka, nie łączenie łańcuchów. Następnie wartość ta zostanie pomnożona przez $m, co jest nadal, [bool]ale niejawnie się połączy.
  2. Połącz ponownie wynikową tablicę za pomocą ..

Zatem pierwsza iteracja, w której $bsię pojawia $true, $bbyłaby $falsewtedy, gdy $mzostała oceniona, $mzrównanie $true, co utrzyma mnożnik na poziomie 1.

Podczas tego przebiegu $bstaje się $truei jest dodawane do elementu wersji (as 1), zwiększając go, a ponieważ mnożnik jest nadal 1, będzie to wynik końcowy.

Tak więc przy następnej iteracji $bbędzie już $true, $mwyrównywanie $false, co spowoduje, że mnożnik 0. Ponieważ na $bzawsze będzie $trueteraz, mnożnik zawsze będzie 0, więc każdy zwrócony element również będzie 0.


2

R, 100 95 92 86 bajtów

Niezwykle w przypadku R wykorzystuje to indeksowanie 0. Funkcja anonimowa z dwoma argumentami (ciągiem i liczbą całkowitą). Prawdopodobnie można trochę pograć w golfa.

function(v,i)cat((x=scan(t=el(strsplit(v,"\\."))))+c(rep(0,i),1,-x[-(0:i+1)]),sep=".")


2

Skrypt kawy: 77 67 bajtów

f=(p,i)->((z<i&&v||z==i&&~~v+1||0)for v,z in p.split '.').join '.'

Woot! Czas na ciasto i kawę do wersji beta.

Dzięki @ven i @Cyoce ogoliłem 10 bajtów!


Miły! Nie jesteś pewien, czy potrzebujesz tutaj analizy?
Ven

Przy okazji możesz zaoszczędzić dwa bajty, używając połączeń bezparenkowych (tj. .join '.'Lub .split '.')
Ven

Użyj +zamiast parseInt(użyj, ~~jeśli chcesz rzucić na liczbę całkowitą)
Cyoce

2

Python 3, 89 86 bajtów

lambda v,c:'.'.join((str((int(x)+1)*(i==c)),x)[i<c]for i,x in enumerate(v.split('.')))

bardzo naiwny sposób na załatwienie sprawy

Edycja: przepisałem warunek, odwołując się do @kade


2

PHP, 81 bajtów

okropnie długo. Przynajmniej: Słoń wciąż bije Pythona.

foreach(explode(".",$argv[1])as$i=>$v)echo"."[!$i],($i<=$n=$argv[2])*$v+($i==$n);

zapętla pierwszy argument podzielony przez kropki: "."[!$i]jest pusty dla pierwszego i kropka dla każdego innego elementu; ($i<=$n)i ($i==$n)są domyślnie rzutowane na liczbę całkowitą 0lub 1dla arytmetyki liczb całkowitych.


2

JavaScript (ES6), 57 55 bajtów

(s,x)=>s.split`.`.map((j,i)=>i==x?+j+1:i>x?0:j).join`.`

Przykłady:

n=(s,x)=>s.split`.`.map((j,i)=>i==x?+j+1:i>x?0:j).join`.`

console.log(n('1.0.3', 0))
console.log(n('1.2.3.4.5', 2))
console.log(n('10.0', 0))
console.log(n('3', 0))
console.log(n('1', 7))

Nie jest to najlepsza implementacja JS, ale jest dość prosta i postępuje zgodnie z logiką, której można się spodziewać.


Okej, to nie było strasznie jasne, dzięki.
Florrie,

1

Pyth - 21 bajtów

j\.++<Kcz\.Qhs@KQmZ>K

Pakiet testowy


3
Nie, to nie jest całkiem poprawne. Twój 10.0przypadek testowy daje 11.0.0, to o jedną za dużo!
Ven

1

PowerShell, 80 100 95 92 bajtów

Zapisano 5 bajtów, używając stałej dla -1..if

Zapisano 3 bajty, używając !$bzamiast$b-eq0

filter x($a,$b){[int[]]$y=$a.Split('.');-1..((-$b,-1)[!$b])|%{$y[$_]=0};$y[$b]++;$y-join'.'}

Wyjaśnienie:

filter x($a,$b){
    [int[]]$y=$a.Split('.') #Split input into integer array
    $y[$b]++ #Increment 'major' version no. ($b) by one
    -1..((-$b,-1)[!$b])|%{$y[$_]=0} #Set all trailing numbers to 0, now also checks for $b=0 cases.
    $y-join'.' #Join back into '.' seperated Array
}

Przypadki testowe:

x "1.0.3" 0
x "1.2.3.4.5" 2
x "10.0" 0
x "1" 7
2.0.0
1.2.4.0.0
11.0
Index was outside the bounds of the array.

Miły! Uwielbiam widzieć tutaj więcej PowerShell.
briantist

@ briantist szczerze mówiąc lekka nieskompilowana wersja C #, która może współpracować ze wszystkim, jest darem niebios, mam do czynienia z wieloma rzeczami Microsoftu w pracy i absolutnie to uwielbiam.
colsw

Och, absolutnie; PowerShell jest moim zacięciem, ale niewiele osób uważa, że ​​można go używać do gry w golfa. Ma kilka funkcji, które świetnie nadają się do gry w golfa, i inne, które sprawiają, że jest do bani, ale ogólnie jest to solidny wybór! Zabawiam się pomysłem robienia prezentacji na temat gry w golfa w PowerShell na następnym PSUG.
briantist

@ briantist domyślne aliasy są piękne, ale chciałbym móc użyć wcześniej zdefiniowanego zestawu kilku popularnych poleceń jako pojedynczych aliasów znaków dla gry w golfa, jeśli powiedzmy, że mogłyby konkurować z niektórymi rzeczywistymi językami golfa, gdybyśmy mogli użyć rzamiastrandom
colsw

Zabawne random, że to nie jest alias! Jest to wynik oceny poleceń programu PowerShell. Gdy szuka się polecenia w aliasach, funkcjach, poleceniach cmdlet, aplikacjach natywnych itp., Ostatnią rzeczą, którą próbuje zrobić, jest dołączenie Get-do tego, czym jest. Więc faktycznie dzwonisz Get-Random, ale technicznie nie jest to alias. Można zobaczyć tę pracę uruchamiając servicelub childitemlub maksymalną ironii alias.
briantist

1

Cel C 531 bajtów

#import<Foundation/Foundation.h>
int main(int argc,const char *argv[]){@autoreleasepool{NSString *s=[NSString stringWithUTF8String:argv[1]];NSInteger n=strtol(argv[2],NULL,0);NSArray *c=[s componentsSeparatedByString:@"."];if(c.count<=n)NSLog(@"ERROR");else{int i=0;NSMutableString *v=[[NSMutableString alloc]init];for(;i<n;++i)[v appendFormat:@"%@.",[c objectAtIndex:i]];[v appendFormat:@"%li", strtol(((NSString *)[c objectAtIndex:i++]).UTF8String,NULL,0)+1l];for(;i<c.count;++i)[v appendString:@".0"];NSLog(@"%@",v);}}return 0;}

skompilować:

clang -fobjc-arc -Os main.m -o main

stosowanie:

./main 1.2.3 1

Witamy w CodeGolf. W tytule powinieneś podać rozmiar kodu źródłowego, a nie kodu bajtowego. Źródło powinno oczywiście być tak krótkie, jak to możliwe (bez zbędnych białych znaków, nazw zmiennych pojedynczych znaków itp.). Powodzenia.
Tytus,

prawdopodobnie może użyć 0zamiast NULLi usunąć return 0;na końcu głównego. NSString *sprawdopodobnie może usunąć to miejsce. **argvjest o 1 bajt krótszy niż *argv[]. @autoreleasepool{}jest prawdopodobnie niepotrzebne.
Ven

1

JavaScript ES6: 60 bajtów

n.split(".").map((n,r)=>{return r>i?n=0:n}).join("."),n[i]++}

2
Witamy w PPCG! Nie wydaje się to poprawne, ponieważ nie pobiera danych w żaden sposób, a }na końcu jest dodatkowy . Na golfa: jedna z cech funkcji strzałek jest niejawna powrotny, więc można wymienić (n,r)=>{return r>i?n=0:n}się (n,r)=>r>i?n=0:nzaoszczędzić kilka bajtów.
ETHproductions

1

R, 75 bajtów

f=function(a,b){n=scan(t=a,se=".");m=-n;m[b]=1;m[1:b-1]=0;cat(n+m,sep=".")}

Indeksowanie jest oparte na 1. Możesz grać z nim online tutaj .


1

APL (Dyalog) , 31 bajtów

Wymaga ⎕IO←0( I ndex O rigin 0), co jest domyślne w wielu systemach. Pełna treść programu; monituje o wprowadzenie tekstu (wersja), a następnie wprowadzenie numeryczne (indeks).

' 'R'.'⍕⎕(⊢∘≢↑↑,1+⊃)⊃⌽'.'VFI

Wypróbuj online!

 monit o wprowadzenie tekstu

'.'⎕VFIV erify i F ix I nPrzenieś stosując okres jako separator (gdzie poprawne wartości, pola wartości pola)

 do tyłu (aby umieścić wartości na początku)

 wybierz pierwszy (wartości)

⎕(... ) zastosuj do tego następującą funkcję ukrytą, używając wartościowania jako lewego argumentu:

Aby wyjaśnić niejawne odpowiedniki każdej aplikacji funkcji, użyjemy teraz do wskazania lewego argumentu (indeksu) i wskazania prawego argumentu (listy indywidualnych numerów pierwotnie wprowadzonego bieżącego numeru wersji).

 równoważne do  (⍺⊃⍵) użycia, aby wybrać element z

1+ dodaj jeden do tego 

↑, odpowiednik  liczb (⍺↑⍵), poprzedzających pobranych z

⊢∘≢↑ ekwiwalent  (⍺⊢∘≢⍵)↑ ekwiwalentu, aby  (≢⍵)↑ pobrać tyle liczb, ile jest elementów , w razie potrzeby dopełniając zerami

 format (łańcuch z jedną spacją między każdą liczbą)

' '⎕R'.' PCRE R przestrzenie EUmieãæ z okresami


1

Java 8, 130 bajtów

s->n->{String r="",a[]=s.split("\\.");for(int l=a.length,i=-1;++i<l;)r+=(i>n?0:new Long(a[i])+(i<n?0:1))+(i<l-1?".":"");return r;}

Wyjaśnienie:

Wypróbuj tutaj.

s->n->{                 // Method with String and Integer parameters and String return-type
  String r="",          //  Result-String
  a[]=s.split("\\.");   //  String-array split by the dots
  for(int l=a.length,   //  Length of the array
      i=-1;++i<l;)      //  Loop from 0 to `l` (exclusive)
    r+=                 //   Append the result-String with:
       (i>n?            //    If index `i` is beyond input `n`:
        0               //     Append a zero
       :                //    Else:
        new Long(a[i])  //     Convert the current String to a number
        +(i<n?          //     If index `i` is before input `n`
           0            //      Leave the number the same by adding 0
          :             //     Else:
           1))          //      Add 1 to raise the version at index `n`
       +(i<l-1?         //    If we've haven't reached the last iteration yet:
          "."           //     Append a dot
         :              //    Else:
          ""            //     Append nothing
   );                   //  End of loop
   return r;            //  Return the result-String
}                       // End of method

1

LiveScript, 53 52 bajty

->(for e,i in it/\.
 [+e+1;0;e][(i>&1)+2*(i<&1)])*\.

-1 bajt dzięki tylko @ ASCII!

Stare objaśnienie:

(a,b)->x=a/\.;x[b]++;(x[to b] ++ [0]*(x.length-1-b))*\.
(a,b)->                                                 # a function taking a and b (version and index)
       x=a/\.;                                          # split a on dot, store in x
              x[b]++;                                   # increment at the given index
                     (x[to b]                           # slice be from 0 to the index
                              ++                        # concat (both spaces are necessary so it's not interpreted as an increment operator
                                 [0]*(x.length-1-b))    # with enough zeros to fill the array back to its original size (x's size)
                                                    *\. # join on dot

Kolejna odpowiedź na pytanie ... W każdym razie nikt nie gra w LiveScript. : P

Pracowałem nad inną wersją:

(a,b)->(a/\.=>..[b]++;..[b to *]=0)*\.

Ale *jest zbyt przeciążony, aby można go było rozpoznać w indeksie splicingu, dlatego =0spróbuje uzyskać dostęp 0[0]. Musisz więc napisać coś takiego, ..[b to ..length- b]=[0]*(..length-1-b)a na końcu jest już dłużej.


1
niestety f=(a,b)->(for e,i in a/\.<newline> if i<b then e else if i>b then 0 else+e+1)*\.jest znacznie dłuższy :(
tylko ASCII

@ Tylko ASCII Myślę, że można skompresować if i<b then e else if i>b then 0 else+e+1ie [+e+1;0;e;e][i>b+(2*i<b)]lub coś w tym stylu, może nawet([+e;-1][i>b+(2*i<b)]||e-1)+1
Ven

(a,b)->(for e,i in a/\.<newline> [+e+1;0;e][(i>b)+2*(i<b)])*\., 54
Tylko ASCII

Następnie usuńmy podpis: ->(for e,i in it/\.<newline> [+e+1;0;e][(i>&1)+2*(i<&1)])*\.dla 52
Ven

btw możesz zastąpić ;spacją. także ... wygląda na to, że jest to tak daleko, jak to będzie możliwe przy takim podejściu
tylko ASCII

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.