Konwertuj liczby na litery i odwrotnie w ciągu

12

Na podstawie listy liczb i odpowiadających im liter wprowadź ciąg znaków, zamień znaki tego ciągu na równoważną liczbę / literę i wyślij wynik.

Lista

  • 1 = a
  • 2 = b
  • 3 = c
  • 4 = d
  • 5 = e
  • 6 = f
  • 7 = g
  • 8 = godz
  • 9 = i
  • 0 = j

Wejście

thisisastring1124

Wynik

t89s9s1str9n7aabd

Zasady

  • Liczby są równoważne tylko małym literom.
  • Każda postać spoza listy pozostanie bez zmian.
  • Łańcuch wejściowy nie może zawierać spacji.
  • Dozwolony jest pełny program lub funkcja.
  • Ponieważ jest to gra w golfa, wygrywa najmniej bajtów.
Noir Antares
źródło
2
Witamy w PPCG. Niezłe wyzwanie!
Adám
2
Czy zamiast tego możemy zamieniać wielkie litery?
Adám
Tylko małe litery, wielkie litery byłyby poza zakresem listy.
Noir Antares
Czy dane wejściowe będą zawierały tylko litery i cyfry, czy mogą zawierać inne znaki spacji (np. Interpunkcję)?
sundar - Przywróć Monikę
Ciąg wejściowy może zawierać dowolny inny znak oprócz spacji, ale wszystko poza listą pozostanie nietknięte w ciągu wyjściowym.
Noir Antares,

Odpowiedzi:

14

bash, 18 bajtów

tr 1-90a-j a-j1-90

Wypróbuj online!

Klamka
źródło
Jak to bierze wejście / wyjście? standardowe i standardowe?
Pozew Fund Moniki w dniu
@NicHartley Tak.
Klamka
10

Python 3 , 76 68 bajtów

lambda w:w.translate(dict(zip(s,s[::-1])))
s=b'1234567890jihgfedcba'

Wypróbuj online!

ovs
źródło
6

05AB1E , 13 9 bajtów

žmÁAT£J‡

Wypróbuj online!

Wyjaśnienie

žmÁ         # push 0987654321
   AT£      # push abcdefghij
      J     # join strings
       Â    # bifurcate
        ‡   # transliterate
Emigna
źródło
6

Perl 6 , 45 23 bajtów

tr/1..90a..j/a..j1..90/

Wypróbuj online!

Po prostu regex transliteracji.

Jo King
źródło
1
Użycie TR byłoby krótsze tutaj, również nie musisz oddzielać wszystkich tych części sekwencji: TR/1..90a..j/a..j1..90/ tio.run
Phil H
@PhilH Ha, dosłownie szukałem tego operatora! Dzięki!
Jo King
5

Retina 0.8.2 , 12 bajtów

T`a-j09-1`Ro

Wypróbuj online! Wyjaśnienie:

T``

Wykonaj transliterację.

a-j09-1

Lista źródłowa to litery a-j, a 0następnie cyfry 9-1.

Ro

Lista docelowa to odwrócona lista źródłowa, tzn. Cyfry 1-9, a 0następnie litery j-a.

Neil
źródło
3

Python 2 , 82 78 bajtów

lambda i,l='1234567890jihgfedcba':''.join((x,l[~l.find(x)])[x in l]for x in i)

Wypróbuj online!

-4 dzięki dzięki @ovs

ElPedro
źródło
3

JavaScript (ES6), 66 bajtów

s=>s.replace(e=/[1a2b3c4d5e6f7g8h9i0j]/g,c=>e[e.search(c)^1],e+=e)

Wypróbuj online!

Arnauld
źródło
3

R , 40 bajtów

function(s)chartr("0-9ja-i","ja-i0-9",s)

Wypróbuj online!

Zaskakujące jest, że R jest przyzwoity w tego rodzaju wyzwaniach , ponieważ ma trpodobną funkcję jak w odpowiedzi Bash . Nie mam pojęcia, dlaczego istnieje, ale jestem za to wdzięczny!

Giuseppe
źródło
Niesamowity! Nie wiedziałem, że chartr () rozumie regex.
snoram
@ snoram nie całkiem regex; określa w dokumentacji, że „Zakresy są obsługiwane w specyfikacjach, ale klasy znaków i powtarzane znaki nie są”.
Giuseppe,
3

MS-SQL, 71 bajtów

SELECT TRANSLATE(v,'1234567890abcdefghij','abcdefghij1234567890')FROM t

Nowa funkcja SQL 2017 TRANSLATEwykonuje zamianę pojedynczych znaków, dlatego idealnie nadaje się do tego celu. Zobacz moją podobną odpowiedź w poprzednim wyzwaniu .

Dane wejściowe pochodzą z wcześniej istniejącej tabeli t z kolumną varchar v , zgodnie z naszymi regułami IO . Aby zastąpić tylko małe litery, tabelę należy utworzyć za pomocą sortowania z rozróżnianiem wielkości liter :

CREATE TABLE t(v varchar(max) COLLATE Latin1_General_CS_AS)
BradC
źródło
2

Pyth , 13 bajtów

Xz+jk+0_S9<GT

Wypróbuj tutaj!

Wyjaśnienie

Xz+jk+0_S9<GT – Full program.
       _S9    – Yield [9, 8, 7, ..., 1]
     +0       – Prepend a 0.
   jk         – Join to a single string.
  +       <GT – And append the first 10 letters of the alphabet to it.
                Yields 0987654321abcdefghij.
Xz            – Transliterates the input from the above to the above reversed.
Pan Xcoder
źródło
2

Haskell , 80 66 bajtów

