İki dizeden bir dizeye enjeksiyon


14

Meydan okuma

Sıralı bir dize giriş ve bir dize çıktı olarak alan bir injective fonksiyon uygulayan bir program yazın. Diğer bir deyişle, her girdi benzersiz bir çıktıyla eşleşmelidir.

Ayrıntılı Bilgiler

  • Giriş , keyfi uzunluktaki herhangi iki dizeden oluşabilir, ancak yalnızca yazdırılabilir ASCII karakterlerinden (kodlar ) oluşur.[32,126]
  • Benzer şekilde, çıkış dizgisinde uzunluk sınırlaması yoktur, ancak yalnızca yazdırılabilir ASCII karakterlerinden oluşmalıdır.
  • Diliniz rastgele uzunluktaki dizeleri işleyemiyorsa, program yalnızca herhangi bir boyuttaki dizeler için teorik olarak çalışabilir .
  • Girişlerden çıkışlara eşleme, programın yürütülmesi arasında tutarlı olmalıdır. Aksi takdirde, kullandığınız harita bir enjeksiyon olduğu sürece tamamen size bağlıdır.
  • Giriş sıralanmıştır. İki giriş dizesi farklıysa, değiştirilenden farklı bir çıktı üretmelidirler. stf(s,t)f(t,s)
  • Her dizenin olası bir çıktı olması gerekmez.
  • Her dilde en kısa cevap kazanır!

Test senaryoları

Aşağıdaki girişlerin tümü farklı çıkışlarla sonuçlanmalıdır. Karışıklığı önlemek için, teller guillemets («») ile çevrilidir ve tek boşluklarla ayrılmıştır.

"Selam Dünya"
«Lelho» «drowl»
«Diffe» «_rent»
"aynı değil"

«Kod» «Golf»
«İşbirliği» «deGolf»
«CodeGolf» «»

«» «»
«» «»
«» «»
«» «»
«» «»

«Abc", »« def »
«Abc» «," def »
«Abc '» «' def»
«Abc '» «' def»

«\» «" »
«\\» «\" »

8
Hmm "Sadece bir program yaz ..." fark ettim - meta konsensüsle (şu anda 46 yukarı, 1 aşağı) "Sadece programlara kısıtlamak, sadece" program "yerine açıkça" tam program "belirtilmesini gerektirir . Umarım bunu kısıtlamak istememişsinizdir, ancak eğer öyleyse gönderiyi buna göre güncellemeniz ve zaten cevap olarak işlev göndermiş olanlarımıza hitap etmeniz gerekir.
Jonathan Allan

4
@JonathanAllan Amaç işlevlere izin vermekti.
negatif yedi

3
Dizelerden herhangi biri boş olabilir mi?
Shaggy

2
@Shaggy Evet, her ikisi de olabilir.
negatif yedi

1
Bazı test durumlarımız olabilir mi? Teşekkürler!
ouflak

Yanıtlar:


17

brainfuck, 30 29 27 23 bayt

,[-[+.>]-[>+<---]>.-.,]

Çevrimiçi deneyin!

Girişler bir 0x01bayt ile ayrılır .

Bu döner ["foo", "bar"]içine fUToUToUTUTbUTaUTrUT. Orijinal iki dizeyi kurtarmak için, 3 karakterlik gruplar alın, ikinci harfin bulunmadığını bulun Uve oraya bölün.


@Grimy Maalesef yanlış anlaşıldı "Girdiler 0x01 bayt ile ayrılıyor."
wastl

15

JavaScript (ES6), 14 bayt

Girişi 2 dizeden oluşan bir dizi olarak alır. Luis'in cevabından ilham aldı .

JSON.stringify

Çevrimiçi deneyin!


JavaScript (ES6),  21  20 bayt

Girişi alır (a)(b).

a=>b=>[a.length,a]+b

Çevrimiçi deneyin!

İade uzunluğu a birleşik bağ, ardından bir virgül, ardından, a ve b .


Allah kahretsin! Sadece stringifyhileyi kendim kullanmak üzereydim !
Shaggy

İle tatili a="hello","" b="world"vea="hello" b="","world"
Soleil

1
@Soleil Bu verecek ["\"hello\",\"\"","\"world\""]ve ["\"hello\"","\"\",\"world\""].
Arnauld

1
@ Ters eğik çizgi koruması görünmez. İşlev enjekte edilmez.
Soleil

1
@Soleil Ne demek istediğini anlamıyorum. JSON.stringify()kesinlikle kaçar ". Onaltılık dökümü görün .
Arnauld

15

jq -c, 0 bayt

Çevrimiçi deneyin!

Bu kesinlikle hile gibi geliyor ...? Ama bu meydan okuma kurallarına uyuyor gibi görünüyor.

Varsayılan olarak, jqgirdisini insan tarafından okunabilen bir JSON biçiminde çıktılar. -c(Kompakt) bayrağı söyler jq(meydan yazdırılamayan ASCII yasaklamaktadır beri) yeni satır kaldırır "kompakt" tarzı, içinde çıkışa.


