Angka-angka menurun sementara huruf meningkat

18

Diilhami secara acak oleh Angka yang Meningkat Saat Surat Menurun

Diberikan daftar campuran huruf dan bilangan bulat (misalnya, ['a', 2, 3, 'b']) menambah huruf dengan satu posisi dalam alfabet (membungkus zke a) dan mengurangi angka dengan 1. Untuk contoh di atas, output harus ['b', 1, 2, 'c'].

  • Input dapat berupa daftar tipe campuran, string terbatas, daftar string, dll.
  • zmembungkus ke a, tetapi 1pergi ke 0, dan 0pergi ke -1, dll.
  • Masukan hanya akan menjadi [a-z]dan bilangan bulat. Anda dapat memilih huruf kapital [A-Z]sebagai input jika itu lebih mudah bagi Anda.
  • Input dijamin tidak kosong.
  • Input mungkin hanya berisi angka atau huruf saja.

Contoh:

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]

Aturan dan Klarifikasi

  • Input dan output dapat diberikan dengan metode apa pun yang mudah .
  • Anda dapat mencetak hasilnya ke STDOUT atau mengembalikannya sebagai hasil fungsi.
  • Output tidak harus memiliki format yang sama dengan input (misalnya, Anda bisa mengambil input sebagai string dan output sebagai daftar).
  • Program lengkap atau fungsi dapat diterima.
  • Jika berlaku, Anda dapat menganggap bilangan bulat input / output sesuai dengan intrentang asli bahasa Anda .
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
AdmBorkBork
sumber
1
Jika angkanya sama dengan Integer.MinValue atau apa pun nilai terendah integer yang ditandatangani dalam bahasa saya, haruskah saya melakukan underflow ke Integer.maxValue atau haruskah saya terus menghitung mundur?
Nzall
1
@Nzall Perilaku tidak terdefinisi. Poin 5 di bawah Aturan dan Klarifikasi menentukan bahwa bilangan bulat input dan output cocok dengan intrentang asli bahasa Anda , sehingga Anda tidak akan pernah mendapatkan Integer.MinValuesebagai input.
AdmBorkBork

Jawaban:

6

05AB1E , 5 byte

<AAÀ‡

Cobalah online!

<          # decrement the numbers
 A         # constant "abcdefghijklmnopqrstuvwxyz"
  AÀ       # same, but rotated left ("bcd...yza")
    ‡      # transliterate
Grimmy
sumber
5

Python 3 , 59 byte

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

Cobalah online!

-1 byte terima kasih kepada Erik the Outgolfer

Jitse
sumber
1
57 byte .
Erik the Outgolfer
@EriktheOutgolfer integer vs perbandingan string tampaknya tidak berfungsi dalam solusi Anda.
Jitse
Oh benar, Anda perlu Python 2 untuk itu.
Erik the Outgolfer
Ah ya, sepertinya itu berhasil. Masih penggantian -96dengan +8menghemat satu byte.
Jitse
''!=i*0tiga byte lebih pendek dari str(i)>'9'pekerjaan saya yang baik
Black Owl Kai
5

Perl 5 (-p), 17 byte

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

Cobalah online!

Bonus 19-byter:

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

TIO . Yang ini menampilkan beberapa trik keren, tetapi gagal mengalahkan solusi langsung di atas.

Grimmy
sumber
5

Ruby , 34 byte

Untuk setiap elemen, cobalah untuk mengembalikan elemen -1. String tidak dapat melakukan ini, sehingga mereka salah dan diambil oleh rescueklausa, yang sebaliknya memanggilnya succuntuk mengembalikan huruf berikutnya dalam alfabet. succ"berguling" zdan kembali aa, jadi kami cukup mengambil karakter pertama dalam string yang dikembalikan.

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

Cobalah online!

Nilai Tinta
sumber
3

Python 3 , 182 130 118 byte

