Số lượng giảm trong khi chữ tăng


18

Lấy cảm hứng ngẫu nhiên từ số tăng trong khi chữ giảm

Cho một danh sách các chữ cái và số nguyên hỗn hợp (ví dụ, ['a', 2, 3, 'b']) tăng các chữ cái của một vị trí trong bảng chữ cái (gói tại zđến a) và giảm số bằng 1. Đối với ví dụ trên, sản lượng nên được ['b', 1, 2, 'c'].

  • Đầu vào có thể là danh sách kiểu hỗn hợp, chuỗi phân tách, danh sách chuỗi, v.v.
  • zkết thúc tốt đẹp a, nhưng 1đi đến 00đi đến-1 , v.v.
  • Đầu vào sẽ chỉ bao giờ [a-z]và số nguyên. Bạn có thể chọn chữ in hoa [A-Z]làm đầu vào nếu điều đó dễ dàng hơn cho bạn.
  • Đầu vào được đảm bảo không trống.
  • Đầu vào có thể chỉ chứa số hoặc chỉ chữ cái.

Ví dụ:

Input
Output

['a', 2, 3, 'b']
['b', 1, 2, 'c']

['a', 'b', 'z']
['b', 'c', 'a']

[-1, 0, 257, 'x']
[-2, -1, 256, 'y']

[0, 3, 1, 20382876]
[-1, 2, 0, 20382875]

Quy tắc và làm rõ

  • Đầu vào và đầu ra có thể được đưa ra bởi bất kỳ phương pháp thuận tiện .
  • Bạn có thể in kết quả sang STDOUT hoặc trả lại dưới dạng kết quả hàm.
  • Đầu ra không phải có cùng định dạng với đầu vào (ví dụ: bạn có thể lấy đầu vào dưới dạng chuỗi và đầu ra dưới dạng danh sách).
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận.
  • Nếu có thể, bạn có thể giả sử số nguyên đầu vào / đầu ra phù hợp với intphạm vi gốc của ngôn ngữ của bạn .
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

1
Nếu số đó bằng Integer.MinValue hoặc bất cứ giá trị thấp nhất nào của số nguyên đã ký trong ngôn ngữ của tôi, tôi có nên chuyển sang Integer.maxValue hay tôi nên tiếp tục đếm ngược?
Nzall

1
@Nzall Hành vi không xác định. Điểm đầu dòng thứ 5 trong Quy tắc và Làm rõ chỉ định rằng cả số nguyên đầu vào và đầu ra đều phù hợp với intphạm vi gốc ngôn ngữ của bạn , vì vậy bạn sẽ không bao giờ nhận được Integer.MinValuelàm đầu vào.
admBorkBork

Câu trả lời:



5

Python 3 , 59 byte

lambda a:[i-1if''!=i*0else chr(97+(ord(i)+8)%26)for i in a]

Hãy thử trực tuyến!

-1 byte nhờ Erik the Outgolfer



@EriktheOutgolfer số nguyên so với chuỗi so sánh dường như không hoạt động trong giải pháp của bạn.
Jitse

Ồ đúng rồi, bạn cần Python 2 cho điều đó.
Erik the Outgolfer

À đúng rồi, nó có vẻ hiệu quả. Vẫn là sự thay thế -96với +8tiết kiệm một byte.
Jitse

''!=i*0ngắn hơn ba byte so với tôi str(i)>'9', công việc tốt
Black Owl Kai

5

Perl 5 (-p), 17 byte

y/a-z/b-za/or$_--

Hãy thử trực tuyến!

Phần thưởng 19-byter:

$_>$_++?$_-=2:s/a//

TIO . Điều này có một số thủ thuật hay, nhưng không thể đánh bại giải pháp đơn giản ở trên.


5

Ruby , 34 byte

Đối với mỗi phần tử, cố gắng trả về phần tử -1. Các chuỗi không thể làm điều này, vì vậy chúng lỗi và được chọn bởi rescuemệnh đề, thay vào đó gọi succnó để trả về chữ cái tiếp theo trong bảng chữ cái. succ"lăn qua" trênz và trả về aa, mặc dù vậy, chúng ta chỉ cần lấy ký tự đầu tiên trong chuỗi được trả về.

->a{a.map{|e|e-1rescue e.succ[0]}}

Hãy thử trực tuyến!



3

Trăn 3 , 182 130 118 byte

-51 byte nhờ @AdmBorkBork và @Black Owl Kai, -1 byte nhờ @Black Owl Kai, -12 byte bằng cách thay thế .append()bằng +=[]và thay thế n+1bằng-~n

