Пожалуйста, выпустите меня!

34

Как игроки в кодекс, мы не привыкли к выпуску ( конечно ). Нам понадобятся несколько инструментов, чтобы помочь нам сделать это.

Конечно, чтобы помочь в маркетинге нового выпуска, нам нужна красивая и блестящая версия выпуска. Кто не возбуждается, когда слышит о версии 3.0.0?

задача

Ваша задача будет написать программу / рутина / ... для увеличения номера версии.

Вам нужно увеличить номер версии и сбросить «менее важные» (например, версию патча).

Вы получаете два аргумента: текущую версию (например, «1.0.3») в виде строки и индекс, чтобы узнать, какой из них обновить (0 или 1-индексированный).

Пример с 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

Версия представляет собой строку, каждая часть представляет собой число, разделенное точкой. Не может быть ни начальных, ни конечных, ни последовательных точек (и ничего кроме чисел / точек). Нет ограничений на размер строки версии.

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

Случай ошибки (последние два примера) - неопределенное поведение. То, что происходит в случае неправильного ввода, не имеет отношения к этой проблеме.

Как обычно, стандартные лазейки запрещены. Вы можете распечатать или вернуть строку.

Вен
источник
1
Можем ли мы попросить получить в качестве входных данных сначала индекс, а затем номер версии?
Лев
@ Лео да, порядок не проблема.
Ven
Я мог бы добавить тестовый пример для увеличения последнего числа в строке, или пример или что-то для проверки.
nmjcman101
@ nmjcman101 как это особый случай?
Ven
3
Хотелось бы, чтобы с условием выигрыша я мог выполнить то же испытание, что и «наиболее читабельное», чтобы кто-нибудь написал их для использования в реальной работе. =)
jpmc26

Ответы:

12

Japt, 16 11 байт

¡V«´V+ÂX}'.

Проверьте это онлайн! Входной номер индексируется 1.

Основано на моем ответе JavaScript. Это использует одну из самых полезных функций Japt: разделение одной строки на другую перед сопоставлением каждого элемента, а затем присоединение к этой строке снова после сопоставления.

Неуправляемый и объяснение

¡  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
ETHproductions
источник
2
Действительно приятная особенность!
Джонатан Аллан
1
Ну что ж, я думал, что у меня это в сумке. Извините, я собираюсь зациклиться на своем V-ответе и выжму из него каждый последний маленький байт. : P
DJMcMayhem
11

Vim 20 25 байт

К сожалению, я понял, что это не относится к случаю обновления последнего номера, поэтому мне пришлось добавить байты. Это 1-индексированный.

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

TryItOnline

непечатные:

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

Это принимает аргументы в обратном порядке, в виде отдельных строк:

3
1.2.3.4.5

Объяснение:

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 '.'
nmjcman101
источник
1
Ницца! Было бы полезно объяснение
Kritixi Lithos
@KritixiLithos Добавлено. К сожалению, мне пришлось добавить несколько байтов для обработки увеличения номера окончательной версии, но это происходит.
nmjcman101
Я думаю, что если бы вы DJ@"t.<C-a>qq2wcw0<esc>@qq@q
заняли
@DJMcMayhem Я не думаю, что смогу это сделать, потому что тогда я не смогу различать 0 и 1.
nmjcman101
1
Ах да, хорошая мысль. Как насчет DJ@"f.@"<esc><C-a>qq2wcw0<esc>@qq@q?
DJMcMayhem
11

JavaScript (ES6), 44 42 40 37 байт

Сохранено 3 байта благодаря @Neil

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

Входной номер индексируется 1.

Тестовый фрагмент

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

ETHproductions
источник
2
Вычеркнуто 44 все еще 44 :)
Kritixi Lithos
1
@KritixiLithos Что не так с моим браузером? cubeupload.com/im/ofJySU.png
Густаво Родригес
n=>i&&+n+!--i
Нил
@Neil Спасибо! Я просто не мог понять, как играть в это выражение дальше ...
ETHproductions
10

V , 13 , 12 байтов

Àñf.ñò2wcw0

Попробуйте онлайн!

Это 0-индексированный.

Там есть ctrl-a(ASCII 0x01), так что здесь читаемая версия:

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

Объяснение:

À                   " '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'
DJMcMayhem
источник
7

