Kodunu oluşturun


36

İlgili: Make a; # tercüman

Yukarıdaki bağlantılı mücadelede görev, ezoterik dil için bir tercüman oluşturmaktı ;#.

;#dil

Dilin tam olarak iki komutu vardır: ;ve #(diğer tüm karakterler tercüman tarafından dikkate alınmaz):

;: Akümülatörü artırma

#: Akümülatörü 127'ye modulo yapın, karşılık gelen ASCII karakterini yazdırın ve akümülatörü 0'a sıfırlayın.

Meydan okuma

Tembel olduğum için hala bazı test testlerini test etmek istediğim için, düz metni ;#koda dönüştüren bir program veya işleve ihtiyacım var .

Giriş

Giriş, bağımsız değişken olarak veya stdin aracılığıyla alınan bir dizedir. Yalnızca yazdırılabilir ASCII karakterleri ve yeni satırları içerecektir.

Çıktı

Çıktı ;#döndürülerek veya stdout'a yazdırılarak oluşturulan programdır. Sürece program geçerli olduğu gibi, bu başka aşırı karakterler içerebilir #ve ;diğer tüm karakterler yoksayılır olarak.

Örnekler

Input: Hello, World!
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

Input: ABC
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

Input: ;#
Output: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#

Liderler Sıralaması


9
Parlak! Görmekten memnun oldum; # dikkat çekiyor!
Caird coinheringaahing

1
Çıktınızı burada test edebilirsiniz ; çünkü # +; # 'in bir üst kümesidir.
Adám

3
Çıktı ilave karakter içerebilir mi? ;#diğer tüm karakterleri yok sayar, böylece oluşturulan program çalışmaya devam eder.
Dennis,

2
@ Benoît: Modül, kod oluştururken alakasızdır, çünkü minimum sayı kullanan kodu oluşturmak her zaman daha kolaydır ;. İkincisi, 127, # dilinin özelliklerini içeren bağlantılı soruda belirtildiği gibi doğrudur.
Joey

2
Bu gerçekten nakil değil. "Generate #; code" daha iyi bir başlıktır. Bunu bununla değiştireceğim.
Mego

Yanıtlar:



34

; # + , 40 bayt

