Liczby maleją, a litery rosną

18

Losowo zainspirowany liczbami Zwiększaj, a zmniejszając litery

Biorąc pod uwagę listę mieszanych liter i liczb całkowitych (np. ['a', 2, 3, 'b']), Zwiększ litery o jedną pozycję w alfabecie (zawijaj zdo a) i zmniejsz cyfry o 1. W powyższym przykładzie wynik powinien być ['b', 1, 2, 'c'].

  • Dane wejściowe mogą być listą typu mieszanego, ciągiem rozdzielanym, listą ciągów itp.
  • zowija się a, ale 1idzie do 0i 0idzie do -1itp.
  • Dane wejściowe zawsze będą [a-z]i liczbami całkowitymi. Możesz wybrać duże litery [A-Z]jako dane wejściowe, jeśli jest to dla ciebie łatwiejsze.
  • Wejście jest gwarantowane jako niepuste.
  • Dane wejściowe mogą zawierać tylko cyfry lub tylko litery.

Przykłady:

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]

Zasady i wyjaśnienia

  • Dane wejściowe i wyjściowe można podać dowolną dogodną metodą .
  • Możesz wydrukować wynik do STDOUT lub zwrócić go jako wynik funkcji.
  • Dane wyjściowe nie muszą mieć tego samego formatu co dane wejściowe (np. Dane wejściowe można traktować jako ciąg znaków, a dane wyjściowe jako listę).
  • Dopuszczalny jest pełny program lub funkcja.
  • Jeśli dotyczy, możesz założyć, że liczby całkowite wejścia / wyjścia pasują do natywnego intzakresu twojego języka .
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
AdmBorkBork
źródło
1
Jeśli liczba jest równa Integer.MinValue lub jakakolwiek najniższa wartość podpisanej liczby całkowitej w moim języku, czy powinienem zaniżać wartość do Integer.maxValue, czy też powinienem kontynuować odliczanie?
Nzall
1
@Nzall Niezdefiniowane zachowanie. Piąty punkt w części Reguły i objaśnienia określa, że ​​wejściowe i wyjściowe liczby całkowite pasują do natywnego intzakresu języków , więc nigdy nie dostaniesz Integer.MinValuedanych wejściowych.
AdmBorkBork

Odpowiedzi:

6

05AB1E , 5 bajtów

<AAÀ‡

Wypróbuj online!

<          # decrement the numbers
 A         # constant "abcdefghijklmnopqrstuvwxyz"
  AÀ       # same, but rotated left ("bcd...yza")
    ‡      # transliterate
Ponury
źródło
5

Python 3 , 59 bajtów

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

Wypróbuj online!

-1 bajt dzięki Erik the Outgolfer

Jitse
źródło
1
57 bajtów .
Erik the Outgolfer
@EriktheOutgolfer integer vs. string string wydaje się nie działać w twoim rozwiązaniu.
Jitse
No tak, potrzebujesz do tego Python 2.
Erik the Outgolfer
Ach tak, to wydaje się działać. Nadal wymiana -96z +8oszczędza bajt.
Jitse
''!=i*0jest o trzy bajty krótszy od mojej str(i)>'9'dobrej roboty
Black Owl Kai
5

Perl 5 (-p), 17 bajtów

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

Wypróbuj online!

Dodatkowy 19-bajtowy:

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

TIO . Ten zawiera kilka fajnych sztuczek, ale nie jest w stanie pokonać powyższego prostego rozwiązania.

Ponury
źródło
5

Rubinowy , 34 bajty

Dla każdego elementu spróbuj zwrócić element -1. Ciągi nie mogą tego zrobić, więc popełniają błąd i są odbierane przez rescueklauzulę, która zamiast tego wzywa succją do zwrócenia następnej litery w alfabecie. succ„przewraca” zi wraca aa, więc po prostu bierzemy pierwszy znak ze zwróconego ciągu.

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

Wypróbuj online!

Wartość tuszu
źródło
3

Python 3 , 182 130 118 bajtów