-51 byte berkat @AdmBorkBork dan @Black Owl Kai, -1 byte berkat @Black Owl Kai, -12 byte dengan mengganti .append()dengan +=[]dan mengganti n+1dengan-~n

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

Cobalah online!

Saya membuat ini ketika pertanyaannya ada di Sandbox tetapi tidak melihatnya diposting sampai sekarang. : P

Tidak disatukan

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

Penjelasan

Untuk setiap elemen dalam daftar yang dimasukkan x, ia mencoba untuk mengurangi 1 dan menambahkannya ke daftar akhirnya dikembalikan. Jika kesalahan terjadi (karena elemennya adalah string), indeks huruf dalam alfabet ditambahkan oleh 1 dan mod 26 diambil. Mod 26 membungkus indeks 26 kembali ke 0.

asdf60367134
sumber
Selamat datang di CodeGolf SE! Saya bukan ahli di Python, tapi saya pikir Anda bisa menukar 4 spasi untuk tab untuk menyimpan banyak byte.
AdmBorkBork
Saya mendapatkannya hingga 131 byte hanya dengan menghilangkan spasi. Satu byte lebih lanjut dapat di-golf dengan menyadari bahwa (x+27)%26memiliki hasil yang sama dengan(x+1)%26
Black Owl Kai
@AdmBorkBork BlackOwlKai Terima kasih atas bantuannya! Saya telah mengedit posting.
asdf60367134
Anda dapat menggunakan ternary dengan str(d)==duntuk memeriksa apakah string atau tidak, alih-alih bergantung pada coba / kecuali. Kemudian, karena Anda tidak perlu lagi mencoba / kecuali, Anda dapat melakukan semuanya dalam daftar pemahaman! Saya akan membiarkan Anda memikirkannya sedikit lebih banyak tetapi Anda dapat dengan mudah mendapatkan di bawah 100 byte dengan cara ini;)
Value Ink
89 byte
Nilai Tinta
2

Gema , 55 karakter

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

Solusi kotor. Membungkus kenaikan huruf sangat panjang, jadi dapatkan aturan yang terpisah.

Input bisa berupa apa saja, cukup gunakan beberapa pemisah. (Anda bahkan dapat menghilangkan pemisah antara angka dan huruf. Dengan harga 1 karakter untuk diubah, <L1>Anda dapat menghilangkan pemisah antara huruf juga.)

Contoh dijalankan:

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

Cobalah online!

Gema, 66 karakter

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

Solusi bersih. Setengah relatif efisien, kemudian setengah murni kesakitan.

Contoh dijalankan:

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

Cobalah online!

manatwork
sumber
2

R , 77 85 byte

Terima kasih @Giuseppe untuk rejan 8 byte

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

Cobalah online!

Mengambil input sebagai daftar. Setelah perubahan besar oleh @Giuseppe, ini menggunakan Mapuntuk menerapkan fungsi ke daftar. Itu digunakan matchuntuk menguji karakter. Selama pengujian daftar surat yang diperluas dan indeks disimpan untuk pengembalian.

MickyT
sumber
Saya kira characters tidak terbatas karena mereka dilemparkan numericoleh is.finitedan begitu NA?
Giuseppe
@Giuseppe berpikir itu akan menjadi sesuatu di sepanjang garis itu. Meskipun itu byte yang sama dengan is.double saya harus menggunakannya :)
MickyT
77 byte ?
Giuseppe
maaf sudah menyingkirkanmu is.finite, kupikir aku akan melakukannya sendiri
Giuseppe
1
@ Giuseppe sangat baik, Tidak akan memikirkan Mapdan match. Adalah baik untuk mempelajari sesuatu setiap hari :)
MickyT
2

MathGolf , 14 byte

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

Cobalah online!

Mengambil huruf sebagai huruf kecil.

Penjelasan

▄\╧              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
Jo King
sumber
2

Retina , 52 50 48 58 41 37 byte

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

