Zamień cyfry na odpowiednią literę

23

Utwórz funkcję lub program, który pobiera liczbę jako dane wejściowe i wyprowadza ciąg, w którym punkty kodu ASCII dla małych i wielkich liter są zastępowane ich odpowiednikami znakowymi.

  • Wielkie litery alfabetu używają punktów kodowych: 65-90
  • Małe litery alfabetu używają punktów kodowych: 97-122

Jeżeli jakiekolwiek sąsiadujące cyfry na wejściu są równe punktowi kodowemu litery, wówczas litera ta zastępuje cyfry w ciągu wyjściowym.

Zasady:

  • Wejście będzie dodatnią liczbą całkowitą zawierającą od 1 do 99 cyfr
  • Możesz założyć, że podano tylko prawidłowe dane wejściowe
  • Zaczynasz podstawiać na początku liczby całkowitej ( 976-> a6, nie 9L)
  • Dane wejściowe mogą mieć dowolny odpowiedni format (ciąg znaków jest w porządku)
  • Dane wyjściowe mogą być w dowolnym odpowiednim formacie
  • Obowiązują standardowe zasady

Przykłady:

1234567
12345C

3456789
345CY

9865432
bA432

6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ

6711110010100071111108102
Code000Golf

Najkrótszy kod w bajtach wygrywa!


Tabela liderów

Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań według języka oraz b) jako ogólnej tabeli wyników.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

## Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Stewie Griffin
źródło
2
„Dane wejściowe będą dodatnimi liczbami całkowitymi od 1 do 99 cyfr” W prawie każdym języku programowania, który znam, będzie to ciąg znaków od 1 do 99 cyfr, ponieważ nawet 64-bitowa liczba int zawiera maksymalnie 19 miejsc po przecinku cyfry ...
TJ Crowder
3
@TJCrowder Zakładam, że miał na myśli liczbę całkowitą w sensie matematycznym, a nie typ danych.
Dennis
1
@ TJCrowder ważny punkt :-) Chociaż, jeśli się nie mylę, 1e99 jest technicznie wciąż liczbą całkowitą. long intnie wystarczy, potrzebujesz super long int.
Stewie Griffin
1
@StewieGriffin: Hah! :-) Jestem pewien, że jest gdzieś taki język.
TJ Crowder

Odpowiedzi:

2

Jolf, 18 16 bajtów

Wypróbuj tutaj! Wiedziałem, że funkcja UpperLower będzie kiedyś przydatna! Zamień óz ΢, lub po prostu użyj linku tłumacza. Jest to zakodowane w ISO 8859-7.

ρiLaΜGpwpuEdóH΅A
      pw           upper and lower
        pu         of the uppercase alphabet
     G    E        split by nothing (E = "")
    Μ      dóH     map each char to its numeric counterpart
  La               regex alternate array (e.g. La[1,2,3] => "1|2|3")
ρi            ΅A   replace input with the character code of the match (΅ is string lambda)
Conor O'Brien
źródło
17

Perl, 39 38 bajtów

(Dodano 1 bajt dla -pflagi).

$"="|";s/@{[65..90,97..122]}/chr$&/ge
s/                           /          replace...
  @{[                      ]}           this string, treated as a regex:
     join"|",65..90,97..122             65|66|67|68|...|121|122
                                   /ge  ...with this string, eval()'d:
                                 $&     the entirety of the last match
                              chr       convert to char from ASCII code

Właściwe narzędzie do zadania ™.

Wyjaśnienie jest przestarzałe po jednej małej optymalizacji (dzięki dev-null !), Co czyni go jednym bajtem krótszym (ale nieco mniej eleganckim): $"zmienna reprezentuje, co należy zrobić join, interpolując tablicę do łańcucha, więc ustawienie $"="|"eliminuje potrzebę join.

Próbny:

llama@llama:~$ perl -pe '$"="|";s/@{[65..90,97..122]}/chr$&/ge' 
1234567
12345C
3456789 
345CY
9865432
bA432
6566676869707172737475767778798081828384858687888990
ABCDEFGHIJKLMNOPQRSTUVWXYZ
6711110010100071111108102
Code000Golf
Klamka
źródło
Myślę, że możesz zapisać jeden bajt, ustawiając $"="|"zamiast dołączać?
andlrc
na przykład. $"="|";s/@{[65..90,97..122]}/chr$&/ge
andlrc
@ dev-null To działa, dziękuję!
Klamka
11

JavaScript, 80 bajtów

s=>s.replace(/6[5-9]|[78]\d|9[0789]|1[01]\d|12[012]/g,x=>String.fromCharCode(x))

Zobacz regex w akcji tutaj: https://regex101.com/r/iX8bJ2/1

Tylko z ciekawości nauczyłem się tutaj:

Nie mogę zmienić x=>String.fromCharCode(x)się String.fromCharCode , bo ...

oddalony
źródło
6

CJam, 22 bajty