Perl, 40 37 34 + 1 = 35 байт

-2 байта благодаря @Dada. -3 байта благодаря идее, которую я получил от чтения кода Japt @ ETHproductions.

Беги с -pфлагом.

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

Попробуйте онлайн!

Разбивка кода

-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
Габриэль Бенами
источник
Уберите все эти скобки с обеих сторон! (и $&вместо $1этого)
Дада
Я знал, что что-то упустил! Благодарность!
Габриэль Бенами
Использование 1-индексированных чисел позволяет сэкономить 4 байта: попробуйте онлайн!
Xcali
5

Желе , 19 17 байт

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

1-индексироваться.

TryItOnline!

Как?

ṣ”.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
Поздравляю по 10к !!
Луис Мендо
Не могу дождаться Jelly 2.0, чтобы вы могли избавиться от этого V€:).
Ven
@LuisMendo - спасибо! Я так не наблюдателен (Деннис заметил мой рубеж в 1 КБ раньше, чем я тоже).
Джонатан Аллан
5

MATLAB, 85 байт

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

Одна основанная и первая попытка игры в гольф!

MattWH
источник
Отлично сработано! Впервые я вижу новый stringтип в действии :-)
Луис Мендо
5

C # 116 104 байта

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

объяснение

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

Попробуй здесь

ДжастинМ - Восстановить Монику
источник
Вам не нужен stringи intв анонимной функции подписи
TheLethalCoder
@TheLethalCoder ах да, конечно, спасибо.
ДжастинМ - Восстановить Монику
4

Python 2, 84 байта

Я чувствую, что это действительно может быть короче. Может быть, нужен вариант без перечисления.

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

Если бы мы смогли взять версию в виде списка строк, есть 75-байтовое решение:

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

Кроме того, если и вход, и выход были списками чисел, существует 64-байтовое решение:

g=lambda s,n:([-~s[0]]+[0]*~-len(s))*(n<1)or [s[0]]+g(s[1:],n-1)
Када
источник
4

V 14 20 байтов

Снова, я должен был добавить код для углового случая увеличения последней цифры. (1-индексированных)

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

TryItOnline

непечатные:

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

Это принимает аргументы в обратном порядке, в виде отдельных строк:

3
1.2.3.4.5
nmjcman101
источник
1
Хороший ответ! Я всегда рад видеть, что кто-то еще использует V! Точно так же, вы знаете, что если вы поместите первый вход в 'args', он будет предопределять регистр 'a' для этого числа, чтобы вы могли сделать @a(или даже сократить À), что должно сэкономить вам кучу байтов.
DJMcMayhem
4

Пакет, 119 байт

@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-индексироваться.

Нил
источник
4

Perl 6, 67 байт, 0 проиндексирован

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

Объяснение:

->$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
Просто к сведению, самостоятельные ответы полностью приемлемы. На самом деле, они даже поощряются
DJMcMayhem
@DJMcMayhem Я знал об этом, но я думал, что они не имеют права
Ven
3

PowerShell 3+, 75 74 байта

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

Ungolfed

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

объяснение

Параметры принимаются с использованием $argsмассива.

  1. Разбить строку версии ., затем для каждого элемента:
    1. $mустановлено быть -not $b. При первом запуске $bбудет неопределенным, который будет объединен $false, поэтому $mначнется как $true. $mПредполагается, что это множитель, который всегда 0или 1будет использоваться позже. $mдолжен быть оценен здесь, потому что мы хотим, чтобы он был основан на $bзначении последней итерации .
    2. $bустанавливает для себя -orрезультат сравнения итератора $iс $args[1](параметр index). Это значение $bбудет установлено $trueздесь, как только мы находимся на элементе, который должен быть увеличен. Кроме того, это будет происходить $trueна каждой последующей итерации, потому что условие имеет -orтекущее значение.
    3. $bпреобразуется в число с помощью унарного +( $false=> 0, $true=> 1), затем добавляется к элементу текущей версии, $_который является a [string], но PowerShell всегда пытается объединить аргумент справа с типом слева, поэтому будет выполнена арифметика, не конкатенация строк. Тогда это значение будет умножено на $m, которое все еще, [bool]но будет неявно объединено.
  2. Повторно соедините полученный массив с ..

