Harfler Artarken Sayılar Azalır


18

Harfler Azalırken Rakamlar Artıştan Rastgele Esinlenerek

Karışık harfler ve tamsayılar (örneğin bir listesi Verilen ['a', 2, 3, 'b']) artırmak (en sarma alfabesinde bir konum harfleri zile a) ve azaltmak Yukarıdaki örnek için 1 ile sayılar, çıkış olmalıdır ['b', 1, 2, 'c'].

  • Giriş, karma tipte bir liste, sınırlandırılmış bir dize, bir dize listesi vb. Olabilir.
  • zsarar a, ancak 1gider 0ve 0gider -1, vb.
  • Giriş sadece [a-z]ve tamsayı olacaktır. Sizin için daha kolaysa [A-Z]giriş olarak büyük harfleri seçebilirsiniz .
  • Giriş boş olmadığı garanti edilir.
  • Giriş yalnızca rakam veya yalnızca harf içerebilir.

Örnekler:

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]

Kurallar ve Açıklamalar

  • Giriş ve çıkış herhangi bir uygun yöntemle verilebilir .
  • Sonucu STDOUT'a yazdırabilir veya işlev sonucu olarak döndürebilirsiniz.
  • Çıktının girdiyle aynı biçimde olması gerekmez (ör. Girdiyi bir dize olarak alabilir ve çıktıyı bir liste olarak alabilirsiniz).
  • Tam bir program veya bir işlev kabul edilebilir.
  • Varsa, giriş / çıkış tam sayılarının kendi dilinize uygun olduğunu varsayabilirsiniz int.
  • Standart boşluklar yasaktır.
  • Bu bu nedenle her zamanki golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

1
Sayı Integer.MinValue değerine eşitse veya işaretli bir tam sayının dilimdeki en düşük değeri ne olursa olsun, Integer.maxValue'ya taşmalı mıyım yoksa geriye saymaya devam etmeli miyim?
Nzall

1
@Nzall Tanımsız davranış. Kurallar ve Açıklamalar altındaki 5. madde işareti, hem girdi hem de çıktı tamsayılarının kendi dil intaralığınıza uyduğunu belirtir , böylece hiçbir zaman Integer.MinValuegirdi olarak alınmazsınız.
AdmBorkBork

Yanıtlar:



5

Python 3 , 59 bayt

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

Çevrimiçi deneyin!

Outgolfer Erik sayesinde -1 bayt



@EriktheOutgolfer tamsayı vs dize karşılaştırması çözümünüzde çalışmıyor gibi görünüyor.
Jitse

Oh, bunun için Python 2'ye ihtiyacınız var.
Outgolfer Erik

Ah evet, o zaman işe yarıyor gibi görünüyor. Yine yerine -96sahip +8bir bayt kaydeder.
Jitse

''!=i*0 benden üç bayt daha kısa str(i)>'9' iyi işimden
Black Owl Kai


5

Ruby , 34 bayt

Her öğe için -1 öğesini döndürmeyi deneyin. Dizeler bunu yapamaz, bu yüzden hata yaparlar ve rescuebunun yerine succalfabedeki bir sonraki harfi döndürmek için çağırırlar. succ"üzerinden geçer" zve geri döner aa, bu yüzden sadece döndürülen dizgideki ilk karakteri alırız.

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

Çevrimiçi deneyin!



3

Python 3 , 182 130 118 bayt

-51 değiştirerek @AdmBorkBork ve @Black baykuş Kai sayesinde, -1 @Black Owl Kai bayt sayesinde, -12 bayt miktarı .append()ile +=[]ve değiştirilmesi n+1ile-~n

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

Çevrimiçi deneyin!

Bunu soru Sandbox'tayken yaptım ama şimdiye kadar yayınlandığını görmedim. : P

Ungolfed

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

açıklama

Girilen listedeki her öğe xiçin 1 çıkarmaya ve onu döndürülen nihai listeye eklemeye çalışır. Bir hata oluşursa (öğe bir dize olduğundan), harfin alfabedeki dizini 1 ile eklenir ve bu mod 26 alınır. Mod 26, 26 dizinini tekrar 0'a sarar.


CodeGolf SE'ye hoş geldiniz! Ben Python'da uzman değilim, ama bir sürü bayt kaydetmek için sekmeler için 4 boşluk değiştirebilirsiniz.
AdmBorkBork

Sadece boşluğu ortadan kaldırarak 131 bayta aldım . Bir bayt daha (x+27)%26aynı sonuca sahip olarak fark edilebilir(x+1)%26
Black Owl Kai