-4 byte terima kasih kepada @FryAmTheEggman (dan untuk menyebutkan saya punya bug: 1 → -1bukannya 1 → 0).
+10 byte untuk memperbaiki bug dengan 1dan 0.. Kasus tepi yang menjengkelkan yang mengacaukan saya cukup lama .. Tapi sekarang golf menjadi 41 byte. (Sekarang aku ingin tahu tentang <40 byte versi @ Neil dan @CowsQuack disebutkan di komentar .. Terima kasih @ Neil untuk ujung mengkonversi 0ke -, dan berurusan dengan nilai-nilai negatif pertama. Konversi mereka kembali langsung dari unary ke bilangan bulat banyak membantu.)
Rupanya saya tidak membutuhkan batas pada saat ini, jadi -4 byte ..>.>

I / O dipisahkan oleh koma.

Cobalah online.

Penjelasan:

Transliterasikan semua "zabcdefghijklmnopqrstuvwxy(z)"ke "abcdefghijklmnopqrstuvwxyz":

T`zl`l

Ganti semua mandiri 0dengan -:

\b0
-

Ubah semua angka menjadi unary, dengan menggantinya dengan jumlah garis bawah itu:

\d+
*

Untuk semua nilai negatif, dengan nol atau lebih garis unary di belakangnya: pertahankan tanda minus, dan dapatkan panjang total kecocokan ini (termasuk -), dikonversi kembali ke integer:

-_*
-$.0

Sedangkan untuk bilangan bulat positif: cocokkan bilangan bulat positif dengan mencocokkan satu garis unary, diikuti oleh nol atau lebih garis unary. Dan kemudian menggantinya dengan panjang grup tangkap untuk menghapus satu baris unary dan mengubahnya kembali menjadi bilangan bulat secara bersamaan:

_(_*)
$.1
Kevin Cruijssen
sumber
1

SNOBOL4 (CSNOBOL4) , 103 byte

	U =&UCASE 'A'
N	X =INPUT	:F(END)
	U X @P	:F(D)
	U POS(P) LEN(1) . OUTPUT	:(N)
D	OUTPUT =X - 1	:(N)
END

Cobalah online!

Giuseppe
sumber
1

PHP , 50 byte

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

Cobalah online!

Tes

Keluaran huruf / bilangan bulat dipisahkan dengan _dengan trailing separator.

Di PHP Anda dapat menambahkan huruf secara langsung, jadi saya memanfaatkannya. Tetapi nilai tambah zuntuk aa, untuk mengubahnya menjadi a, (++$a)[0]digunakan yang hanya menghasilkan karakter pertama dari nilai tambah.

Night2
sumber
1

Japt -m , 13 12 byte

-1 byte terima kasih kepada Shaggy

;¤?UÉ:Cg8+Uc

Cobalah

Penjelasan:

;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

Catatan : ;berubah Cmenjadi alfabet huruf kecil

Oliver
sumber
Tidak terlihat seperti membungkus ini dari zke a.
Shaggy
@Shaggy Whoops, saya melewatkan itu. Saya menambahkan perbaikan sementara untuk +2 byte
Oliver
Tidak dapat menemukan cara untuk memperbaiki tambang (belum) tanpa terner, yang membuatnya terlalu mirip dengan milik Anda untuk keinginan saya, jadi saya menghapus untuk saat ini. o-> ¤akan menghemat satu byte di sini.
Shaggy
1
+2dan kemudian -1terima kasih kepada Shaggy akan lebih akurat! : D
Shaggy
1
@Shaggy The +2berkat berkat Oliver: P
Oliver
1

Haskell, 52 51 byte

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

Karena Haskell tidak mengizinkan daftar tipe campuran, huruf dan angka diambil dan dikembalikan sebagai string.

Cobalah online!

Periksa setiap elemen daftar: jika stringnya "z", kembali "a"; jika karakter pertama dari string adalah> '`'(yaitu huruf, bukan angka), kembalikan penerus karakter dalam string; selain itu harus angka, jadi konversikan ke integer, kurangi 1 dan berubah menjadi string lagi.

Sunting: -1 byte berkat @cole.