def a(x):
 b='abcdefghijklmnopqrstuvwxyz';c=[]
 for d in x:
  try:c+=[d-1]
  except:c+=[b[(-~b.find(d)%26)]]
 return c

Hãy thử trực tuyến!

Tôi đã thực hiện điều này trong khi câu hỏi nằm trong Sandbox nhưng không thấy nó được đăng cho đến tận bây giờ. : P

Ung dung

def a(x):
    b = 'abcdefghijklmnopqrstuvwxyz'
    c = []
    for d in x:
        try:
            c.append(d - 1)
        except:
            c.append(b[((b.find(d) + 1) % 26)])
    return c

Giải trình

Đối với mỗi phần tử trong danh sách được nhập x, nó cố gắng trừ đi 1 và thêm nó vào danh sách trả về cuối cùng. Nếu xảy ra lỗi (vì phần tử là một chuỗi), chỉ mục của chữ cái trong bảng chữ cái được thêm bởi 1 và mod 26 được lấy. Bản mod 26 kết thúc chỉ số từ 26 trở về 0.


Chào mừng đến với CodeGolf SE! Tôi không phải là chuyên gia về Python, nhưng tôi nghĩ bạn có thể trao đổi 4 khoảng trắng cho các tab để lưu một loạt byte.
admBorkBork

Tôi đã nhận được nó tới 131 byte chỉ bằng cách loại bỏ khoảng trắng. Một byte nữa có thể được chơi bằng cách nhận ra rằng (x+27)%26có kết quả tương tự(x+1)%26
Black Owl Kai

@AdmBorkBork BlackOwlKai Cảm ơn bạn đã giúp đỡ! Tôi đã chỉnh sửa bài viết.
asdf60367134

Bạn có thể sử dụng một ternary với str(d)==dđể kiểm tra xem đó có phải là một chuỗi hay không, thay vì dựa vào thử / ngoại trừ. Sau đó, vì bạn không còn cần thử / ngoại trừ, bạn có thể thực hiện toàn bộ trong một danh sách hiểu! Tôi sẽ cho phép bạn suy nghĩ thêm một chút nhưng bạn có thể dễ dàng nhận được dưới 100 byte theo cách này;)
Ink Ink



2

Gema , 55 ký tự

<N>=@sub{$1;1}
z=a
<L>=@int-char{@add{@char-int{$1};1}}

Dung dịch bẩn. Bao bọc xung quanh gia tăng thư là rất dài, vì vậy có một quy tắc riêng.

Đầu vào có thể là bất cứ điều gì, chỉ cần sử dụng một số phân cách. (Bạn thậm chí có thể bỏ qua dấu phân cách giữa số và chữ. Với giá 1 ký tự để thay đổi thành<L1> bạn cũng có thể bỏ qua các dấu phân cách giữa các chữ cái.)

Chạy mẫu:

bash-5.0$ gema '<N>=@sub{$1;1};z=a;<L>=@int-char{@add{@char-int{$1};1}}' <<< "['a', 2, 3, 'b']"
['b', 1, 2, 'c']

Hãy thử trực tuyến!

Gema, 66 ký tự

<N>=@sub{$1;1}
<L>=@cmpi{$1;z;@int-char{@add{@char-int{$1};1}};a;}

Dung dịch sạch. Một nửa tương đối hiệu quả, sau đó là một nửa nỗi đau tinh khiết.

Chạy mẫu:

bash-5.0$ gema '<N>=@sub{$1;1};<L>=@cmpi{$1;z;@int-char{@add{@char-int{$1};1}};a;}' <<< "['a', 2, 3, 'b']"
['b', 1, 2, 'c']

Hãy thử trực tuyến!


2

R , 77 85 byte

Cảm ơn @Giuseppe vì đã tăng 8 byte

function(l)Map(function(x)"if"(i<-match(x,L<-c(letters,"a"),0),L[i+1],x-1),l)

Hãy thử trực tuyến!

Lấy đầu vào là một danh sách. Sau một thay đổi lớn của @Giuseppe, điều này sử dụng Mapđể áp dụng một chức năng cho danh sách. Nó sử dụng matchđể kiểm tra một nhân vật. Trong quá trình kiểm tra, danh sách thư mở rộng và chỉ mục được lưu lại để trả về.


Tôi cho rằng characterkhông hữu hạn bởi vì chúng được sử numericdụng is.finitevà do đó NA?
Giuseppe

@Giuseppe nghĩ rằng nó sẽ là một cái gì đó dọc theo những dòng đó. Mặc dù đó là các byte giống như is.double tôi cần sử dụng nó :)
MickyT