Таким образом, первая итерация, где $bстановится $true, $bбыла бы, $falseкогда $mбыла оценена, $mравняется $true, что будет держать множитель в 1.

Во время этого запуска $bстановится $trueи добавляется к элементу версии (как 1), увеличивая его, и, так как множитель все еще 1, это будет конечным результатом.

Так что на следующей итерации, $bуже будет $true, делая $mравным $false, что сделает множитель 0. Так $bкак $trueтеперь это будет всегда, множитель всегда будет 0, поэтому каждый возвращенный элемент будет 0тоже.

briantist
источник
2

R, 100 95 92 86 байт

Необычно для R, это использует 0-индексацию. Анонимная функция с двумя аргументами (строка и целое число). Скорее всего, можно играть в гольф немного.

function(v,i)cat((x=scan(t=el(strsplit(v,"\\."))))+c(rep(0,i),1,-x[-(0:i+1)]),sep=".")
rturnbull
источник
2

05AB1E , 22 байта

'.¡vy²N‹i0*}²NQi>})'.ý

Попробуйте онлайн!

Я не знаю, как это сделать if-else в 05AB1E, так что это длиннее, чем должно быть.

Урна волшебного осьминога
источник
1
Если я не ошибаюсь, я не думаю, что это работает. Вопрос говорит , что вы должны 0-из минорных версий, поэтому 1.0.0.0.3, 3следует производить 1.0.0.1.0не 1.0.0.1.3.
LambdaBeta
@LambdaBeta неправильно прочитано, исправлено.
Волшебная Урна Осьминога
2

Coffee-script: 77 67 байт

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

Woot! Время для торта и кофе для бета-версии.

Благодаря @ven и @Cyoce я побрил 10 байтов!

Лорд ратт
источник
Ницца! Не уверен, что вам нужен parseInt?
Ven
Кстати, вы можете сохранить два байта, используя вызовы без паролей (то есть .join '.'или .split '.')
Ven
Используйте +вместо parseInt(используйте, ~~если вам нужно, чтобы оно было приведено к целому числу)
Cyoce
2

Python 3, 89 86 байт

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

очень наивный способ добиться цели

Изменить: переписать условное, ссылаясь на @kade

Jeffrey04
источник
2

PHP, 81 байт

ужасно долго По крайней мере: Слон все еще бьет Питона.

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

перебирает первый аргумент, разделенный точками: "."[!$i]пуст для первого и точка для любого другого элемента; ($i<=$n)и ($i==$n)неявно приводятся к целочисленной 0или 1целочисленной арифметике.

Titus
источник
2

JavaScript (ES6), 57 55 байт

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

Примеры:

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

Не лучшая реализация JS, но она довольно проста и соответствует логике, которую вы ожидаете.

Флори
источник
Хорошо, это было не совсем понятно, спасибо.
Флорри
1

Pyth - 21 байт

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

Тестирование

Maltysen
источник
3
Нет, это не совсем правильно. Ваш 10.0тестовый пример дает 11.0.0, это слишком много!
Ven
1

Powershell, 80 100 95 92 байт

Сохранено 5 байтов с помощью const для -1..if

Сохранено 3 байта при использовании !$bвместо$b-eq0

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

Объяснение:

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
}

Тестовые случаи:

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.
colsw
источник
Ницца! Мне нравится видеть здесь больше силы.
Бриантист
@ briantist, честно говоря, легкая нескомпилированная версия C #, которая может взаимодействовать со всем, - это находка, я работаю со многими вещами Microsoft на работе и мне это очень нравится.
Colsw
О, абсолютно; PowerShell - это мое варенье, но не многие думают использовать его для игры в гольф. У него есть некоторые особенности, которые отлично подходят для игры в гольф, и другие, которые делают его отстойным для игры в гольф, но в целом это хороший выбор! Мне нравится идея сделать презентацию о гольфе в PowerShell на моем следующем PSUG.
Бриантист
@briantist псевдонимы по умолчанию прекрасны, но я бы хотел использовать предопределенный набор из нескольких общих команд в качестве псевдонимов с одним символом f для игры в гольф, если, скажем, он мог бы конкурировать с некоторыми реальными языками игры в гольф, если бы мы могли использовать rвместоrandom
colsw
Забавно random, это не псевдоним! Это результат оценки команд PowerShell. Поскольку он ищет команду в псевдонимах, функциях, командлетах, собственных приложениях и т. Д., Самое последнее, что он пытается сделать, - это предвосхитить Get-что бы то ни было. Таким образом, вы на самом деле звоните Get-Random, но технически не как псевдоним. Вы можете увидеть эту работу, запустив service, или childitem, или для максимальной иронии alias.
Бриантист
1

