Podział ASCII


33

Biorąc pod uwagę 95 znaków do wydrukowania w ASCII plus znak nowej linii, podziel go na dwie równe, 48 grup znaków (zwane dalej grupą A i grupą B). Utwórz własne mapowanie jeden do jednego (masz całkowitą dyskrecję) między dwiema grupami. Innymi słowy, Amoże mapować na ai odwrotnie, ale Amoże również mapować na >i odwrotnie, jeśli tego potrzebujesz w swoim programie.

Po podzieleniu ASCII na dwie grupy, napisz dwa programy i / lub funkcje, używając odpowiednio tylko znaków w każdej grupie. Innymi słowy, napisz jeden program / funkcję, która używa tylko znaków z grupy A, i inny program / funkcję, która używa tylko znaków z grupy B.

Programy te muszą mieć możliwość odebrania jednego znaku jako danych wejściowych. Program napisany ze znakami z grupy A powinien wypisać / zwrócić ten sam znak, jeśli wprowadzony znak był grupą A, a odwzorowany znak grupy A, jeśli otrzymał znak grupy B; program grupy A powinien zawsze wyświetlać znak grupy A. Podobnie, program grupy B powinien wypisywać ten sam znak, jeśli jest to znak grupy B, a odwzorowany znak grupy B, jeśli wejściem jest znak grupy A.

To może nie być tak jasne, więc oto przykład. Jeśli przyjmiesz, że wszystkie duże litery znajdują się w grupie A, a wszystkie małe litery znajdują się w grupie B, a wybrałeś, że twoje odwzorowanie jeden na jeden dla tych liter jest od jednego do drugiego, to: oto kilka przykładowe wejścia / wyjścia:

Program A:

Input    Output
A        A
D        D
a        A
q        Q

Program B:

Input    Output
A        a
D        d
a        a
q        q

Inne zasady:

  • Te dwa programy nie muszą być w tym samym języku.
  • Nie muszą to być oba programy ani obie funkcje; jeden może być programem, drugi funkcją, w porządku.
  • Nie muszą pracować w ten sam sposób, być podobnej długości, czy coś takiego; muszą po prostu spełniać pozostałe powyższe zasady.
  • Tak, tylko jeden z twoich programów może używać znaku nowej linii i tylko jeden może używać spacji (może to być ten sam lub inny program).
  • Nie musisz używać wszystkich 48 znaków w każdym programie.

Standardowe luki są normalnie zakazane. Wszystkie programy muszą być samodzielne, bez plików zawierających wybrane mapowanie.

Kryteria punktowe: . W szczególności suma bajtów tekstu dwóch programów.

Proszę zamieścić swoją odpowiedź w ten sposób:

Język - # bajtów + Język - # bajtów = # bajtów

Jednoznaczny opis twojego mapowania. Jeśli jest to skomplikowane, użyj takiej tabeli:

ABCDEFGHIJKLMNOPQRSTUVWXYZ (etc.)
zyxwvutsrpqonmlkjihgfedcba (etc.)

Możesz też to wyjaśnić (pierwsze 48 map do ostatnich 48 w sekwencji), a następnie normalną odpowiedź.


Spróbuję użyć tego samego języka dla obu. :)
mbomb007

Myślę, że powinieneś zmienić zasady, ograniczając je do „oba programy muszą być w tym samym języku”. W przeciwnym razie prawdopodobnie będzie to zbyt łatwe / szerokie.
mbomb007

Właściwie zastanawiam się, czy jest to możliwe w Samo-modyfikującym Brainfuck. Musisz mieć tylko jeden program używający +i >, a drugi używający -i <. Następnie musisz spróbować wygenerować brakujące operatory, takie jak a ,lub .w programie, który nie może ich użyć.
mbomb007

1
@Ruslan Spróbuj użyć SQL. Nie rozróżnia wielkości liter i używa słów kluczowych (początek i koniec) do bloków kodu. Jeśli korzystasz z programu SQL Server 2014, możesz użyć DBCC Bulk Insert dla jednego programu i procedury dla drugiego. W pierwszym z nich możesz uniknąć używania nawiasów. Następnie użyj instrukcji case case dla obu programów. Uważam też, że jest to możliwe w Javie, używając sztuczki \ u dla programu zastępującego każdy znak wartościami Unicode i używania funkcji dla drugiego, który nie używa litery u, ukośnika odwrotnego ani cyfr.
bmarks

4
Najtrudniejszy Wyzwanie. Zawsze.
Blackhole