@AdmBorkBork BlackOwlKai Yardımınız için teşekkür ederiz! Gönderiyi düzenledim.
asdf60367134

Deneme str(d)==d/ hariç olmak yerine, bir dize olup olmadığını kontrol etmek için bir üçlü kullanabilirsiniz . Sonra, artık denemeye / dışlamaya ihtiyacınız olmadığından, her şeyi bir liste kavrayışında yapabilirsiniz! Biraz daha düşünmenize izin vereceğim, ancak bu şekilde 100 baytın altına kolayca ulaşabilirsiniz;)
Value Ink



2

Gema , 55 karakter

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

Kirli çözelti. Harf artışıyla sarılmak acı verici bir şekilde uzun, bu yüzden ayrı bir kural var.

Girdi oldukça her şey olabilir, sadece bazı ayırıcılar kullanın. (Sayılar ve harfler arasındaki ayırıcıları bile atlayabilirsiniz. 1 karakterin fiyatı ile<L1> harfler arasında ayırıcıları da atlayabilirsiniz.)

Örnek çalışma:

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

Çevrimiçi deneyin!

Gema, 66 karakter

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

Temiz çözelti. Yarısı nispeten etkili, sonra yarı saf ağrı.

Örnek çalışma:

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

Çevrimiçi deneyin!


2

R , 77 85 bayt

Boğmaca 8 bayt için @Giuseppe teşekkürler

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

Çevrimiçi deneyin!

Girişi liste olarak alır. @Giuseppe tarafından yapılan büyük bir değişiklikten sonra, bu Maplisteye bir işlev uygulamak için kullanılır. matchBir karakteri test etmek için kullanılır . Test sırasında uzatılmış harf listesi ve dizin dönüş için kaydedilir.


Herhalde characterler onlar için dökme, çünkü sonlu değildir numerictarafından is.finiteve bu nedenle vardır NA?
Giuseppe

@Giuseppe, bu çizgiler boyunca bir şey olacağını düşündü. İs.double ile aynı bayt olmasına rağmen kullanmam gerekiyordu :)
MickyT


kurtulmak için üzgünüm is.finite, kendim bir çatlak alacağını düşündüm
Giuseppe

1
@Giuseppe çok güzel, Mapve düşünemezdim match. Her gün bir şeyler öğrenmek güzel :)
MickyT

2

MathGolf , 14 bayt

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

Çevrimiçi deneyin!

Mektubu küçük harf olarak alır.

açıklama

▄\╧              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

Retina , 52 50 48 58 41 37 bayt

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

@FryAmTheEggman sayesinde -4 bayt (ve bahsettiğim için bir hata vardı: 1 → -1yerine 1 → 0).
10 bayt olan bir hatayı düzeltmek için 1ve 0.. uzunca bir süre beni vidalı .. Ama 41 bunu golfed Böyle bir can sıkıcı kenarı durumda şimdi bayt. (Şimdi <40 bayt sürümleri hakkında meraklıyım @Neil ve @CowsQuack .. teşekkürler yorum olarak bahsedilen @Neil dönüştürme ucu için 0için -ve ilk negatif değerleri ile uğraşan. Tamsayıya tekli gelenler sağ arka dönüştürme çok yardımcı oldu.)
Anlaşılan> Bu noktada sınırları, yani -4 bayt .. gerekmez.>

G / Ç virgülle ayrılmıştır.

Çevrimiçi deneyin.

Açıklama:

Tüm çevirisini yap "zabcdefghijklmnopqrstuvwxy(z)"için "abcdefghijklmnopqrstuvwxyz":

T`zl`l

Tüm bağımsızları bir 0ile değiştir -:

\b0
-

Tüm sayıları bu miktarda alt çizgi ile değiştirerek tek sayıya dönüştürün:

\d+
*

Arkasında sıfır veya daha fazla tekli satır bulunan tüm negatif değerler için: eksi işaretini koruyun ve bu eşleşmenin (dahil -) toplam uzunluğunu bir tamsayıya dönüştürerek elde edin:

-_*
-$.0

Pozitif tamsayılara gelince: tek bir tekli çizgiyi ve ardından sıfır veya daha fazla tekli çizgiyi eşleştirerek pozitif bir tamsayıyı eşleştirin. Ardından, tekli tekli satırı kaldırmak ve aynı anda tamsayılara dönüştürmek için bunları bu yakalama grubunun uzunluğu ile değiştirin:

_(_*)
$.1


1

PHP , 50 bayt

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

Çevrimiçi deneyin!

Testler

_Sondaki ayırıcıyla ayrılmış harf / tam sayı çıktısı verir.

