ASCII'yi bölme


33

ASCII plus newline'da yazdırılabilir 95 karakter göz önüne alındığında, iki eşit 48 karakter grubuna (bundan sonra grup A ve grup B olarak ayrılır) ayrılır . İki grup arasında tercih ettiğiniz bire bir eşleme (tamamen takdir yetkiniz vardır) oluşturun. Başka bir deyişle, Aile eşleşiyor olabilir ave tam tersi, ama Aaynı zamanda ile eşleşiyor olabilir >o sizin program için ihtiyaç buysa, tersi ve yardımcısı.

ASCII'yi iki gruba ayırdıktan sonra, sırasıyla her gruptaki karakterleri kullanarak iki program ve / veya işlev yazın. Başka bir deyişle, yalnızca A grubundaki karakterleri kullanan bir program / işlev ve B grubundaki karakterleri kullanan bir program / işlev yazın.

Bu programlar giriş olarak bir karakter alabilmelidir. A Grubu karakterleriyle yazılan program, eğer giriş A grubu karakteri ise aynı karakteri, A grubu karakteri ise eşlenen grubu A karakteri çıkardı / döndürdü; A Grubu programı her zaman bir A grubu karakteri vermelidir. Benzer şekilde, B Grubu bir B karakteri ise aynı karakteri, girdi A grubu ise Eşlenen B karakteri ile aynı karakteri vermelidir.

Bu çok net olmayabilir, işte bir örnek. Tüm büyük harflerin A grubunda olduğunu ve tüm küçük harflerin B grubunda olduğunu ve bu harflere yönelik bire bir eşlemenizin birinden diğerine olmasını seçtiyseniz, o zaman: Örnek giriş / çıkışlar:

Program A:

Input    Output
A        A
D        D
a        A
q        Q

Program B:

Input    Output
A        a
D        d
a        a
q        q

Diğer kurallar:

  • İki programın aynı dilde olması gerekmez.
  • Hem programlar hem de işlev olmaları gerekmez; biri program, diğeri bir işlev olabilir, bu iyi.
  • Aynı şekilde çalışmaları, benzer uzunluklarda olmaları, buna benzer şeyler; sadece yukarıdaki diğer kurallara uymaları gerekir.
  • Evet, programlarınızdan yalnızca biri yeni satırlar kullanabilir ve yalnızca biri boşluk kullanabilir (bu aynı veya farklı bir program olabilir).
  • Her programda 48 karakterin tümünü kullanmanıza gerek yoktur.

Standart boşluklar normal olarak yasaklanmıştır. Tüm programlar kendi içerisinde yer almalı, seçtiğiniz haritalamayı içeren dosyalar bulunmamalıdır.

Puanlama kriterleri: . Özellikle, iki programın metninin baytlarının toplamı.

Lütfen cevabınızı şu şekilde gönderin:

Dil - # bayt + Dil - # bayt = # bayt

Eşlemenizin net bir açıklaması. Karmaşıksa, şunun gibi bir grafik kullanın:

ABCDEFGHIJKLMNOPQRSTUVWXYZ (etc.)
zyxwvutsrpqonmlkjihgfedcba (etc.)

Ya da sadece açıklayabilir (ilk 48 sıradaki son 48 harita), ardından cevabınızı normal olarak görebilirsiniz.


Her ikisi için de aynı dili kullanmayı deneyeceğim. :)
mbomb007

Dürüst olmak gerekirse kuralları değiştirmeli ve "her iki programın da aynı dilde olması gerekir" ile sınırlandırmanız gerektiğini düşünüyorum. Aksi takdirde muhtemelen YOL çok kolay / geniş.
mbomb007 5:15

Aslında bu kendini değiştiren Brainfuck'ta mümkün mü diye merak ediyorum. Sadece +ve kullanarak bir program >, diğer kullanarak -ve kullanmanız gerekir <. Daha sonra, bunları kullanamayan programdaki ,veya .programındaki eksik operatörleri oluşturmaya çalışmalısınız.
mbomb007 5:15

1
@Ruslan SQL kullanmayı deneyin. Büyük / küçük harfe duyarlı değildir ve kod blokları için anahtar kelimeler (başlangıç ​​ve bitiş) kullanır. SQL Server 2014 kullanıyorsanız, DBCC Toplu Ekleme'yi bir program için, diğeri için bir yordam kullanabilirsiniz. İlki parantez kullanmaktan kaçınabilirsiniz. Sonra her iki program için ifade zaman seçme durumunda kullanın. Ayrıca, Java'da her karakteri unicode değerlerle değiştiren bir program için numarayı kullanarak ve diğer harf için u harfini, ters eğik çizgiyi veya sayıları kullanmayan bir işlevi kullanarak mümkün olduğuna inanıyorum.
bmarks

4
Zor. Meydan okuma. Hiç.
Karadelik 18

Yanıtlar:


6

CJam - 11 bayt + CJam - 25 bayt = 36 bayt