nimi
sumber
Apakah ini berfungsi untuk 51 byte?
cole
@cole: ya itu. Terima kasih!
nimi
1

Jelly , 13 byte

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

Cobalah online!

Perbaikan pintar oleh Jonathan Allan .

Catatan: Ini bukan program lengkap, catatan kaki di atas TIO memungkinkan untuk dimasukkan menggunakan argumen baris perintah untuk menguji fungsi.

Erik the Outgolfer
sumber
Tidak akan bekerja dengan negatif dalam input (atau lebih dari rentang chr). ®i‘ị®µ’e?€Øa©adalah perbaikan untuk nol saya percaya.
Jonathan Allan
@ JonathanAllan Hah, saya lupa itu tidak bekerja dalam kasus itu. Ironis, karena saya menghindari menggunakan ~sebagai syarat untuk menghitung -1dalam input ... Juga, bagaimana saya akan mempersingkat ®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);}

Berikut fadalah fungsi yang diperlukan; ladalah parameter input dan output, dan diharapkan menjadi wadah objek yang kompatibel dengan std::variant<char, int>atau sebaliknya.

Cobalah online!

Daniel Schepler
sumber
1

dzaima / APL, 21 20 byte

{0::⍵-1⋄⎕l(⍳⊇1⌽⊣)⍵}¨

Cobalah online!

-1 terima kasih kepada ngn.

dzaima
sumber
(⎕l⍳⍵)⊇1⌽⎕l->⎕l(⍳⊇1⌽⊣)⍵
ngn
1

K (oK) , 27 byte

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

Cobalah online!

-8 Terima kasih kepada ngn dan dzaima :)