1
OP boş girişe izin verir, bu nedenle a = "", b = "x" a = "x" b = "" ile aynı çıktıyı vermez
Gnudiff

3
@Gnudiff Nasıl? Onlar verecekti ["","x"]ve ["x",""]sırasıyla
Kapı Tokmağı

1
Üzgünüm, haklısın.
Gnudiff


5

Japt -S , 3 bayt

Ben hala burada bir şey eksik gerekir hissediyorum ...

®mc

Dene

2 bayt olabilir:

mq

Dene

Veya bu 1 byter ile gerdirin:

U

Dene

İlk sürüm, dizideki her dizeyi kod noktalarıyla eşler ve bunları bir boşlukla birleştirerek çıkarır.

İkinci sürüm, her dizeyi bir karakter dizisine böler ve bunları bir boşlukla birleştirerek çıktılar.

Ve hile gibi hissettiren üçüncü versiyon, sadece girişin -Qbayrakla kaldırılmasını sağlıyor srringify.


5

Pyth , 4 bayt

jNmC

Çevrimiçi deneyin!

Bu, her dizeyi temel 256'ya dönüştürür ve sonra a ile sırayla birleştirir ". Sonuçlar her bir sayı olduğu için "onları net bir şekilde ayırır ve orijinal dizelerle kurtarılabilir mCsdczN.


1
@AndersKaseorg 1 bayt öneriyor .
Kevin Cruijssen

@KevinCruijssen Bunu yayınladıktan birkaç dakika sonra, sadece bu çözümün ruhunu tercih ediyorum. Yine de getirdiğiniz için teşekkürler ve kesinlikle kendiniz yayınlamaktan çekinmeyin :)
FryAmTheEggman

Cevabınızı daha çok seviyorum. :) Ve hayır, Pyth'i bile tanımıyorum. İsterseniz kendiniz ayrı bir cevap olarak (veya bunu düzenleyerek birleşik bir cevap) gönderebilirsiniz , aksi takdirde Anders Kaseorg bunu gönderebilir, çünkü yorumda bahsi geçen kişi odur .
Kevin Cruijssen

4

T-SQL, 38 bayt

SELECT QUOTENAME(a)+QUOTENAME(b)FROM i

ivarcharab

Kullanımları QUOTENAMEdizelerle saran, []ve ayrıca herhangi bir iç parantez kaçar. Benzersiz bir çıktı ile eşleşmelidir.


1
MySQL ile aynı uzunluk: SELECT CONCAT(QUOTE(a),QUOTE(b))FROM t Çevrimiçi deneyin
Night2

4

Zsh , 7 bayt

<<<$@:q

Çevrimiçi deneyin!

Uzaylardaki argümanları örtük olarak birleştirir. qDeğiştirici Çıkışsız uzay açık bir şekilde iki bağımsız değişkeni ayıran sağlanması önemlisi boşluk kaçar argümanlar, alıntı zsh söyler.

(Olmadan q, "a " "b"ve "a" " b"her ikisi de verecektir "a b".)


3

MATL , 1 bayt

j

Kod, giriş olarak iki dizeden oluşan bir diziyi alır ve bu dizinin dize olarak temsilini çıkarır.

Çevrimiçi deneyin!

açıklama

Kod, girdiyi değerlendirilmemiş bir dize olarak okur.


1
Bu gerçekten girdi olarak iki dizeyi alıyor mu? Bu, girdiyi her ne olursa olsun yazdırıyor gibi görünüyor. Çevrimiçi deneyin!
James

1
@DJ Sadece değerlendirilmemiş girdileri okur, böylece her şeyi okur. Bir boşluk mu? Daha standart bir yaklaşım, değerlendirilen girdiyi bir dizi olarak almak ve daha sonra dize temsiline dönüştürmek olacaktır. Ama sonuç benim kodumla aynı olurdu, bu yüzden ayrımın gözlemlenemez olduğunu iddia ediyorum
Luis Mendo

3

Jöle , 2 bayt

ŒṘ

Tek bir karakter listesi veren bağımsız değişken olarak iki karakter listesinin bir listesini kabul eden monadik bir Bağlantı.

Çevrimiçi deneyin!

Nasıl?

Python'un dize temsilini basitleştirmek için yerleşiktir.



3

05AB1E , 2 bayt

₁ö

Çevrimiçi deneyin! Her dizeyi temel 256 tamsayı olarak yorumlar, sonra ikisini formda yazdırır [1, 2].


05AB1E, 1 bayt (bilinmeyen geçerlilik)

â

Çevrimiçi deneyin!

Girdinin kartezyen ürününü kendisi ile birlikte alır. Girdi içindeki tırnak işaretleri kaçmaz, bu da karışıklığa neden olabilir. 12'ye kadar olan tüm kombinasyonları acımasızca zorladım ", "ve "], ["herhangi bir çarpışma bulamadım; Ancak, daha uzun teller için herhangi bir çarpışma olmadığını kanıtlayamıyorum. Herhangi biri bir kanıt veya karşı örnek oluşturabilirse, bunu çok takdir ediyorum!