Karakterler, 16 kişilik alternatif gruplarda seçilir:

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

Shift tuşuyla eşleştirmelerden birkaçının elde edilebilmesi harika bir şey :)

Program A:

lL,H-f&'o+c

Çevrimiçi deneyin

Program B:

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

Çevrimiçi deneyin

Açıklama:

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

Güzel! "Çift / tek" in tek cevap olmadığını görmek güzel.
durron597

Hala 1 bit geçiş ... Etkileyici boyutlar! 2. program w / 'o' girdisi programda veya çevrimiçi cjam \ n ... hata çıktısı vermiyor mu?
Brian Tuck

@BrianTuck yeni bir satır çıkarır (değişmez \n), html'yi incelemeden görmek kolay değildir. Bir ekleyebilirsiniz iyerine ASCII kodu görmek için program sonunda (ya cida bu durumda bir karakter yerine bir satır dize verir çünkü aynı zamanda, bir yeni satır girişi ile anlaşma)
aditsu

Ah, yoksa / I değişebilir _0=için 0=_her zaman bir karakteri verir, böylece
aditsu

16

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

Peter Taylor'a GolfScript programından 6 baytlık golf attığı için teşekkür ederiz (ve daha pek çoğunun yolunu açmaktadır.)

Golf için Dennis'e CJam programındaki 15 bayt ve GolfScript programındaki 4 bayt sayesinde.

Grup A: çift karakter kodlu tüm karakterler.
Grup B: Tek karakter kodlu tüm karakterler artı yeni satır.

Ben sadece, hem de en az önemli bit farklı karakterleri eşleştirmek, ikisi arasında yani bariz eşleme kullanıyorum ~ve \n. İşte tam harita (sütunlar):

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

Program A (CJam, burada test edin ):

lX~f&"~"|X<

Program B (GolfScript, burada test edin ):

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

açıklama

Program A

(Eski, yarın güncellenecek.)

Bu program garip karakter kodlarını eşit kodlara çevirmelidir, yani en az anlamlı biti 0 olarak ayarlayın. Bunu yapmanın en açık yolu bitsel olarak VE 126 (veya 254 vb.), Ama bunu 1'e ayarlamak (kısaca VEYA ile) 1) bunun yerine sonucu azaltın. Son olarak, yeni satırları manuel olarak düzeltmemiz gerekir:

"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

(Eski, yarın güncellenecek.)

Bu program basitçe en az anlamlı olanı 1 ile bit yönünde VEYA yoluyla 1'e ayarlayabilir. Ancak hem elle ( hem de \v0x0B karakter kodu) ve <DEL>(karakter kodu 0xFF) manuel olarak kontrol etmeli ve ~bunun yerine bunları ayarlamalıdır . GolfScript'te eval'e erişimim yoktu, ancak bunun yerine girişe eşleyebileceğim bir bloğa (bu bloktaki kodun bir parçası olur) bir dize ekleyebilirsiniz %:

{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.

Ve blokta oluşturulan kod gelince:

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 bayt + Java - 1144 bayt = 2232 bayt

İlk programdan 1090 bayta golf atılmasına yardımcı olan @ durron597'ye teşekkürler.

Tek bir dilde (ve bu şekilde bir esolang olmayan) yapmak mümkün olduğunu ispatlamak.

Birincisini tüm unicode karakterlerine dönüştürmek için unicode hilesini kullanın. İkincisi, std'ye yazdırmak amacıyla System.out'a erişmek için yansıma kullanır. dışarı. U kullanamadı çünkü ilk programda kullanılıyordu. Bunun daha çok golf oynayabileceğini biliyorum ama önce geçerli bir çözüm göndermek istedim.

Gruplar keyfi bir şekilde haritalandırılır, ancak temel olarak ilki yalnızca u, \ ve onaltılık sayıları gerektirir (her durumda).

Gruplar:

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

İlk 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

Eşittir

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

İkinci 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]);}

Onları burada deneyin: https://ideone.com/Q3gqmQ


Unicode kaçması gerekmeyen ilk programdan çıkarabileceğiniz hiçbir karakter yok mu? Bazı rakamları çıkaramaz mısın? Ya yaptıysanız void x(int z), bunlar da ilk karakter
grubundaki

Bunun mümkün olduğuna eminim. Bazı değişkenleri yeniden adlandırabilir ve tüm boşlukları yeni satırlarla ya da sekmelerle değiştirebilirim. Eve geldiğimde bunu yapacağım. İlk önce tek bir dil çözümünü kanıtlamak istedim.
saat

5

SABİT! Pyth - 23 bayt + Pyth - 30 bayt = 53 bayt

Hata! Sabitleme hatası --- lütfen sabırlı olun

Martin ile aynı ASCII bölünmüş:

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

Prog # 1: Çevrimiçi Test

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

Prog # 2: Çevrimiçi Test

C?%KCwy1K?qy5Ky5?qy+1y31Ky5+1K
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.