-51 bajty dzięki @AdmBorkBork i @Black Sowa Kai -1 bajt dzięki @Black Sowa Kai -12 bajtów, zastępując .append()w +=[]i zastępując n+1z-~n

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

Wypróbuj online!

Zrobiłem to, gdy pytanie znajdowało się w piaskownicy, ale do tej pory nie widziałem tego. : P

Nie golfił

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

Wyjaśnienie

Dla każdego elementu na wprowadzonej liście xpróbuje odjąć 1 i dodać go do ostatecznie zwróconej listy. Jeśli wystąpi błąd (ponieważ element jest łańcuchem), indeks litery w alfabecie jest dodawany przez 1 i ten mod 26 jest brany. Mod 26 zawija indeks 26 z powrotem do 0.

asdf60367134
źródło
Witamy w CodeGolf SE! Nie jestem ekspertem w Pythonie, ale myślę, że możesz zamienić 4 spacje na tabulatory, aby zaoszczędzić sporo bajtów.
AdmBorkBork
Dostałem go do 131 bajtów po prostu przez wyeliminowanie białych znaków. Kolejny bajt można zagrać w golfa, uświadamiając sobie, że (x+27)%26ma ten sam wynik co(x+1)%26
Black Owl Kai
@AdmBorkBork BlackOwlKai Dziękujemy za pomoc! Zredagowałem post.
asdf60367134
Możesz użyć trójki, str(d)==daby sprawdzić, czy jest to ciąg znaków, czy nie, zamiast polegać na try / else. Następnie, ponieważ nie musisz już próbować / z wyjątkiem, możesz to wszystko zrobić na liście! Pozwól, że pomyślę o tym trochę więcej, ale w ten sposób możesz łatwo uzyskać mniej niż 100 bajtów;)
Value Ink
89 bajtów
wartość tuszu
2

Gema , 55 znaków

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

Brudne rozwiązanie. Zawijanie przyrostów liter jest bolesnie długie, więc otrzymałem osobną zasadę.

Dane wejściowe mogą być dowolne, wystarczy użyć separatorów. (Możesz nawet pominąć separatory między cyframi i literami. Przy cenie 1 znaku za zamianę <L1>możesz również pominąć separatory między literami.)

Przykładowy przebieg:

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

Wypróbuj online!

Gema, 66 znaków

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

Czyste rozwiązanie. Połowa względnie wydajna, a następnie połowa czystego bólu.

Przykładowy przebieg:

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

Wypróbuj online!

człowiek w pracy
źródło
2

R , 77 85 bajtów

Dzięki @Giuseppe za okropne 8 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe jako listę. Po dużej zmianie dokonanej przez @Giuseppe, służy to Mapdo zastosowania funkcji do listy. Wykorzystuje się matchdo testowania postaci. Podczas testu rozszerzona lista liter i indeks są zapisywane do zwrotu.

MickyT
źródło
Przypuszczam, charactere nie są skończone, ponieważ są one oddane do numericprzez is.finite, a zatem są NA?
Giuseppe
@Giuseppe pomyślał, że będzie to coś w tym stylu. Mimo że to te same bajty co is.double, musiałem go użyć :)
MickyT
77 bajtów ?
Giuseppe,
przepraszam, że się ciebie pozbyłem is.finite, myślałem, że sam się tym zajmę
Giuseppe
1
@Giuseppe bardzo ładne, nie pomyślałby o Mapa match. Dobrze jest uczyć się każdego dnia :)
MickyT
2

MathGolf , 14 bajtów

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

Wypróbuj online!

Traktuje literę jako małe litery.

Wyjaśnienie

▄\╧              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
źródło
2

Siatkówka , 52 50 48 58 41 37 bajtów

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

