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


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

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

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


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'

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,'.')

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


Отлично сработано! Впервые я вижу новый 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

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тоже.


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

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


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целочисленной арифметике.


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

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.

Ницца! Мне нравится видеть здесь больше силы.
Бриантист

@ 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. Вы можете поиграть с ним онлайн здесь .


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.