Önemsiz 0 byter, tırnak işaretleri kaçmadığından başarısız olur: girişler ( ", ", boş dize) ve (boş dize, ", ") her ikisi de çıktıyı verir ["", "", ""].

1 byter º(her giriş dizesini yansıtma) da bu nedenle başarısız olur: girişler ( ", "" ,", boş dize) ve (boş dize " ,"", ") her ikisi de çıktı verir ["", "" ,"", "" ,"", ""].


3

26 baytlı C # (Lukas Lang, Kevin Cruijssen ve Jo King sayesinde)

a=>b=>$"{a.Length}.{a}{b}"

tio.run lambda


1
Lütfen tio.run
Ver Nick,

Bu hala devam ediyor ("a <>", "b") ve ("a", "<> b") - ne olursa olsun girişleri birleştirirseniz tüm durumları işlemenin imkansız olduğunu unutmayın. arasına / etrafına koymak - bir şekilde dizeleri değiştirmeniz gerekir
Lukas Lang

1
Maalesef hala: ( "1", "11111111111") ve ( "11111111111", "1") - bu diğer yandan çalışır (ve hatta daha kısadır) Ne $"{a.Length}.{a}{b}"her zaman çıkarabilir - ave bbu herhangi olmadan belirsizlik (sadece ilk dek okunan .uzunluğunu elde etmek a, bdaha sonra dinlenme
Lukas Lang

1
@LukasLang Harika. Takipleriniz için teşekkürler.
Soleil

1
Çok teşekkürler @JoKing!
Soleil

2

Kömür , 12 bayt

⪫E²⭆⪪S"⪫""λ,

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

 E²             Repeat twice
     S          Input a string
    ⪪ "         Split it on `"`s
   ⭆            Map over each piece and join
       ⪫""λ     Wrap each piece in `"`s
⪫          ,    Join the two results with a `,`
                Implicitly print




1

CSS + HTML, 55 + 20 = 75 bayt

<code>Etiketlerden sonra HTML'deki girişleri sağlayın . Her girişten çıktıya harfleri tek tek görsel olarak enjekte eder. Bir giriş diğerinden daha uzun olduğunda, daha kısa girişin eksik harfleri için görsel boşluklar gösterilir. Ayrıca görsel çıktı tekliğini zorlamak için HTML'de bir virgül eklenir (umarım).

*{position:absolute;letter-spacing:9px}code>code{left:9px
<code>abcdefg<code>hijklmn</code>,



1

Perl 6 , 6 3 bayt

&dd

Çevrimiçi deneyin!

Nesne temsilini STDERR'a çıktılar.


Perl'e yeterince aşina değilim - burada boşluklar içeren bir dize nasıl girersiniz?
negatif yedi

2
@negativeseven böyle
Grimmy

@negativeseven Evet, üzgünüm, sadece dizelerin listeleri için bir kısayol sözdizimi kullanıyordum. Bunu tipik bir tarzda yapabilirsiniz["Hello, ", "World!"]
Jo King

1

Lua , 27 bayt

print(('%q%q'):format(...))

Çevrimiçi deneyin!

Tam program, argüman olarak girdi alın.

%qDahili güvenli telli motoru kullanmak için değiştirici kullandığından zsh yanıtından esinlenmiştir .

Ayrıca, sadece

('%q%q'):format

ama bunun kabul edilebilir bir cevap olup olmadığından emin değilim.


('%q%q'):formatÖrneğin bir değişkene atanabilecek bir nesne ile sonuçlanmadığı için ikinci geçerli olduğunu sanmıyorum . Sadece kendi başına bir sözdizimi hatasına neden olur. İki nokta üst üste sözdizimi sadece bir kısayoldur '%q%q'.format('%q%q', ...)ve Lua işlevler için kısmi uygulamaya izin vermez
Jo King

@JoKing Evet, haklısın, sanırım.
val diyor Reinstate Monica

1

sed , 19 bayt

N
s/ /. /g
s/\n/: /

Çevrimiçi deneyin!

N          # append the second string into the pattern space
s/ /. /g   # prefix all spaces with ".". Now ": " will not occur in the stiring
s/\n/: /   # replace the newline with ": "


1

C (gcc) , 59 bayt

Öneri için Grimy'e teşekkürler.

Bir dizi giriş dizesi alır (bunlardan "2" değeri bu deneme için doğru sayıdır) ve sondaki değerler de dahil olmak üzere karakter değerlerini yazdırır NUL. Teknik olarak, %ptarafından kullanılan formatlayıcı printfişaretçiler içindir, ancak nasıl göründükleri konusunda seçici değilseniz, rastgele tamsayıların onaltılık değerlerini görüntülemek için iyi çalışır!

f(s,t)char**s,*t;{for(;t=*s++;)for(;printf("%p",*t++)^5;);}

Çevrimiçi deneyin!


Güzel! İşte 59 .
Grimmy




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.