map(!"1a2b3c4d5e6f7g8h9i0j")
e!(a:b:y)|e==a=b|e==b=a|1<2=e!y
e!_=e

Wypróbuj online!

ovs
źródło
1

REXX, 57 bajtów

#=1234567890
a='abcdefghij'
say translate(arg(1),a #,# a)
idrougge
źródło
1

C (gcc) , 81 72 bajtów

Dzięki Giacomo Garabello za sugestie.

f(char*s){for(;*s++=*s-97U<11?(*s-6)%10+48:*s-48U<11?(*s-9)%10+97:*s;);}

Wypróbuj online!

ErikF
źródło
Można usunąć 6 znaków zmieniając ciąg wejściowy zamiast wydrukować putchar(...)-> *s=...a pozostałe 4 zastępując *s-48U<11z *s<59 Wypróbuj online!
Giacomo Garabello,
@GiacomoGarabello *s<59psuje się, jeśli takie znaki $są na wejściu, dlatego zrobiłem *s-48U([0..47] staje się [-48 ..- 1], co staje się dużą wartością bez znaku). Ponieważ pytanie nie określało, czy nie -alnum były ważne, poszedłem z bardziej konserwatywną interpretacją.
ErikF,
Słusznie. OP skomentował niedawno, że każda inna postać jest poprawna, ale nie spacja. Ale nadal możesz skorzystać z mojej pierwszej sugestii
Giacomo Garabello
1

PowerShell, 94 bajty

-join($args|% t*y|%{if(1+($p=($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_))){$s[$p-bxor1]}else{$_}})

Skrypt testowy:

$f = {
-join($args|% t*y|%{if(1+($p=($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_))){$s[$p-bxor1]}else{$_}})
}

&$f "thisisastring1124"

Wyjaśnienie

  • $args - ciągi argumentów
  • $args|% t*y- rozwija się do |ForEach-Object -Method ToCharArrayekwiwalentu"$args".ToCharArray()
  • ($s='1a2b3c4d5e6f7g8h9i0j').IndexOf($_)- znajdź znak w ciągu, zwraca pozycję lub -1, jeśli nie zostanie znaleziony. Niech $ s przechowuje ciąg zawierający sparowany znak na pozycjach sąsiadów, które różnią się ostatnim bitem: 0 + 1, 2 + 3, 4 + 5 ....
  • if(1+($p=...)) - jeśli pozycja została znaleziona
  • $p-bxor1 - bit pozycji xor 1
mazzy
źródło
Niezła sztuczka z -bxor1.
AdmBorkBork,
0

R , 107 bajtów

function(s){a=utf8ToInt(s);l=a>96&a<107;n=a>47&a<58;a[n]=(a[n]-9)%%10+97;a[l]=(a[l]+4)%%10+48;intToUtf8(a)}

Wypróbuj online!

Pierwsza próba, zdecydowanie możliwa do ulepszenia ...

digEmAll
źródło
chartrmyślę, że jest tu twój przyjaciel.
Giuseppe
1
@Giuseppe: awesome! Nie wiedziałem o funkcji Chartr. Prześlij go jako odpowiedź, podejście jest zupełnie inne;)
digEmAll
0

Rdza , 96 bajtów

|x|x.bytes().map(|x|match
x{49..=57=>x+48,97..=105=>x-48,48=>106,106=>48,x=>x}as
char).collect()

Wypróbuj online!

Nie jest bezpieczny dla Unicode, gdyby był, byłby jeszcze dłuższy.

Konrad Borowski
źródło
0

K4 , 38 bajtów

Rozwiązanie:

{(,/|x,a)(,/a:0 1_'10 11#'.Q`a`n)?x}@'

Wyjaśnienie:

Wyszukaj każdy znak na liście, "abcdefghij1234567890"a następnie indeksuj na liście, na "1234567890abcdefghijX"której Xznajduje się oryginalny znak.

Musisz znaleźć krótszy sposób na zbudowanie ciągów ...

{(,/|x,a)(,/a:0 1_'10 11#'.Q`a`n)?x}@'
{                                  }@' / apply (@) lambda {} to each (')
                                 ?x    / lookup x in
         (                      )      / do this together
                          .Q`a`n       / index into .Q with a (gives a-z) and n (gives 0-9)
                   10 11#'             / take 10 from first list and 11 from second list
              0 1_'                    / drop 0 from first list and 1 from second list
            a:                         / save as a
          ,/                           / flatten
 (      )                              / do this together
     x,a                               / prepend x to a
    |                                  / reverse it
  ,/                                   / flatten

Premia:

Inne rozwiązanie dla 38 bajtów :

{(a,b,x)?[(b:1_11#.Q.n),a:10#.Q.a]x}@'
streetster
źródło
0

Yabasic , 135 bajtów

Pobiera dane wejściowe z konsoli i dane wyjściowe do konsoli.

Input""s$
For i=1To Len(s$)
c$=Mid$(s$,i,1)
n=asc(c$)-96
If-38>n Then?chr$(143+n+11^(n=-48));ElsIf n<11Then?n*(10>n),"";Else?c$;Fi
Next

Wypróbuj online!

Taylor Scott
źródło
0

Japt , 44 42 bajty

V=1oA q +0+"jihgfedcba"Um@W=VaX)¦É?Vw gW:X

Wypróbuj online!

Bejofo
źródło
0

sed, 44 bajty

y/1234567890abcdefghij/abcdefghij1234567890/

Trochę nudno, przyznaję.

Testowanie:

$ echo 'thisisastring1124' | sed 'y/1234567890abcdefghij/abcdefghij1234567890/'
t89s9s1str9n7aabd
Kusalananda
źródło