xin lỗi để thoát khỏi bạn is.finite, tôi nghĩ rằng tôi sẽ tự mình bẻ khóa
Giuseppe

1
@Giuseppe rất hay, Sẽ không nghĩ đến Mapmatch. Thật tốt khi học được điều gì đó mỗi ngày :)
MickyT

2

MathGolf , 14 byte

▄\╧¿ò'z=¿Å'a)(

Hãy thử trực tuyến!

Lấy chữ cái viết thường.

Giải trình

▄\╧              Is the element in the lowercase alphabet?
   ¿ò            If so:
     'z=           Is it equal to z?
        ¿Å         If so:
          'a         Push 'a'
            )      Else: Increment the string
             (   Else: Decrement the number

2

Võng mạc , 52 50 48 58 41 37 byte

T`zl`l
\b0
-
\d+
*
-_*
-$.0
_(_*)
$.1

-4 byte nhờ @FryAmTheEggman (và để đề cập đến tôi đã có một lỗi: 1 → -1thay vì1 → 0 ).
+10 byte để sửa lỗi 10.. Một trường hợp cạnh khó chịu như vậy đã làm tôi khó chịu trong một thời gian dài .. Nhưng bây giờ đã chơi nó tới 41 byte. (Bây giờ tôi tò mò về <40 byte phiên bản @Neil@CowsQuack đề cập trong các ý kiến .. Cảm ơn @Neil for the tip của chuyển đổi 0để -, và đối phó với các giá trị âm đầu tiên. Chuyển đổi những người trở lại ngay từ unary để nguyên đã giúp rất nhiều.)
Rõ ràng tôi không cần ranh giới vào thời điểm này, vì vậy -4 byte ..>.>

I / O được phân tách bằng dấu phẩy.

Hãy thử trực tuyến.

Giải trình:

Chuyển ngữ tất cả "zabcdefghijklmnopqrstuvwxy(z)"sang "abcdefghijklmnopqrstuvwxyz":

T`zl`l

Thay thế tất cả các 0s độc lập bằng một -:

\b0
-

Chuyển đổi tất cả các số thành đơn nguyên, bằng cách thay thế chúng bằng số lượng dấu gạch dưới đó:

\d+
*

Đối với tất cả các giá trị âm, có 0 hoặc nhiều dòng đơn phía sau nó: giữ dấu trừ và lấy tổng chiều dài của kết quả khớp này (bao gồm cả -), được chuyển đổi trở lại thành một số nguyên:

-_*
-$.0

Đối với các số nguyên dương: khớp với một số nguyên dương bằng cách khớp một dòng đơn, theo sau là 0 hoặc nhiều dòng đơn. Và sau đó thay thế chúng bằng độ dài của nhóm chụp đó để loại bỏ dòng đơn đó và chuyển chúng trở lại thành số nguyên đồng thời:

_(_*)
$.1


1

PHP , 50 byte

for(;''<$a=$argv[++$i];)echo$a<a?--$a:(++$a)[0],_;

Hãy thử trực tuyến!

Xét nghiệm

Xuất ra các chữ cái / số nguyên cách nhau bởi _ dấu phân cách.

Trong PHP bạn có thể tăng các chữ cái trực tiếp, vì vậy tôi đã tận dụng nó. Nhưng zđược tăng lên aa, để chuyển đổi nó thành a, (++$a)[0]được sử dụng chỉ xuất ra ký tự đầu tiên của giá trị tăng.


1

Japt -m , 13 12 byte

-1 byte nhờ Shaggy

;¤?UÉ:Cg8+Uc

Thử nó

Giải trình:

;o ?UÉ:Cg8+Uc
-m              // Map U through the input:
 o              // Try to create a range [1...U]
   ?            //   If that creates a range (number):
    UÉ          //     Return U-1
      :         //   Else, return:
;      C        //     alphabet (a...z)
        g       //     Index:
         8+Uc   //       8 + char-code of U

Lưu ý : ;biến Cthành bảng chữ cái viết thường


Nó không giống như kết thúc tốt đẹp này từ zđến a.
Xù xì

@Shaggy Rất tiếc, tôi đã bỏ lỡ điều đó. Tôi đã thêm một bản sửa lỗi tạm thời cho +2 byte
Oliver

Không thể tìm ra cách sửa lỗi của tôi (chưa) mà không cần một ternary, điều này làm cho nó quá giống với ý thích của tôi vì vậy tôi sẽ xóa ngay bây giờ. o-> ¤sẽ giúp bạn tiết kiệm một byte ở đây.
Xù xì

1
+2và sau đó -1nhờ Shaggy sẽ chính xác hơn! : D
Shaggy

1
@Shaggy +2Cảm ơn Oliver: P
Oliver

1

Haskell, 52 51 byte

map q
q"z"="a"
q x|x>"`"=succ<$>x|1<2=show$read x-1

Vì Haskell không cho phép danh sách các loại hỗn hợp, các chữ cái và số được lấy và trả về dưới dạng chuỗi.

Hãy thử trực tuyến!

Kiểm tra mọi phần tử danh sách: nếu chuỗi là "z", trả về"a" ; nếu ký tự đầu tiên của chuỗi là>'`' (tức là một chữ cái, không phải là một chữ số), hãy trả về người kế thừa của char (s) trong chuỗi; mặt khác nó phải là số, vì vậy hãy chuyển đổi thành một số nguyên, trừ đi 1 và biến thành một chuỗi một lần nữa.

Chỉnh sửa: -1 byte nhờ @cole.


Cái này có hoạt động với 51 byte không?
cole

@ cole: đúng vậy. Cảm ơn!
nimi

1

Thạch , 13 byte

®i‘ị®µ’e?€Øa©

Hãy thử trực tuyến!

Sửa lỗi thông minh của Jonathan Allan .

Lưu ý: Đây không phải là một chương trình đầy đủ, phần chân trang trên TIO cho phép nhập bằng cách sử dụng đối số dòng lệnh để kiểm tra chức năng.


Không làm việc với các tiêu cực trong đầu vào (hoặc trên phạm vi chr). ®i‘ị®µ’e?€Øa©là một sửa chữa cho số không tôi tin.
Jonathan Allan

@Jonathan ALLan Hah, tôi quên rằng nó không hoạt động chính xác trong trường hợp đó. Trớ trêu thay, vì tôi đã tránh sử dụng ~làm điều kiện để tính đến -1s trong đầu vào ... Ngoài ra, tôi sẽ rút ngắn như thế nào ®i‘ị®...
Erik the Outgolfer

1

C ++ 17 (gcc) , 120 byte

#define O int operator()
struct V{O(char&c){c++-90?:c=65;}O(int&i){--i;}};int f(auto&l){for(auto&x:l)std::visit(V{},x);}

Đây flà chức năng cần thiết; llà cả tham số đầu vào và đầu ra, và nó được dự kiến ​​là một thùng chứa các đối tượng tương thích std::variant<char, int>hoặc ngược lại.

Hãy thử trực tuyến!



1

K (oK), 27 bytes

{$[9+@x;`c$97+26!8+x;x-1]}'

Try it online!

-8 thanks to ngn and dzaima :)


1
31 bytes {$[-9=@x;x-1;90=x;"A";`c$1+x]}' inlining the special-case & using uppercase (and the ' has to be counted as the input should be a list)
dzaima