-4 bajty dzięki @FryAmTheEggman (i za wzmiankę, że miałem błąd: 1 → -1zamiast 1 → 0).
+10 bajtów, aby naprawić błąd z 1i 0.. Taka irytująca skrzynka, która mnie spieprzyła przez dłuższy czas .. Ale grałem w golfa do 41 bajtów. (Teraz jestem ciekaw <40 bajtów wersjach @Neil i @CowsQuack wymienionych w komentarzach .. Dzięki @Neil za cynk przekształcania 0się -i po raz pierwszy do czynienia z wartościami ujemnymi. Konwersja te z powrotem z jednoskładnikowa do liczby całkowitej bardzo mi pomogło.)
Najwyraźniej nie potrzebuję granic w tym momencie, więc -4 bajty ..>.>

We / wy jest oddzielone przecinkami.

Wypróbuj online.

Wyjaśnienie:

Przetłumacz wszystko "zabcdefghijklmnopqrstuvwxy(z)"na "abcdefghijklmnopqrstuvwxyz":

T`zl`l

Zamień wszystkie samodzielne 0na -:

\b0
-

Konwertuj wszystkie liczby na unary, zastępując je taką liczbą znaków podkreślenia:

\d+
*

Dla wszystkich wartości ujemnych, za którymi znajduje się zero lub więcej linii jednoargumentowych: zachowaj znak minus i uzyskaj całkowitą długość tego dopasowania (łącznie z -), przekonwertowaną z powrotem na liczbę całkowitą:

-_*
-$.0

Co do dodatnich liczb całkowitych: dopasuj dodatnią liczbę całkowitą, dopasowując pojedynczą linię jednoargumentową, a następnie zero lub więcej linii jednoargumentowych. A następnie zamień je na długość tej grupy przechwytywania, aby usunąć tę pojedynczą linię jednoargumentową i przekonwertować je z powrotem na liczby całkowite jednocześnie:

_(_*)
$.1
Kevin Cruijssen
źródło
1

SNOBOL4 (CSNOBOL4) , 103 bajty

	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

Wypróbuj online!

Giuseppe
źródło
1

PHP , 50 bajtów

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

Wypróbuj online!

Testy

Wypisuje litery / liczby całkowite oddzielone _separatorem końcowym.

W PHP możesz zwiększać litery bezpośrednio, więc skorzystałem z tego. Ale zjest zwiększany aa, aby go przekonwertować a, (++$a)[0]jest używany, który wypisuje tylko pierwszy znak zwiększonej wartości.

Noc 2
źródło
1

Japt -m , 13 12 bajtów

-1 bajt dzięki Shaggy

;¤?UÉ:Cg8+Uc

Spróbuj

Wyjaśnienie:

;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

Uwaga : ;zmienia Csię w małe litery

Oliver
źródło
To nie wygląda jak okłady z tego zdo a.
Kudłaty
@Shaggy Whoops, tęskniłem za tym. Dodałem tymczasową poprawkę dla +2 bajtów
Oliver
Nie udało mi się znaleźć sposobu na naprawienie mojego (jeszcze) bez trójki, co czyni go zbyt podobnym do twojego, jak na mój gust, więc na razie usuwam. o-> ¤uratuje ci bajt tutaj.
Kudłaty
1
+2i -1dzięki Shaggy byłby dokładniejszy! : D
Shaggy
1
@Shaggy Było +2to dzięki Oliverowi: P
Oliver
1

Haskell, 52 51 bajtów

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

Ponieważ Haskell nie zezwala na listy typów mieszanych, litery i cyfry są pobierane i zwracane jako ciągi znaków.

Wypróbuj online!

Sprawdź każdy element listy: jeśli ciąg jest "z", zwróć "a"; jeśli pierwszym znakiem ciągu jest> '`'(tj. litera, a nie cyfra), zwróć następcę znaku (ów) w ciągu; w przeciwnym razie musi być liczbą, więc przekonwertuj na liczbę całkowitą, odejmij 1 i ponownie zamień na ciąg.

Edycja: -1 bajt dzięki @cole.

nimi
źródło
Czy to działa na 51 bajtów?
cole
@cole: tak. Dzięki!
nimi
1