Objective-C 531 байт

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

компиляции:

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

использование:

./main 1.2.3 1
Чжиган Ан
источник
Добро пожаловать в CodeGolf. В заголовке Вы должны указать размер исходного кода, а не байтовый код. И, конечно, источник должен быть как можно короче (без лишних пробелов, односимвольных имен переменных и т. Д.). Удачи.
Тит
можно использовать 0вместо NULLи удалить return 0;в конце основного. NSString *sвозможно, удалит пространство. **argvна 1 байт короче *argv[]. @autoreleasepool{}вероятно, не нужно.
Ven
1

Javascript ES6: 60 байт

n.split(".").map((n,r)=>{return r>i?n=0:n}).join("."),n[i]++}
Джек
источник
2
Добро пожаловать в PPCG! Похоже, что это неверно, так как не требует ввода, и }в конце есть дополнительная информация . На гольфе: одна из особенностей функций стрелки подразумевается возвращение, так что вы можете заменить (n,r)=>{return r>i?n=0:n}с , (n,r)=>r>i?n=0:nчтобы сэкономить несколько байт.
ETHproductions
1

R 75 байт

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

Индексирование основано на 1. Вы можете поиграть с ним онлайн здесь .

plannapus
источник
1

APL (Dyalog) , 31 байт

Требуется ⎕IO←0( I ndex O rigin 0), который используется по умолчанию во многих системах. Полное тело программы; запрашивает ввод текста (версия), а затем ввод чисел (индекс).

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

Попробуйте онлайн!

 запрос на ввод текста

'.'⎕VFIV erify и F ix I nput с использованием точки в качестве разделителя полей (валидность полей, значения полей)

 обратный (поставить значения перед)

 выбрать первое (значения)

⎕(... ) примените к нему следующую молчаливую функцию, используя оцененный ввод в качестве левого аргумента:

Чтобы объяснить неявные эквиваленты каждого приложения функции, мы теперь будем использовать, чтобы указать левый аргумент (индекс) и указать правый аргумент (список отдельных номеров первоначально введенного номера текущей версии).

 эквивалентно  (⍺⊃⍵) использованию для выбора элемента из

1+ добавить один к этому 

↑, эквивалентно  (⍺↑⍵), предварительным числам, взятым из

⊢∘≢↑ эквивалентно  (⍺⊢∘≢⍵)↑ эквивалентному, чтобы  (≢⍵)↑ взять из этого числа столько же, сколько есть элементов , при необходимости добавляя нули

 формат (строка с одним пробелом между каждым числом)

' '⎕R'.' PCRE R заменить пространства с периодами

Адам
источник
1

Java 8, 130 байт

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

Объяснение:

Попробуй это здесь.

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 байта

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

-1 байт благодаря @ ASCII-only!

Старое объяснение:

(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

Еще один ответ самому себе ... Не то, чтобы кто-нибудь играл в LiveScript в любом случае. :П

Я работал над другой версией:

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

Но *он слишком перегружен для распознавания в индексе сплайсинга, поэтому =0попытается получить доступ 0[0]. Таким образом, вам нужно написать что-то вроде, ..[b to ..length- b]=[0]*(..length-1-b)и это больше в конце.

Вен
источник
1
к сожалению, f=(a,b)->(for e,i in a/\.<newline> if i<b then e else if i>b then 0 else+e+1)*\.это намного дольше :(
только ASCII
@ ASCII-only Я думаю, что можно сжимать if i<b then e else if i>b then 0 else+e+1то есть [+e+1;0;e;e][i>b+(2*i<b)]или что-то в том же духе, может быть, даже([+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
только ASCII
Тогда давайте удалим подпись: ->(for e,i in it/\.<newline> [+e+1;0;e][(i>&1)+2*(i<&1)])*\.для 52
Ven
Кстати, вы можете заменить ;с пробелом. Кроме того ... похоже, что это в основном так далеко, как это будет с этим подходом
только ASCII