tulisan cakar ayam
sumber
1
31 byte {$[-9=@x;x-1;90=x;"A";`c$1+x]}'menguraikan case khusus & menggunakan huruf besar (dan 'harus dihitung sebagai input harus daftar)
dzaima
@scrawl saya pikir dzaima benar - yang 'harus dihitung. inilah ungkapan yang sedikit lebih panjang yang tidak perlu 'dan juga menangani "z" -> "a":{`c`i[t]$(-26*x~'"z")+x+1-2*t:x~'0+x}
ngn
atau bahkan lebih baik - membuat daftar proyeksi dan menerapkannya dengan @': {(`c$97+26!-96+;-1+)[x~'0+x]@'x}. di sini -96(yang +1 dikurangi kode ascii "a") dapat diganti dengan 8saat diambil mod 26.
ngn
-1 byte lainnya dengan memilih huruf kapital:{(`c$65+26!14+;-1+)[x=_x]@'x}
ngn
@dzaima milikmu dapat disingkat melalui -9=@x->x=_x
ngn
0

Pesona Rise , 36 byte

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

Cobalah online!

Proses umum adalah membaca input, diawali dengan 0 (koersi ke string), konversikan kembali ke angka (karakter tunggal akan selalu mengembalikan -1), bandingkan dengan input. Jika sama, itu harus berupa nilai numerik, kurangi 1 dan cetak. Jika tidak sama, itu haruslah char, kurangi 1, bandingkan dengan {. Jika kurang dari, cetak, ganti dengana dan cetak.

Ulangi sampai program melakukan stack underflow.

Output dipisahkan oleh ;untuk menghemat 1 byte (dan memiliki satu trailing). Input dipisahkan oleh ruang.

Draco18s
sumber
0

Stax , 17 byte

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

Jalankan dan debug itu

Ini terasa seperti itu mungkin untuk dilakukan lebih pendek, tapi saya tidak bisa menahan kesempatan untuk menggunakan fitur stax baru dari rilis terakhir.

Memperlakukan seluruh input sebagai string:

  1. Regex mengganti angka yang berjalan dengan eval(match) - 1. Ini adalah fitur baru, karena penggantian blok regex bukan string, tetapi bilangan bulat.
  2. Regex mengganti rangkaian huruf dengan menerjemahkannya di sekitar huruf kecil.
rekursif
sumber
0

Python 3, 66 byte

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

Edit:

Saya tidak melihat solusi Jitse sampai sekarang. Caranya if ''! = I * 0 is awesome!

Jose Alejandro Galisteo Callej
sumber
0

C #, 148 byte

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

Tautan replit

Tidak Disatukan:

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);
    }
}
Merlin04
sumber
0

Arang , 16 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mengambil input pada STDIN, setiap baris dapat berupa huruf kecil tunggal atau integer, dan output pada baris terpisah pada STDOUT. Penjelasan:

WS

Masukan berulang-ulang dari STDIN hingga saluran kosong tercapai.

Buat output ekspresi ini pada barisnya sendiri.

⎇№βι

Apakah ini substring dari huruf kecil yang sudah ditentukan sebelumnya?

§β⊕⌕βι

Jika demikian maka cetak huruf berikutnya yang diindeks secara siklis.

I⊖ι

Kalau tidak, kurangi nilainya dan kembalikan ke string untuk hasil cetak implisit.

Neil
sumber
0

Zsh , 47 byte

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

Cobalah 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
Fungsi Gamma
sumber
0

C (gcc) , 93 86 byte

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

Cobalah online!

Inputnya adalah NULLarray '\0'-minminasi dari string -minminasi, mis{"a", "b", "c", "17", NULL} .

-7 byte terima kasih kepada @ceilingcat

Leo Tenenbaum
sumber
0

Perl 6 , 31 byte

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

Cobalah online!

Anonim Apa pun lambda yang memetakan setiap elemen ke daftar dan mencoba untuk mengurangi satu darinya, jika tidak menambahnya dan mengambil karakter pertama dalam kasus yang zmembungkus ke aa.

Jo King
sumber
0

T-SQL 2012, 61 byte

Huruf kapital diperlukan dalam input.

Menggunakan variabel tabel sebagai input.

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

Cobalah online

t-clausen.dk
sumber
0

SimpleTemplate, 80 byte

Ini ditulis pada bahasa yang saya buat.

Karena keterbatasan dalam kompiler, saya tidak bisa menguranginya lagi.

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

Dan sekarang, ungolfed:

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

Dan penjelasannya:

  • {@each argv as value}- loop melalui semua nilai dalam argv. ( argvberisi semua argumen yang diteruskan).
    Jika as <var>tidak ada, _variabel default diasumsikan.
  • {@if value is matches "@\d+@"}- memeriksa yang valuecocok dengan ekspresi reguler "@\d+@".
  • {@inc by -1 value} - menambah nilai dengan -1 (pada dasarnya, penurunan).
  • {@echo value, "\n"}dan {@echol_}- echolmenampilkan nilai yang diteruskan dan menambahkan garis di akhir.
  • {@else} - Cukup jelas
  • {@inc by 1 value}- menambah nilainya dengan 1. Jika by <value>hilang, maka dianggap 1.
  • {@echo value.0, "\n"}dan {@echol_.0}- echolmenampilkan nilai yang diteruskan dan menambahkan garis di akhir.
    Hal ini diperlukan karena aturan tantangan: z wraps to a.
    Ketika sebuah @incdigunakan pada string, itu menambah karakter dan, setelah itu memukul z, itu membungkus aa.
    Mengeluarkan karakter pertama memenuhi tantangan, dengan biaya 7 byte.
  • {@/}- menutup yang di {@else}atas (opsional).
  • {@/}- menutup yang di {@each}atas (opsional).

Anda dapat mencobanya di: http://sandbox.onlinephpfunctions.com/code/7533641a0aa1fc8bf4699a9c758690de186b052f

Setiap argumen yang diteruskan render()akan menjadi nilai baru yang dipertimbangkan.

Ismael Miguel
sumber
-1

Perl, 64 byte

foreach (@ARGV){$_=~m/[a-zA-Z]/?++$_:--$_;print substr $_,0,1;}
Hax0r778
sumber