Galaretka , 13 bajtów

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

Wypróbuj online!

Sprytna poprawka autorstwa Jonathana Allana .

Uwaga: To nie jest pełny program, stopka nad TIO umożliwia wprowadzanie danych za pomocą argumentu wiersza poleceń w celu przetestowania funkcji.

Erik the Outgolfer
źródło
Nie będzie działać z negatywami na wejściu (lub poza zakresem chr). ®i‘ị®µ’e?€Øa©to poprawka na zero.
Jonathan Allan
@JonathanAllan Hah, zapomniałem, że to nie działa w tym przypadku. Ironiczne, ponieważ unikałem używania ~jako warunku do uwzględnienia -1s na wejściu ... Ponadto, jak mam skrócić ®i‘ị®...
Erik Outgolfer
1

C ++ 17 (gcc) , 120 bajtów

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

Oto fwymagana funkcja; ljest zarówno parametrem wejściowym, jak i wyjściowym, i oczekuje się, że będzie to kontener obiektów, które są kompatybilne std::variant<char, int>lub odwrotnie.

Wypróbuj online!

Daniel Schepler
źródło
1

dzaima / APL, 21 20 bajtów

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

Wypróbuj online!

-1 dzięki ngn.

dzaima
źródło
(⎕l⍳⍵)⊇1⌽⎕l->⎕l(⍳⊇1⌽⊣)⍵
ngn
1

K (oK) , 27 bajtów

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

Wypróbuj online!

-8 dzięki ngn i dzaima :)