PHP'de harfleri doğrudan artırabilirsiniz, bu yüzden bundan yararlandım. Ama zhiç artırılır aaonu dönüştürmek, a, (++$a)[0]sadece artan değerin ilk karakterini çıkış verdiğinde kullanılır.


1

Japt -m , 13 12 bayt

Shaggy sayesinde -1 bayt

;¤?UÉ:Cg8+Uc

Dene

Açıklama:

;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

Not : küçük harfli alfabeye ;dönüşürC


O bu sarar gibi görünmüyor ziçin a.
Shaggy

@Shaggy Whoops, bunu kaçırdım. +2 bayt için geçici bir düzeltme ekledim
Oliver

Üçlü olmadan benimkini (henüz) düzeltmenin bir yolunu bulamadım. o-> ¤burada bir bayt kurtaracak.
Shaggy

1
+2ve sonra -1Shaggy sayesinde daha doğru olurdu! : D
Shaggy

1
@Shaggy +2Oliver sayesinde: P
Oliver

1

Haskell, 52 51 bayt

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

Haskell, karışık türlerin listelerine izin vermediğinden, harfler ve sayılar dize olarak alınır ve döndürülür.

Çevrimiçi deneyin!

Her liste öğesini kontrol edin: dize "z", döndür"a" ; dizenin ilk karakteri>'`' (yani bir rakam değil bir harf), karakter dizisinin ardıllarını döndürür; aksi takdirde sayı olmalıdır, bu nedenle bir tam sayıya dönüştürün, 1 çıkarın ve tekrar bir dizgeye dönüştürün.

Düzenleme: @cole sayesinde -1 bayt.


Bu 51 bayt için çalışıyor mu ?
cole

@cole: evet öyle. Teşekkürler!
nimi

1

Jöle , 13 bayt

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

Çevrimiçi deneyin!

Jonathan Allan tarafından akıllıca bir düzeltme .

Not: Bu tam bir program değildir, TIO üstbilgisi işlevi test etmek için bir komut satırı bağımsız değişkeni kullanarak giriş yapmayı mümkün kılar.


Girişteki negatiflerle (veya chr aralığında) çalışmaz. ®i‘ị®µ’e?€Øa©sıfır için bir düzeltme olduğunu düşünüyorum.
Jonathan Allan

@JonathanAllan Hah, bu durumda tam olarak işe yaramadığını unuttum . İronik, girişteki s'yi ~açıklamak için koşul olarak kullanmaktan kaçındım -1... Ayrıca, nasıl kısaltacağım ®i‘ị®...
Erik Outgolfer

1

C ++ 17 (gcc) , 120 bayt

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

İşte fgerekli fonksiyon; lhem giriş hem de çıkış parametresidir ve bununla uyumlu std::variant<char, int>veya tam tersi bir nesne kabı olması beklenir .

Çevrimiçi deneyin!



1

K (ok) , 27 bayt

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

Çevrimiçi deneyin!

-8 ngn ve dzaima sayesinde :)