q{+'[,_el^{_is@\/*}/}*

Wypróbuj online!

tło

Po prostu zastąpienie wszystkich wystąpień grup cyfr odpowiednimi literami (w dowolnej wybranej przez nas kolejności) nie będzie zgodne z regułą od lewej do prawej.

Zamiast tego możemy wygenerować wszystkie prefiksy ciągu wejściowego i spróbować dokonać wszystkich możliwych podstawień podczas ich generowania. Ponieważ żaden punkt kodowy nie jest zawarty w innym punkcie kodowym, kolejność tych prób nie jest ważna.

Na przykład:

67466

6     -> 6
67    -> C
 C4   -> C4
 C46  -> C46
 C467 -> C4B

C4B

Jak to działa

q                       Read all input from STDIN.
 {                  }*  Fold; push the first character, and for each subsequent
                        character, push it and do the following:
  +                       Append the character to the string on the stack.
   '[,_el^                Push the string of all ASCII letters.
                          See: http://codegolf.stackexchange.com/a/54348
          {       }/      For each ASCII letter:
           _                Push a copy of the letter.
            i               Convert to integer, i.e., compute its code point.
             s              Cast to string.
              @\            Rotate and swap.
                /           Split the modified input characters at occurrences (at
                            most one) of the string repr. of the code point.
                 *          Join, separating by the corresponding letter.
Dennis
źródło
4

PHP, 110 102 101 68 67 bajtów

Całkiem trudne wyzwanie. To najlepsze, co mogłem wymyślić. To jest całkowicie nowa wersja.

for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);

Uruchom tak:

php -r 'for($i=64;123>$i+=$i-90?1:7;)$t[$i]=chr($i)?><?=strtr($argv[1],$t);' 6711110010100071111108102;echo
> Code000Golf
  • Zaoszczędzono 8 bajtów, używając ctype_alphazamiast preg_matchthx do zarządzania
  • Zapisano 1 bajt, przygotowując 0się do ciągu zamiast sprawdzania niepustego ciągu: gdy ostatnim znakiem wejściowym jest 0, podciąg, który biorę, to „0”, co jest fałszem, podczas gdy „00” to prawda, więc nie pominie drukowania ostatniego 0.
  • Zaoszczędzono ogromne 33 bajty, używając strtrpo zbudowaniu tablicy z parami konwersji
  • Zapisano bajt za pomocą tagu krótkiego wydruku
aross
źródło
1
Będziesz musiał zmienić wyrażenie regularne na, #[A-Z]#iponieważ bieżące z radością pozwoli przekształcić „92” w „\”. Lub spróbuj ctype_alpha()zamiast preg_match(). Jak dotąd wydaje się działać.
manatwork
"0", which is falsy, whereas "00" is truthyDobra robota, PHP.
kot
3

Python 3, 211 189 188 bajtów

def f(c,i=0,n=""):
 while i<len(c):a=1;x=int(c[i:i+2]);a=2 if 64<x<91 or 96<x<100 else a;x=int(c[i:i+3]) if a<2 else x;a=3 if 99<x<123 else a;x=chr(x) if a>1 else c[i];n+=x;i+=a
 return n
  • Zaoszczędzono 23 bajty, zamieniając \ n na; dzięki Dennisowi

Test

wprowadź opis zdjęcia tutaj

Argenis García
źródło
1
Jeśli użyjesz ;zamiast podziałów linii, możesz umieścić całą pętlę while na pojedynczej linii. Może się również stać pierwsza linia def f(c,i=0,n=""):.
Dennis
1
a=1;a=2 if 64<x<91 or 96<x<100 else a-> a=1+(64<x<91or 96<x<100)itp.
patrz
2

Pyth, 20 18 bajtów

.Uu:G`CHHsrBG1+bZz

Ten sam algorytm jak @Dennis. O wiele łatwiej jest napisać kod w Pyth na moim telefonie niż w Galaretce.

                implicit: z=input
.U              Reduce the following lambda b, Z over z
                b is the string being built; z is the next char
   u                Reduce the following lambda G,H over +bZ
                    G is the string, H is the next letter to match
     :                  Replace
       G                in G
       ` C H            the char code of H
       H                with H
     s rB            where H takes on values:
          G              the lowercase alphabet (that's the global value of G)
          1              concatenated to its uppercased self.
     +          
       b
       Z
   z

Dzięki @isaacg

Wypróbuj tutaj .

lirtosiast
źródło
Po prostu nie możesz trzymać się tej strony na swoim telefonie, czy możesz ...?
Conor O'Brien
1
Zwłaszcza, gdy mam luksus kodowania we wszystkich drukowanych ASCII: D
lirtosiast
1
To prawda, prawdopodobnie miło zrobić sobie przerwę od całej tej galaretki ... Wiesz, zbilansowana dieta;)
Conor O'Brien
0

05AB1E , 12 bajtów

õsvy«žnvyÇy:

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

õ             # Push an empty string ""
 sv           # Swap to get the (implicit) input-string, and loop over its characters:
   y«         #  Append the current character to the string
     žn       #  Push builtin "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
       v      #  Inner loop over each of these letters:
           :  #   Replace in the string all occurrences (should be either 0 or 1 occurrence)
        yÇ    #   of the ordinal value of the current letter
          y   #   by this letter
              # (after the loops, implicitly output the top of the stack as result)

12 bajtów alternatywnych przy użyciu zmniejszania o:

Å»«žnvyÇy:]θ

Wypróbuj online lub sprawdź wszystkie przypadki testowe lub zobacz krok po kroku zmniejszenie o zaledwie 10 pierwszych bajtów .

Kevin Cruijssen
źródło