bazgranina
źródło
1
31 bajtów {$[-9=@x;x-1;90=x;"A";`c$1+x]}'wstawianych do specjalnego przypadku i przy użyciu wielkich liter (i 'należy je liczyć jako dane wejściowe powinna być listą)
dzaima
@scrawl i myślę, że dzaima ma rację - 'należy to policzyć. oto nieco dłuższe wyrażenie, które nie potrzebuje 'i zajmuje się również „z” -> „a”:{`c`i[t]$(-26*x~'"z")+x+1-2*t:x~'0+x}
ngn
albo jeszcze lepiej - zrobić listę prognoz i stosować je z @': {(`c$97+26!-96+;-1+)[x~'0+x]@'x}. tutaj -96(czyli +1 minus kod ascii z „a”) można zastąpić 8pobranym modem 26.
ngn
kolejny -1 bajt, wybierając wielkie litery:{(`c$65+26!14+;-1+)[x=_x]@'x}
ngn
@dzaima twój może zostać skrócony przez -9=@x->x=_x
ngn
0

Runiczne Zaklęcia , 36 bajtów

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

Wypróbuj online!

Ogólny proces polega na czytaniu danych wejściowych, dodawaniu zera (przymus na ciąg), konwertowaniu z powrotem na liczbę (pojedynczy znak zawsze zwraca -1), porównywanie z danymi wejściowymi. Jeśli to samo, musi to być wartość liczbowa, odejmij 1 i wydrukuj. Jeśli nie to samo, musi to być znak, odejmij 1, porównaj z {. Jeśli mniej niż, wydrukuj, w przeciwnym razie zamień na ai wydrukuj.

Powtarzaj, aż program wykona niedopełnienie stosu.

Wyjście jest oddzielone ;, aby zaoszczędzić 1 bajt (i ma jeden końcowy). Dane wejściowe są oddzielone spacją.

Draco18s
źródło
0

Stax , 17 bajtów

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

Uruchom i debuguj

Wydaje mi się, że powinno być możliwe zrobienie tego krócej, ale nie mogę się oprzeć możliwości skorzystania z nowej funkcji stax z ostatniego wydania.

Traktując cały wkład jako ciąg:

  1. Regex zamień ciąg cyfr na eval(match) - 1. Jest to nowa funkcja, ponieważ zamiana bloku wyrażenia regularnego nie jest ciągiem, ale liczbą całkowitą.
  2. Regex zastępuje ciąg liter, tłumacząc je pierścieniowo wokół małego alfabetu.
rekurencyjny
źródło
0

Python 3, 66 bajtów

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

Edytować:

Do tej pory nie widziałem rozwiązania Jitse. Sztuczka if ''! = I * 0 jest niesamowita!

Jose Alejandro Galisteo Callej
źródło
0

C #, 148 bajtów

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

Link Repl.it

Nie golfowany:

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
źródło
0

Węgiel drzewny , 16 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Pobiera dane wejściowe na STDIN, przy czym każdy wiersz jest albo jedną małą literą, albo liczbą całkowitą, i wysyła na osobnych wierszach na STDOUT. Wyjaśnienie:

WS

Wielokrotnie wprowadzaj dane ze STDIN, aż do osiągnięcia pustej linii.

Wykonaj to wyrażenie we własnej linii.

⎇№βι

Czy jest to podciąg predefiniowanego małego alfabetu?

§β⊕⌕βι

Jeśli tak, wydrukuj następną literę indeksowaną cyklicznie.

I⊖ι

W przeciwnym razie zmniejsz wartość i rzutuj ponownie na ciąg znaków w celu wydrukowania niejawnego.

Neil
źródło
0

Zsh , 47 bajtów

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

Wypróbuj 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
Funkcja Gamma
źródło
0

C (gcc) , 93 86 bajtów

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

Wypróbuj online!

Dane wejściowe to NULL-terminated tablica '\0'-terminated string, np {"a", "b", "c", "17", NULL}.

-7 bajtów dzięki @ceilingcat

Leo Tenenbaum
źródło
0

Perl 6 , 31 bajtów

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

Wypróbuj online!

Anonimowy Jakakolwiek lambda, która mapuje każdy element na listę i próbuje odjąć jeden z niego, w przeciwnym razie zwiększając go i biorąc pierwszy znak w przypadku, który się zzawija aa.

Jo King
źródło
0

T-SQL 2012, 61 bajtów

Wymagane są duże litery.

Wykorzystanie zmiennej tabeli jako danych wejściowych.

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

Wypróbuj online

t-clausen.dk
źródło
0

SimpleTemplate, 80 bajtów

Zostało to napisane w języku, który stworzyłem.

Ze względu na ograniczenia w kompilatorze nie mogę już go zmniejszyć.

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

A teraz bez golfa:

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

I wyjaśnienie:

  • {@each argv as value}- zapętla wszystkie wartości w argv. ( argvzawiera wszystkie przekazane argumenty).
    Jeśli as <var>nie jest obecny, _zakłada się zmienną domyślną .
  • {@if value is matches "@\d+@"}- sprawdza, czy valuepasuje do wyrażenia regularnego "@\d+@".
  • {@inc by -1 value} - zwiększa wartość o -1 (w zasadzie zmniejszenie).
  • {@echo value, "\n"}oraz {@echol_}- echolwyświetla przekazane wartości i dołącza wiersz na końcu.
  • {@else} - oczywiste
  • {@inc by 1 value}- zwiększa wartość o 1. Jeżeli by <value>brakuje, przyjmuje się, że wynosi 1.
  • {@echo value.0, "\n"}oraz {@echol_.0}- echolwyświetla przekazane wartości i dołącza wiersz na końcu.
    Jest to konieczne ze względu na przepisy wyzwanie: z wraps to a.
    Kiedy @incciąg znaków jest używany, zwiększa znaki i po trafieniu zzawija się aa.
    Wyprowadzenie pierwszego znaku spełnia wyzwanie kosztem 7 bajtów.
  • {@/}- zamyka {@else}powyższe (opcjonalnie).
  • {@/}- zamyka {@each}powyższe (opcjonalnie).

Możesz spróbować na: http://sandbox.onlinephpfunctions.com/code/7533641a0aa1fc8bf4699a9c758690de186b052f

Każdy przekazany argument render()będzie nową wartością, która jest brana pod uwagę.

Ismael Miguel
źródło
-1

Perl, 64 bajty

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