1
{$[-9=@x;x-1;90=x;"A";`c$1+x]}'Özel durumda satır içi ve büyük harf kullanan 31 bayt (ve 'girdi bir liste olarak sayılmalıdır)
dzaima

@scrawl dzaima doğru olduğunu düşünüyorum - 'sayılmalıdır. burada ihtiyaç duymayan 've aynı zamanda "z" -> "a" ile ilgilenen biraz daha uzun bir ifade :{`c`i[t]$(-26*x~'"z")+x+1-2*t:x~'0+x}
ngn

hatta daha iyi - projeksiyonlar bir listesini yapmak ve onları birlikte uygulanır @': {(`c$97+26!-96+;-1+)[x~'0+x]@'x}. burada -96(+ 1 eksi "a" ascii kodu) 8mod 26 alındığı gibi değiştirilebilir .
ngn

büyük harf seçerek başka bir -1 bayt:{(`c$65+26!14+;-1+)[x=_x]@'x}
ngn

@dzaima sizinki kısaltılabilir -9=@x->x=_x
ngn

0

Runik Efsunlar , 36 bayt

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

Çevrimiçi deneyin!

Genel işlem girdiyi okumak, başına 0 (dize zorlama) eklemek, sayıya geri dönüştürmek (tek karakter her zaman -1 döndürür), girdi ile karşılaştırmaktır. Aynı ise, sayısal bir değer olmalı, 1 çıkarın ve yazdırın. Aynı değilse, bir char olmalı, 1 çıkarın, ile karşılaştırın {. Şundan küçükse, yazdırın, aksi takdirde değiştirina ve yazdırın.

Program bir yığın düşük akışı gerçekleştirene kadar tekrarlayın.

Çıktı ile ayrılır ; 1 bayt kaydetmek için ile (ve sonda bir tane vardır). Girdi boşlukla ayrılmıştır.


0

Stax , 17 bayt

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

Çalıştır ve hata ayıkla

Bu, daha kısa yapılması mümkün gibi görünüyor, ancak son sürümden itibaren yeni bir stax özelliği kullanma fırsatına dayanamıyorum.

Tüm girdiye dize olarak davranma:

  1. Regex basamakların yerini eval(match) - 1 . Normal ifade bloğunun değiştirilmesi bir dize değil bir tamsayı olduğu için bu yeni özelliktir.
  2. Regex, harfleri küçük harfli alfabe etrafında halka çevirerek değiştirir.

0

Python 3, 66 bayt

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

Düzenle:

Şimdiye kadar Jitse'nin çözümünü görmedim. Eğer hile ''! = İ * 0 harika!


0

C #, 148 bayt

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

Bağlantı linki

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

Kömür , 16 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. STDIN üzerinde giriş alır, her satır tek bir küçük harf veya bir tamsayıdır ve STDOUT üzerinde ayrı satırlardan çıkar. Açıklama:

WS

Boş bir satıra ulaşılana kadar STDIN'den tekrar tekrar girin.

Bu ifade çıktısını kendi satırında yapın.

⎇№βι

Bu önceden tanımlanmış küçük harf alfabesinin bir alt dizisi mi?

§β⊕⌕βι

Öyleyse, döngüsel olarak dizine eklenen bir sonraki harfi yazdırın.

I⊖ι

Aksi takdirde değeri azaltın ve örtük yazdırma için dizeye geri aktarın.


0

Zsh , 47 bayt

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

Çevrimiçi deneyin!

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 bayt

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

Çevrimiçi deneyin!

Girdi, NULLsonlandırılmış bir dizidir'\0' , ör.{"a", "b", "c", "17", NULL} .

@Ceilingcat sayesinde -7 bayt


0

Perl 6 , 31 bayt

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

Çevrimiçi deneyin!

Listesi ve ondan bir tane çıkarma girişimlerine karşı her bir elemanını Anonim neyse lambda, aksi bunu artırma ve bu durumda ilk karakteri alarak ztamamladı üzerinde etmek aa.


0

T-SQL 2012, 61 bayt

Girdi için büyük harfler gerekli.

Girdi olarak tablo değişkenini kullanma.

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

Çevrimiçi deneyin


0

SimpleTemplate, 80 bayt

Bu benim yaptığım bir dilde yazılmıştı.

Derleyicideki sınırlamalar nedeniyle, artık azaltamam.

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

Ve şimdi, ungolfed:

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

Ve açıklama:

  • {@each argv as value}- içindeki tüm değerler arasında geçiş yapar argv. ( argviletilen tüm bağımsız değişkenleri içerir).
    Eğer as <var>mevcut değilse, varsayılan _değişken kabul edilir.
  • {@if value is matches "@\d+@"}- valuenormal ifadeyle eşleşen kontroller "@\d+@".
  • {@inc by -1 value} - değeri -1 arttırır (temel olarak bir azalma).
  • {@echo value, "\n"}ve {@echol_}- echoliletilen değerleri verir ve sonuna bir satır ekler.
  • {@else} - açıklayıcı
  • {@inc by 1 value}- değeri 1 artırır. Eğer by <value>eksikse, 1 olduğu varsayılır.
  • {@echo value.0, "\n"}ve {@echol_.0}- echoliletilen değerleri verir ve sonuna bir satır ekler.
    Bunun nedeni zorluk kuralları gereklidir: z wraps to a.
    Bir zaman @incbir ipe kullanılan o vurur kez, o karakter artırır ve zbunun için sarar,aa .
    İlk karakterin çıktısı, 7 baytlık maliyetle zorluğu tatmin eder.
  • {@/} - kapatır {@else}yukarıdakileri (isteğe bağlı).
  • {@/}- {@each}yukarıdakileri kapatır (isteğe bağlı).

Bunu aşağıdakileri deneyebilirsiniz: http://sandbox.onlinephpfunctions.com/code/7533641a0aa1fc8bf4699a9c758690de186b052f

Her geçilen argüman render(), dikkate alınan yeni bir değer olacaktır.


-1

Perl, 64 bayt

foreach (@ARGV){$_=~m/[a-zA-Z]/?++$_:--$_;print substr $_,0,1;}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.