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.

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:






6

Perl 6 , 45 23 bajtów

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

Wypróbuj online!

Po prostu regex transliteracji.


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.





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!


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)


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.


1

REXX, 57 bajtów

#=1234567890
a='abcdefghij'
say translate(arg(1),a #,# a)

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!


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

Niezła sztuczka z -bxor1.
AdmBorkBork,


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.


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}@'

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!



0

sed, 44 bajty

y/1234567890abcdefghij/abcdefghij1234567890/

Trochę nudno, przyznaję.

Testowanie:

$ echo 'thisisastring1124' | sed 'y/1234567890abcdefghij/abcdefghij1234567890/'
t89s9s1str9n7aabd
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.