@scrawl i think dzaima is right - the ' should be counted. here's a slightly longer expression that doesn't need ' and also takes care of "z"->"a": {`c`i[t]$(-26*x~'"z")+x+1-2*t:x~'0+x}
ngn

or even better - make a list of projections and apply them with @': {(`c$97+26!-96+;-1+)[x~'0+x]@'x}. here -96 (which is +1 minus the ascii code of "a") can be replaced with 8 as it's taken mod 26.
ngn

another -1 byte by opting for capital letters: {(`c$65+26!14+;-1+)[x=_x]@'x}
ngn

@dzaima yours can be shortened through -9=@x -> x=_x
ngn

0

Runic Enchantments, 36 bytes

\$ka'~?*3({':+1\
R';$ >i::0Sqn=?/1-$

Try it online!

General process is to read input, prepend with a 0 (coercion to string), convert back to a number (single char will always return -1), compare with input. If same, it must be a numerical value, subtract 1 and print. If not same, it must be a char, subtract 1, compare with {. If less than, print, otherwise replace it with a and print.

Repeat until program performs a stack underflow.

Output is separated by ; in order to save 1 byte (and has a trailing one). Input is space-separated.


0

Stax, 17 bytes

àºÇ╝'♫d▬♣ΩÜEƒ6╩╬ó

Run and debug it

This feels like it should be possible to do shorter, but I can't resist the opportunity to use a new stax feature from the last release.

Treating the entire input as a string:

  1. Regex replace runs of digits with eval(match) - 1. This is the new feature, as the regex block replacement is not a string, but an integer.
  2. Regex replace runs of letters by ring-translating them around the lower-case alphabet.

0

Python 3, 66 bytes

lambda X:[x-1if type(x)==int else chr(97+(ord(x)+8)%26)for x in X]

Edit:

I didn't see the solution of Jitse until now. The trick of if''!=i*0 is awesome!


0

C#, 148 bytes

(object[] o)=>{var l=new List<object>();foreach(var h in o){try{l.Add((int)h-1);}catch{var c=((char)h+1);if(c>122){c=97;}l.Add((char)c);}}return l;}

Repl.it link

Ungolfed:

var inputList = new object[] {'a', 2, 'z', 6};
var outputList = new List<object>();
foreach (var currentItem in inputList)
{
    try
    {
        outputList.Add((int)currentItem-1);
    }
    catch
    {
        var currentItemPlusOne = ((char)currentItem + 1);
        if (currentItemPlusOne > 122)
        {
            currentItemPlusOne = 97;
        }
        outputList.Add((char)currentItemPlusOne);
    }
}

0

Charcoal, 16 bytes

WS⟦⎇№βι§β⊕⌕βιI⊖ι

Try it online! Link is to verbose version of code. Takes input on STDIN, each line being either a single lowercase letter or an integer, and outputs on separate lines on STDOUT. Explanation:

WS

Repeatedly input from STDIN until an empty line is reached.

Make this expression output on its own line.

⎇№βι

Is this a substring of the predefined lowercase alphabet?

§β⊕⌕βι

If so then print the next letter cyclically indexed.

I⊖ι

Otherwise decrement the value and cast back to string for implicit print.


0

Zsh, 47 bytes

a=({a..z} a)
for i
<<<${a[$a[(i)$i]+1]:-$[--i]}

Try it online!

a=({a..z} a)                  # append extra 'a' to the end to handle 'z' case
for i                         # for i in "$@" arguments
<<<${a[$a[(i)$i]+1]:-$[--i]}
       $a[(i)$i]              # first (i)ndex of $i in list (if not found, set to after last index)
      [         +1]           # increment
   ${a[           ]        }  # value in array at index. if lookup fails, empty string
   ${              :-$[--i]}  # if empty, decrement $i and substitute instead
<<<                           # print to stdout

0

C (gcc), 93 86 bytes

f(int**s){for(char**p=s,*z;z=*p++;)64&*z?*z=*z-'z'?++*z:97:sprintf(z,"%d",atoi(z)-1);}

Try it online!

The input is a NULL-terminated array of '\0'-terminated strings, e.g. {"a", "b", "c", "17", NULL}.

-7 bytes thanks to @ceilingcat


0

Perl 6, 31 bytes

*>>.&{(try $_-1)||chr ord ++$_}

Try it online!

Anonymous Whatever lambda that maps each element to the list and attempts to subtract one from it, otherwise incrementing it and taking the first character in the case that z wraps over to aa.


0

T-SQL 2012, 61 bytes

Capital letters needed in input.

Using table variable as input.

SELECT iif(x<'a',left(x-1,9),char((ascii(x)-64)%26+65))FROM @

Try it online


0

SimpleTemplate, 80 bytes

This was written on a language I've made.

Due to limitations in the compiler, I can't reduce it any more.

{@eachargv}{@if_ is matches"@\d+@"}{@incby-1_}{@echol_}{@else}{@inc_}{@echol_.0}

And now, ungolfed:

{@each argv as value}
    {@if value is matches "@\d+@"}
        {@inc by -1 value}
    {@else}
        {@inc by 1 value}
    {@/}
    {@echo value, "\n"}
{@/}

And the explanation:

  • {@each argv as value} - loops through all values in argv. (argv contains all the arguments passed).
    If the as <var> isn't present, the default _ variable is assumed.
  • {@if value is matches "@\d+@"} - checks that value matches with the regular expression "@\d+@".
  • {@inc by -1 value} - increments the value by -1 (basically, a decrement).
  • {@echo value, "\n"} and {@echol_} - echol outputs the values passed and appends a line at the end.
  • {@else} - self-explanatory
  • {@inc by 1 value} - increments the value by 1. If the by <value> is missing, it is assumed to be 1.
  • {@echo value.0, "\n"} and {@echol_.0} - echol outputs the values passed and appends a line at the end.
    This is required because of the challenge rules: z wraps to a.
    When an @inc is used on a string, it increments the chars and, once it hits z, it wraps to aa.
    Outputting the first character satisfies the challenge, at the cost of 7 bytes.
  • {@/} - closes the {@else} above (optional).
  • {@/} - closes the {@each} above (optional).

You can try this on: http://sandbox.onlinephpfunctions.com/code/7533641a0aa1fc8bf4699a9c758690de186b052f

Each passed argument to render() will be a new value that is considered.


-1

Perl, 64 bytes

foreach (@ARGV){$_=~m/[a-zA-Z]/?++$_:--$_;print substr $_,0,1;}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.