Odpowiedzi:


6

CJam - 11 bajtów + CJam - 25 bajtów = 36 bajtów

Znaki są wybierane w naprzemiennych grupach po 16:

 !"#$%&'()*+,-./@ABCDEFGHIJKLMNO`abcdefghijklmno
0123456789:;<=>?PQRSTUVWXYZ[\]^_pqrstuvwxyz{|}~\n

Fajnie, że kilka mapowań można uzyskać za pomocą klawisza Shift :)

Program A:

lL,H-f&'o+c

Wypróbuj online

Program B:

q_S<\_0=16|_127<\S0=42^??

Wypróbuj online

Wyjaśnienie:

Program A:

l      read a line from the input, this is a 1-character string
        or the empty string if the input was a newline
L,     get the length of an empty string/array (0)
H-     subtract 17, obtaining -17 (~16)
f&     bitwise-"and" each character (based on the ASCII code) with -17
'o+    append the 'o' character
c      convert to (first) character
        the result is the "and"-ed character, or 'o' for newline

Program B:

q_       read the whole input and duplicate it
S<\      compare with " " and move the result before the input
_0=      duplicate the input again, and get the first (only) character
16|      bitwise-"or" with 16 (based on the ASCII code)
_127<    duplicate and compare (its ASCII code) with 127
\        move the result before the "or"-ed character
S0=      get the space character (first character of the space string)
42^      xor with 42, obtaining a newline character
          stack: (input<" ") (input) ("or"-ed char<127) ("or"-ed char) (newline)
?        if the "or"-ed character is less than 127, use the "or"-ed character
          else use the newline character
?        if the input was smaller than space (i.e. it was a newline),
          use the input, else use the character from the previous step

Miły! Cieszę się, że „parzysta / nieparzysta” nie jest jedyną odpowiedzią.
durron597,

Wciąż 1-bitowy przełącznik ... Imponujące rozmiary! Drugi program z wejściem „o” nie wydaje się wyświetlać błędu \ n ... w programie lub cjam online?
Brian Tuck,

@BrianTuck generuje nowy wiersz (nie dosłowny \n), po prostu nie jest łatwo go zobaczyć bez sprawdzania html. Możesz dołączyć iznak na końcu programu, aby zamiast tego zobaczyć kod ASCII (lub citeż poradzić sobie z wprowadzaniem nowego wiersza, ponieważ w takim przypadku wyświetla on ciąg nowego wiersza, a nie znak)
aditsu

Och, albo ty / ja mógłbym zmienić _0=na, 0=_aby zawsze wyświetlał postać
aditsu

16

CJam - 46 44 26 11 bajtów + GolfScript - 142 125 115 93 68 47 40 36 bajtów = 47 bajtów

Podziękowania dla Petera Taylora za grę w golfa 6 bajtów poza programem GolfScript (i torowanie drogi dla wielu innych).

Dzięki Dennis za grę w golfa 15 bajtów poza programem CJam i 4 bajty poza programem GolfScript.

Grupa A: wszystkie znaki z parzystym kodem znaków.
Grupa B: wszystkie znaki z nieparzystym kodem znaków oraz znak nowej linii.

Używam oczywistego odwzorowania między nimi, tj. Łączę znaki, które różnią się tylko najmniej znaczącym bitem, a także ~i \n. Oto pełna mapa (kolumny):

 "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}\n

Program A (CJam, przetestuj tutaj ):

lX~f&"~"|X<

Program B (GolfScript, przetestuj tutaj ):

{1}'{-'{)}%'115)%11-[9)ie'9/{))}%++%

Wyjaśnienie

Program A

(Nieaktualne, zaktualizuje się jutro).

Ten program powinien zamieniać kody nieparzyste na parzyste, tzn. Ustawiać najmniej znaczący bit na 0. Oczywistym sposobem jest bitowe ORAZ z 126 (lub 254 itd.), Ale krótsze jest ustawienie go na 1 (poprzez bitowe LUB z 1) zamiast tego, a następnie zmniejsz wynik. Wreszcie musimy ręcznie naprawić nowe linie:

"r"(  e# Push the string "r" and pull out the character.
(~    e# Decrement to q and eval to read input.
(     e# Pull out the character from the input string.
2(|(  e# (input OR (2-1))-1 == input AND 126
0$    e# Copy the result.
N&    e# Set intersection with a string containing a newline.
"~"   e# Push "~".
"@@"( e# Push "@@" and pull out one @.
(|    e# Decrement to ?, set union with the other string to give "@?".
~     e# Eval to select either the computed character or "~" if it was a newline.

Program B

(Nieaktualne, zaktualizuje się jutro).

Ten program może po prostu ustawić najmniej znaczący bit na 1 poprzez bitowe LUB z 1 teraz. Ale musi ręcznie sprawdzić zarówno \v(kod znakowy 0x0B), jak i <DEL>(kod znakowy 0xFF) i ustawić je na ~. W GolfScript nie miałem dostępu do eval, ale zamiast tego możesz dodać ciąg do bloku (który następnie staje się częścią kodu w tym bloku), który mógłbym odwzorować na dane wejściowe za pomocą %:

{1}    # Push this block without executing it.
'{--'  # Push this string.
{)}%   # Increment each character to get '|..'.
')1)7?=[11=+9)?ie'
       # Push another string...
7/     # Split it into chunks of 7: [')1)7?=[' '11=+9)?' 'ie']
{))}%  # For each chunk, split off the last character and increment it.
+      # Add the array to the string, flattening the array: '|..)1)7?=\11=+9)@if'
+      # Add it to the block: {1|..)1)7?=\11=+9)@if}
%      # Map the block onto the input, i.e. apply it to the single character.

A jeśli chodzi o wygenerowany kod w bloku:

1|..   # Bitwise OR with 1, make two copies.
)1)7?= # Check if the result is one less than 2^7 == 128 (i.e. if it's <DEL>).
\11=   # Check with the other copy if it's equal to 11 (i.e. if it's \v).
+      # Add them to get something truthy either way.
9)     # Push a 10 (i.e. \n).
@      # Pull up the original value.
if     # Select the correct result.

15

Java - 1088 bajtów + Java - 1144 bajtów = 2232 bajty

Dzięki @ durron597 za pomoc w golfie 1090 bajtów z pierwszego programu.

Dowód, że można to zrobić w jednym języku (w tym nie w języku esolang).

Użyj sztuczki Unicode, aby przekonwertować pierwszą na wszystkie znaki Unicode. Drugi wykorzystuje refleksję, aby uzyskać dostęp do System.out w celu wydrukowania do standardowego. na zewnątrz. Nie mógł użyć u, ponieważ został użyty w pierwszym programie. Wiem, że można to pograć bardziej w golfa, ale najpierw chciałem opublikować prawidłowe rozwiązanie.

Grupy są dość arbitralnie mapowane, ale zasadniczo pierwsza wymagała tylko u, \ i cyfr szesnastkowych (w każdym razie).

Grupy:

!#7$&89'0123456>fB@UXZ\^AKCDEGH_JL`NOkQRxzVWYu~\n
 "%()*+,-./:;<=?FIMPST[]abcdeghijlmnopqrstvwy{|}

Pierwszy program:

\u0076\u006F\u0069\u0064
k\u0028\u0069\u006E\u0074
x\u0029\u007B\u0069\u006E\u0074\u005B\u005Du\u003D\u007B33\u002C33\u002C35\u002C35\u002C36\u002C55\u002C38\u002C39\u002C36\u002C38\u002C56\u002C57\u002C39\u002C48\u002C49\u002C50\u002C48\u002C49\u002C50\u002C51\u002C52\u002C53\u002C54\u002C55\u002C56\u002C57\u002C51\u002C52\u002C53\u002C54\u002C62\u002C62\u002C64\u002C65\u002C66\u002C67\u002C68\u002C69\u002C102\u002C71\u002C72\u002C66\u002C74\u002C75\u002C76\u002C64\u002C78\u002C79\u002C85\u002C81\u002C82\u002C88\u002C90\u002C85\u002C86\u002C87\u002C88\u002C89\u002C90\u002C92\u002C92\u002C94\u002C94\u002C95\u002C96\u002C65\u002C75\u002C67\u002C68\u002C69\u002C102\u002C71\u002C72\u002C95\u002C74\u002C107\u002C76\u002C96\u002C78\u002C79\u002C107\u002C81\u002C82\u002C120\u002C122\u002C117\u002C86\u002C87\u002C120\u002C89\u002C122\u002C117\u002C126\u002C10\u002C126\u007D\u003B\u0053\u0079\u0073\u0074\u0065\u006D\u002E\u006Fu\u0074\u002E\u0070\u0072\u0069\u006E\u0074\u0028x>10\u003F\u0028\u0063\u0068\u0061\u0072\u0029u\u005Bx\u002D32\u005D\u003A'\u005C\u006E'\u0029\u003B\u007D

Równoważny

void
k(int
x){int[]u={33,33,35,35,36,55,38,39,36,38,56,57,39,48,49,50,48,49,50,51,52,53,54,55,56,57,51,52,53,54,62,62,64,65,66,67,68,69,102,71,72,66,74,75,76,64,78,79,85,81,82,88,90,85,86,87,88,89,90,92,92,94,94,95,96,65,75,67,68,69,102,71,72,95,74,107,76,96,78,79,107,81,82,120,122,117,86,87,120,89,122,117,126,10,126};System.out.print(x>10?(char)u[x-32]:'\n');}

Drugi program:

void n(int r)throws Throwable{int p=(int)Math.PI;int q=p/p;int t=p*p+q;int w=q+q;int[]g={t*p+w,t*p+w,t*p+q+p,t*p+q+p,t*(q+p),t*p+t-p,t*(q+p)+q,t*(q+p)+q+p,t*(q+p),t*(q+p)+q,t*(q+p)+w,t*(q+p)+p,t*(q+p)+q+p,t*(q+p)+p+w,t*(q+p)+p+p,t*(q+p)+t-p,t*(q+p)+p+w,t*(q+p)+p+p,t*(q+p)+t-p,t*(p+w)+t-w,t*(p+w)+t-q,t*(p+p),t*(p+p)+q,t*p+t-p,t*(q+p)+w,t*(q+p)+p,t*(p+w)+t-w,t*(p+w)+t-q,t*(p+p),t*(p+p)+q,t*(p+p)+p,t*(p+p)+p,t*(t-p)+t-p,t*(t-q)+t-p,t*(t-p)+p,t*(t-q)+t-q,t*t,t*t+q,t*(t-p),t*t+p,t*t+q+p,t*(t-p)+p,t*t+p+p,t*(t-q)+t-w,t*t+t-w,t*(t-p)+t-p,t*(t+q),t*(t+q)+q,t*(t-w),t*(t+q)+p,t*(t+q)+q+p,t*(t-w)+p,t*(t-w)+q+p,t*(t-w),t*(t+q)+t-w,t*(t+q)+t-q,t*(t-w)+p,t*(t+w)+q,t*(t-w)+q+p,t*(t-q)+q,t*(t-q)+q,t*(t-q)+p,t*(t-q)+p,t*t+p+w,t*t+t-q,t*(t-q)+t-p,t*(t-q)+t-w,t*(t-q)+t-q,t*t,t*t+q,t*(t-p),t*t+p,t*t+q+p,t*t+p+w,t*t+p+p,t*(t+q)+w,t*t+t-w,t*t+t-q,t*(t+q),t*(t+q)+q,t*(t+q)+w,t*(t+q)+p,t*(t+q)+q+p,t*(t+q)+p+w,t*(t+q)+p+p,t*(t+w)+p,t*(t+q)+t-w,t*(t+q)+t-q,t*(t+q)+p+w,t*(t+w)+q,t*(t+q)+p+p,t*(t+w)+p,t*(t+w)+q+p,t*(t+w)+p+w,t*(t+w)+q+p};java.io.PrintStream o=(java.io.PrintStream)System.class.getFields()[p/p].get(p);o.print((r<=t)?"}":(char)g[r-t*p-w]);}

Wypróbuj je tutaj: https://ideone.com/Q3gqmQ


Nie ma znaków, które można by wyciągnąć z pierwszego programu, które nie wymagają ucieczki w Unicode? Nie możesz wyciągnąć niektórych liczb? A jeśli tak void x(int z), to są to również postacie z pierwszego zestawu znaków
durron597

Jestem pewien, że to możliwe. Mógłbym zmienić nazwę niektórych zmiennych i zastąpić wszystkie spacje nowymi wierszami lub tabulatorami. Zrobię to, kiedy wrócę do domu. Chciałem tylko najpierw udowodnić rozwiązanie w jednym języku.
zaznacza

5

NAPRAWIONY! Pyth - 23 bajty + Pyth - 30 bajtów = 53 bajty

oops Błąd naprawy --- proszę o cierpliwość

taki sam podział ASCII jak Martin:

1: "$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
2:!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}\n

Prog # 1: Testuj online

.xhft<zT.Dr\¡b:Z140 2\~

Prog # 2: Testuj online

C?%KCwy1K?qy5Ky5?qy+1y31Ky5+1K
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.