;;;;;~+++++++>~;~++++:>*(-(;~<#~):<#-*:)

Çevrimiçi deneyin! Giriş boş bir bayt ile sonlandırıldı.

açıklama

Kod iki bölüme ayrılmıştır: üretim ve yineleme.

nesil

;;;;;~+++++++>~;~++++:>

Bu, sabitleri ;ve #belleğe şu şekilde koyar :

;;;;;~+++++++>~;~++++:>
;;;;;                     set A to 5
     ~                    swap A and B
      +++++++             add B to A 7 times
                          (A, B) = (5*7, 5) = (35, 5)
             >            write to cell 0
              ~           swap A and B
               ;          increment A
                ~         swap A and B
                          (A, B) = (35, 6)
                 ++++     add B to A 4 times
                          (A, B) = (59, 6)
                     :    increment cell pointer
                      >   write to cell 1

tekrarlama

*(-(;~<#~):<#-*:)
*                    read a character into A
 (            * )    while input is not a null byte:
  -                  flip Δ
   (     )           while A != 0
    ;                decrement
     ~               swap A and B
      <              read ";" into A
       #             output it
        ~            swap A and B
           :         decrement cell pointer
            <        read "#" into A
             #       output it
              -      flip Δ
               *     take another character from input
                :    increment cell pointer

1
Tüm bunlar, sıkıldığımda yaptığım şaka diline ait. Koltuklarım kabardı.
Caird coinheringaahing

@RandomUser: D oynamak için eğlenceli bir konsepttir
Conor O'Brien

ha. Programın boş bir bayt;;
tuskiomi


@ ConorO'Brien, bunu programınıza nasıl girerim?
tuskiomi


12

Jöle , 10 8 7 bayt

O”;ẋp”#

Çevrimiçi deneyin!

O”;ẋp”#  Main Link
O        Map over `ord` which gets the codepoint of every character
 ”;ẋ     Repeat ';' the required number of times
     ”#  '#'
    p    Cartesian Product; this puts a '#' at the end of each element in the array

Implicit Output shows as a single string

@Emigna
-1 -2 bayt sayesinde @Dennis sayesinde 2 bayt


Onun O”;ẋ;€”#yerine yapabilir misin ?
Emigna

@Emigna Ah, evet, teşekkürler. Nasıl çalıştığını tam olarak anlamadım ama anlıyorum. Teşekkürler!
HyperNeutrino

4
;€olabilir p.
Dennis,

@Dennis Oh şimdi bunun nasıl çalıştığını anlıyorum. Teşekkürler! :)
HyperNeutrino

11

GS2 , 6 bayt

■•;2•#

Çevrimiçi deneyin!

Tersinir hexdump (xxd)

0000000: ff 07 3b 32 07 23                                ■•;2•#

Nasıl çalışır

■       Map the rest of the program over  all code points C of the input.
 •;         Push ';'.
   2        Multiply; repeat ';' C times.
    •#      Push '#'.

2
= ne halt?
Outgolfer Erik,

1
2çarpım komutu nedir? GS2 garip: P
ETHproductions

1
@EriktheOutgolfer, girişin her karakterinin kod noktası olan o_O kodunu çalıştırır
Bay Xcoder

@EriktheOutgolfer Bu, olduğundan çok daha hoş geliyor. sadece harita ve GS2 tamsayıların listesi olarak dizeleri uygular.
Dennis,

@ETHproductions GS2 karakter tabanlı değil; kaynak kodunu ham bayt akışı olarak yorumlar ve genellikle komut ile byte'ın kodladığı CP-437 karakteri arasında bağlantı yoktur. X86_64 bayt kodunda, 2XOR ...
Dennis,

10

Taksi, 779 bayt

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Chop Suey.Go to Chop Suey:n 1 r 1 l 4 r 1 l.[c]Switch to plan "e" if no one is waiting.Pickup a passenger going to Charboil Grill.Go to Charboil Grill:n 1 l 3 l 3 l.Pickup a passenger going to The Underground.Go to Writer's Depot:w 1 r.[p]; is waiting at Writer's Depot.Pickup a passenger going to Post Office.Go to Post Office:n 1 r 2 r 1 l.Go to The Underground:n 1 r 1 l.Switch to plan "n" if no one is waiting.Pickup a passenger going to The Underground.Go to Zoom Zoom:n 3 l 2 r.Go to Writer's Depot:w.Switch to plan "p".[n]# is waiting at Writer's Depot.Go to Writer's Depot:n 3 l 2 l.Pickup a passenger going to Post Office.Go to Post Office:n 1 r 2 r 1 l.Go to Chop Suey:n 1 r 1 l 4 r 1 l.Switch to plan "c".[e]

Çevrimiçi deneyin!

Ungolfed:

Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to Chop Suey.
Go to Chop Suey: north 1st right 1st left 4th right 1st left.
[c]
Switch to plan "e" if no one is waiting.
Pickup a passenger going to Charboil Grill.
Go to Charboil Grill: north 1st left 3rd left 3rd left.
Pickup a passenger going to The Underground.
Go to Writer's Depot: west 1st right.
[p]
; is waiting at Writer's Depot.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st right 2nd right 1st left.
Go to The Underground: north 1st right 1st left.
Switch to plan "n" if no one is waiting.
Pickup a passenger going to The Underground.
Go to Zoom Zoom: north 3rd left 2nd right.
Go to Writer's Depot: west.
Switch to plan "p".
[n]
# is waiting at Writer's Depot.
Go to Writer's Depot: north 3rd left 2nd left.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st right 2nd right 1st left.
Go to Chop Suey: north 1st right 1st left 4th right 1st left.
Switch to plan "c".
[e]

Açıklama:

Pick up stdin and split it into characters.
Covert each character to ASCII.
Print ";" as you count down from that ASCII to zero.
Print "#".
Pickup the next character and repeat until done.

+1 Sadece böyle ve Mornington Crescent gibi dilleri seviyorum, kod çok güzel!
Karl-Johan Sjögren

9

05AB1E , 8 bayt

Ç';×'#«J

Çevrimiçi deneyin!

açıklama

Ç          # convert each input char to its ascii value
 ';×       # repeat ";" those many times
    '#«    # append a "#" to each run of semi-colons
       J   # join to string

9

Brainfuck, 43 bayt

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

Boş bayt programı sonlandırır.

açıklama

+[+[<]>->++]          59 (semicolon) location 5
--[>--<+++++++]>-       35 (hash) location 7
<,[                     input location 6
    [   while input byte not 0
        <.>     print semicolon
        -       decrement input byte
    ]
    >.< print hash
,]  loop while input not null

Brainf * ck için etkileyici derecede küçük.
MD XF

neredeyse python cevabı ile yarışıyor. Etkileyici.
radd0


5

> <> , 22 bayt

i:0(?;\"#"o
o1-:?!\";"

Çevrimiçi olarak veya balık oyun alanında deneyin

Giriş STDIN, çıkış STDOUT. > <> 'Da, karakterler ve ASCII kodları aynı şeydir, bu yüzden tek yapmamız gereken bir karakteri okumak, ";"0 olana kadar karakteri yazdırmak ve azaltmak, daha sonra "#"daha fazla giriş kalmadan yazdırmak ve döngü yapmaktır .


5

F #, 79 bayt

let c i=System.String.Join("#",Seq.map(fun c->String.replicate(int c)";")i)+"#"

Çevrimiçi deneyin!

Expanded

// string -> string
let convert input =
    System.String.Join(
        "#",      // join the following char seq with "#"
        input     // replicate ";" n times where n = ASCII value of char c
        |> Seq.map (fun c-> String.replicate (int c) ";") 
    ) + "#" // and add the last "#" to the output

convert giriş dizesini alır ve bir; # program çıktısı alır

kullanım

convert "Hello, World!" |> printfn "%s"
convert "ABC" |> printfn "%s"
convert ";#" |> printfn "%s"

4
Daha fazla F # cevabına ihtiyacımız var
aloisdg diyor Reinstate Monica

@aloisdg Elimden geleni yapacağım :)
Brunner


5

PowerShell, 29 27 25 bayt

$args|% t*y|%{';'*$_+'#'}

Oldukça basit. Komut satırı argümanı olarak girdi alır. Çıktı, istenen metni basan geçerli bir programdır.


Sonuç dizgilerine katılması gerekir.
mazzy

@mazzy: Görev tanımıyla: »Sürece program geçerli olduğu gibi, bu başka aşırı karakterler içerebilir #ve ;diğer tüm karakterler yoksayılır olarak«.
Joey

istediğiniz gibi :-)
mazzy

tırnak işaretleri kaldırılabilir. $argsyeterlidir.
mazzy

Argüman sayısal değilse.
Joey,

4

brainfuck , 47 bayt

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

Çevrimiçi deneyin!

Ayrıca bakınız: ovs'nin cevabı , benzer bir yaklaşım sergiler , ancak farklı bir sabit üretme yöntemi ve farklı bir hücre düzeni ile.


Açıklama:

Bu zorluk, beyin fırtınası konusundaki spekülasyonlarla oldukça uyumludur, yani çözüm esasen önemsizdir. Brainfuck, ASCII değerleri olarak girdiyi alır;

Transpiling için şematik basittir: ASCII değerini oluşturmak ;ve #yazdırmak ;Girilen karakterin ASCII değerine eşit, baskı #her giriş için, tekrarı.

+++++++[-             7
         >++++++++       * 8 = 56
         >+++++<<        * 5 = 35 (#)
       ]>+++<                  56 + 3 = 59 (;)
,[                    Input into first cell
  [>.<-]              Print ;'s equal to ASCII input
  >>.<<,              Print one #
 ]                    End on EOF

-2 Bayt Yalnızca negatif hücrelerden kaçınırsanız -1
Jo King

4

Mathematica, 49 bayt

StringRepeat[";",#]<>"#"&/@ToCharacterCode@#<>""&

açıklama

görüntü tanımını buraya girin

Giriş dizesini karakter kodlarının listesine dönüştürür, ardından listedeki Mapişlev StringRepeat[";",#]<>"#"&, ardından StringJoinsonuç boş dizeyle sonuçlanır.


Neden ihtiyacın var <>""?
Hesap MakinesiFeline

@CalculatorFeline O olmasaydı, her karakter için dizelerin bir listesi kalırdı. StringJoining ( <>) boş dize her dizeyi birleştirir.
ngenis,

Bunu unuttum: P
Hesap MakinesiFeline

3

Aseto , 19 bayt

Aceto'da bir tercüman olduğu için, bu zorluğa da bir Aceto cevabı olduğunu düşündüm. 2. sıradaki Hilbert eğrisine tam olarak uyuyor:

\n;*
'o'p
`!#'
,dpO

Öncelikle, tek bir karakter ( ,) okur ve onu yeni bir satır olup olmadığını test etmek için kopyalar ve reddederiz (yeni bir satır d!okurken, boş bir karakter normalde yığına basılır). Daha sonra, newline davasını kompakt bir şekilde ele almak için oldukça akıllıca bir numara olduğunu düşünüyorum:

`'\n

Yığında değeri ise True(bir yeni satır oku), bu kod aracı: yok ( `), yığın (bir karakter hazır koymak 'bir satır ise),: \n.

Yığın değeri ise False(biz bir yeni satır okumadım), bu kod vasıtası: yok ( `) bir karakter değişmezi okumak ( '). Bu, bir sonraki karakterin komut olarak yürütüldüğü anlamına gelir. Neyse ki, ters eğik çizgi sonraki komuttan kaçar (çalıştırılmaması için yapar), yani nyeni bir satır yazdırmaz ( ngenellikle ne yapar).

Kodun geri kalanı basittir; biz onun Unicode kod noktasıyla (bir tam sayıya yığın karakteri dönüştürmek o), biz itmek değişmez noktalı virgül ( ';), (dize ile çarpın sayı *, Python gibi) p(bir hazır itin sonucu Rint ') #, pbunu Rint Ben de Oteçhizata geri dön.

-FAnında sonuçları görmek istiyorsanız, ile çalıştırın (çünkü arabelleğe alma), ancak bu olmadan da çalışır.


3

Perl, 24 bayt

s/./";"x(ord$&)."#"/ges

İle koş perl -pe.

Alternatif çözüm:

say";"x ord,"#"for/./gs

İle koş perl -nE.


3

11 bayt Solace

Yay, yeni diller.

';@jx{'#}Ep

açıklama

';           Push the code point of ';' (59).
  @j         Push the entire input as a list of code points.
    x        For each code point in the input, repeat 59 that many times.
     {  }E   For each resulting list of 59s:
      '#      Push the code point of '#' (35).
          p  Flatten and print as unicode characters.

3

Fourier , 19 bayt

$(I(`;`&j)`#`0~j&i)

FourIDE'da dene!

Çalıştırmak için giriş dizesini tırnak içine almanız gerekir.

Açıklama sözde kodu

While i != Input length
    temp = pop first char of Input
    While j != Char code of temp
        Print ";"
        Increment j
    End While
    Print "#"
    j = 0
    Increment i
End While


3

JavaScript, 55 54 51 50 48 bayt

s=>1+[...s].map(c=>";".repeat(Buffer(c)[0])+"#")

Çevrimiçi deneyin

  • Neil sayesinde 1 byte kaydedildi .

Alternatifler

Bireysel karakter dizisi olarak girdi alabilirsek 5 byte kaydedilebilir.

a=>1+a.map(c=>";".repeat(Buffer(c)[0])+"#")

Ayrıca bir dizi olarak çıktı verebilirsek 2 bayt daha kaydedilebilir.

a=>a.map(c=>";".repeat(Buffer(c)[0])+"#")

\nolmalı ;;;;;;;;;;#.
Neil

Hmm ... bu garip. Sanırım daha uzun bir çözüme geri dönmek zorunda kalacağım. Teşekkürler, @Neil.
Shaggy

2
Ben değiştirmek düşünüyorum .için [^], hangi hala daha bir bayt kısa bırakacaktı map/join?
Neil

Evet, bu iş yaptı, @Neil :)
Shaggy

Sadece bir kafa yorucu, join()önceki cevabınız için şartname gerekmediğinde gereksizdi ;#ve ikinci öneri biraz gergin olsa da, işlev girişinizin bir karakter dizisi olduğunu açıklayabilirsiniz. Her iki durumda da, bu sizi en fazla 48 bayta indirir.
Patrick Roberts

2

Aslında , 11 bayt

O⌠';*'#o⌡MΣ

Çevrimiçi deneyin!

Açıklama:

O⌠';*'#o⌡MΣ
O            convert string to list of ASCII ordinals
 ⌠';*'#o⌡M   for each ordinal:
  ';*          repeat ";" that many times
     '#o       append "#"
          Σ  concatenate

2

APL (Dyalog) , 18 bayt

'#',¨⍨';'⍴¨⍨⎕UCS

Çevrimiçi deneyin!

⎕UCS Unicode kod noktalarına dönüştürme

';'⍴¨⍨Bir noktalı virgül  yeniden biçimlendirmek için her kod noktasını kullanın ( = RhoR ; R eshape)

#',¨⍨ her dizeye bir karma ekle


2

Ruby, 28 25 bayt

24 bayt, ayrıca -nart arda çalıştırmak için komut satırı anahtarı stdin.

$_.bytes{|b|$><<?;*b+?#}

3 byte kaydedildi (ve çıktı yeni hatlarda düzeltildi!) İnsan yapımı sayesinde.


Sen kullanımını önlemek olabilir .ordkarakter kodları ile doğrudan çalışarak: $_.bytes{|b|$><<?;*b+?#}. Arada fark var: bu da girdideki yeni satırı kodlar. Soru sahibinin “Yalnızca yazdırılabilir ASCII karakterleri ve yeni satırlar içerecektir” diyerek ne demek istediğinden emin değilim, ancak bana göre yeni satırlar gibi sesler de kodlanmalıdır.
Manatwork

Ruby-fu'nuz benimkiyi aşıyor, @ yapay işi - unutmuşum bytes. OP'den en yeni satırlardan bahsettim ve bunu daha sonra düzenleyeceğim.
Chowlett


2

Alice , 12 bayt

'#I.h%&';d&O

Çevrimiçi deneyin!

açıklama

'#    Push 35, the code point of '#'.
I     Read a code point C from STDIN. Pushes -1 at EOF.
.h%   Compute C%(C+1). For C == -1, this terminates the program due to division
      by zero. For C > -1, this just gives back C, so it does nothing.
&';   Pop C and push that many 59s (the code point of ';').
d     Push the stack depth, which is C+1.
&O    Print that many code points from the top of the stack.
      The IP wraps around to the beginning and another iteration of this
      loop processes the next character.

2

PHP, 48 bayt

for(;$c?:~$c=~ord($argn[$i++]);)echo";#"[!++$c];

2

jq, 30 karakter

(26 karakter kod + 4 karakter komut satırı seçenekleri)

explode|map(";"*.+"#")|add

Örnek çalışma:

bash-4.4$ jq -Rr 'explode|map(";"*.+"#")|add' <<< 'Hello, World!' | jq -Rrj '[scan(".*?#")|gsub("[^;]";"")|length%127]|implode'
Hello, World!

Çevrimiçi test



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.