* İçin bir tercüman yaz


20

Görev basit. Dil için bir tercüman yazın * .

İşte wiki'ye daha büyük bir bağlantı.

Yalnızca üç geçerli * program vardır:

  • * "Merhaba Dünya"
  •  *  0 ile 2.147.483.647 arasında rastgele bir sayı yazdırır
  • *+* Sonsuza kadar çalışır.

Üçüncü durum, bu sorudaki spesifikasyonlara göre sonsuz bir döngü olmalıdır

Giriş:

  • Giriş, standart I / O kurallarımızla kabul edilebilir herhangi bir giriş yöntemi ile alınabilir
  • Her zaman yukarıdaki programlardan biri olacak

Çıktı:

  • İlk kasa tam olarak Hello World, izleyen satır sonu olsun veya olmasın yazdırılmalıdır .
  • İkinci durumda, dilinizin maksimum tam sayısı 2.147.483.647'den küçükse, dilinizin maksimum tamsayısını kullanın
  • Birinci ve ikinci durumlar, standart I / O kurallarımızla kabul edilebilir herhangi bir çıktıya yazdırabilir.
  • Üçüncü durum herhangi bir çıktı vermemelidir.

puanlama:

Bu , bayt cinsinden en kısa cevap kazanır.


7
'Arasında 0ve 2,147,483,647' derken , bu kapsayıcı mı yoksa münhasır mı? (Örneğin, 0geçerli bir çıktı mı?)
Chas Brown

7
Bir meydan okuma gönderdikten sonra mevcut özellikleri değiştirmek ve mevcut çözümleri geçersiz kılmak -1benden otomatik bir işlemdir .
Shaggy

2
Rastgele bir sayı üretmenin yerleşik bir yolu olmayan diller için, "rastgele bir sayı yazdır" gereksinimini karşılamanın kabul edilebilir bir yolu var mı?
Tanner Swett

2
Eğer dilimizin tamsayıları maksimum yoksa veya daha yüksekse, daha yüksek bir üst sınır kullanabilir miyiz?
Jonathan Allan

7
@Shaggy Soru için wiki'de herhangi bir kural değişikliği görmüyorum, sadece kırılmayan bir alana (işaretleme sekmesini kontrol edin) bir boşluk görmüyorum, çünkü SE markdown oluşturucu bunu oluşturmadı, ancak orijinal revizyona bakıyor , normal boşluklar olması gerektiği açıktır ve "hack" yalnızca SE işaretleme oluşturucu sorunları için yapılır
Ferrybig

Yanıtlar:


20

* , 0 bayt


* Girdiyi okuma yolu olmadığından, varsayılan kurallar girdinin programa birleştirilerek verilmesi gerektiğini belirtmeye izin verir .

(... Bence. Doğrulamak için temsilci olmadığım bir "en az iki kez upvotes kadar upvotes" durumu var).


4
Bağlantılı meta, gerçekten şu anda kabul edilen bir site standardıdır (+31-7).
Jonathan Allan

2
@A__: Bana öyle geliyor ki birisinin önerilen 'programlama dili' tanımını karşılamak için özel olarak tasarlanmış olması gerekiyor ("Merhaba dünya yazabilirsiniz!" "Sonsuz bir döngü yazabilirsiniz!" " her zaman aynı şeyi yapmayın! ").
Henning Makholm

Teknik olarak Malbolge'un o zamanlar bir programlama dili olmadığına inanıyorum.
Bob Jansen

1
Malbolge, * ve örneğin Befunge-93 ile aynı olan sonlu otomatalar için programlama dilidir. Bu nedenle Malbolge, programlama dili tanımlaması söz konusu olduğunda (resmi diller daha az güçlü olsa da), teknik olarak * ile aynı, özyinelemeli olarak numaralandırılabilir dillerle aynı olan resmi programlama dilidir.
Krzysztof Szewczyk

Benden aşağı oy, çünkü dürüst olmak gerekirse, bu cevap o kadar sıkıcı ki, zaten bir Standart Loophole , hatta * bir programlama dili olup olmadığı sorusunu göz ardı etsek bile
AlienAtSystem

8

R , 69 bayt

switch(scan(,""),"*"="Hello, World!"," * "=sample(2^31,1)-1,repeat{})

Çevrimiçi deneyin!

switchadlandırılmış bağımsız değişkenleri eşleştirmeye çalışır ve eşleşme yoksa, ilk addan sonra ilk adlandırılmamış olanı seçer, bu durumda sonsuz döngü olur repeat{}.


6

Jöle ,  21  20 bayt

ḊOSØ%HX’¤“½,⁾ẇṭ»¹Ḃ¿?

Karakterlerin listesini kabul eden monadic bir bağlantı.

Çevrimiçi deneyin!

vL’... ayrıca çalışır (aşağıya bakınız).

Nasıl?

ḊOSØ%HX’¤“½,⁾ẇṭ»¹Ḃ¿? - Link: list of characters   e.g.: "*"        or  " * "    or  "*+*"
Ḋ                    - dequeue                          ""             "* "         "+*"
 O                   - to ordinals                      []             [42,32]      [43,42]
  S                  - sum                              0              74           85
                   ? - if...
                  ¿  - ...if-condition: while...
                 Ḃ   -    ...while-condition: modulo 2  0              0            1
                ¹    -    ...while-true-do: identity                                85
                     -                                  0              74           (looping)
        ¤            - ...then: nilad followed by link(s) as a nilad:
   Ø%                -    literal 2^32                                 2^32
     H               -    half                                         2^31
      X              -    random integer in [1,n]                      RND[1,2^31]
       ’             -    decrement                                    RND[0,2^31)
         “½,⁾ẇṭ»     - ...else: dictionary words        "Hello World"

Alternatif

vL’... - Link: list of characters                 e.g.: "*"        or  " * "    or  "*+*"
 L     - length                                         1              3            3
v      - evaluate (left) as Jelly code with input (right)
       -                                                1^1            3^3          (3^3+3)^3
       -                                                1              27           27000
  ’    - decrement                                      0              26           26999
   ... - continue as above                              "Hello World"  RND[0,2^31)  (looping)

5

C (gcc) , 66 63 bayt

-3 baytlık attinat'a teşekkürler.

Sadece ikinci karakteri kontrol etmeliyim: LSB ayarlanmışsa, bu bir +(dolayısıyla program " *+*") ve program döngüler. Bundan sonra, eğer bir NUL" *" " programıydı ve görüntülüyoruz Hello World; aksi takdirde, rastgele bir değer görüntüler ("  * ", kalan diğer tek seçenek.)

f(char*s){for(s++;*s&1;);printf(*s?"%d":"Hello World",rand());}

Çevrimiçi deneyin!



Bir bayt tıraş:f(char*s){*++s&1?f(s-1):printf(*s?"%d":"Hello World",rand());}
Roman Odaisky

Bilgiçlik taslağı: randyeterince büyük bir değer getireceği garanti edilmez; RAND_MAXve INT_MAX(örneğin, Visual Studio'nun ve gerçek dünya derleyicilerde olmayan aynı olması garanti edilmez RAND_MAXolduğunu 32767iken, INT_MAXolduğu [Modern x86 üzerinde sistemlerini türetilen] 2147483647OP'ın söz belirtilen değer).
ShadowRanger

@ShadowRanger tamamen doğru, ancak tüm C tabanlı CGCC girişlerinin>% 90'ının tanımsız ve belirtilmemiş davranışa bağlı olduğu düşünüldüğünde bunun için endişelenmiyorum! Ayrıca bugün kodlu bir LCG uygulamak gibi hissetmedim. :-)
ErikF

5

Python 2 , 103 93 89 87 bayt

Ben Chas Browns en yaptığım önceki cevabı kombine cevap ve birkaç bayt kısa bir şey var.

Rastgele sayı 0 ile 2 ** 31-1 arasında olacaktır.

from random import*
i=input()
while'*'<i:1
print["Hello World",randrange(2**31)][i<'!']

Çevrimiçi deneyin!

Önceki sürümler:

103 bayt

from random import*
exec['print"Hello World"','while 1:1','print randint(0,2**31-1)'][cmp(input(),'*')]

93 bayt

from random import*
i=cmp(input(),'*')
while i>0:1
print["Hello World",randint(0,2**31-1)][i]

Değiştirerek 2 bayt kaydet randint(0,2**31-1)ile randrange(2**31).
Chas Brown

while'*'<i2 kaydeder
Jonathan Allan

Değiştirerek başka byte kaydet randrange(2**31)için getrandbits(31)(ikinci döner long, değil intama printyazdırılacaktır strformu değil reprsondaki böylece form Lolmayacak).
ShadowRanger

Site ile nispeten deneyimsiz, bu yüzden hızlı açıklama: Girişinizin alıntılanmasını zorunlu kılıyor musunuz? i=input()yalnızca girdiler alıntılanırsa çalışır, yalnızca düz girdiyseniz */ * /*+*, bir ile ölür SyntaxError(çünkü inputbir örtük içerir eval); girmeniz gerekir '*'/' * '/'*+*'(veya bunun yerine çift tırnak ile eşdeğer). Buna izin verecek standart I / O kurallarındaraw_input() , dört bayta mal olacak, kullanmanız gerekebileceği anlamına gelebilecek hiçbir şey görmedim .
ShadowRanger

@ShadowRanger input()girdi olarak bir dize alır ve değerlendirir. Gerçekten girdiye eklemiyorum, sadece girdi olarak bir dize alıyorum ve dizeleri tırnak var. Bu oldukça standart, [1,2,3]ben daha sonra bölmek ve ayrıştırmak zorunda sınırlandırılmış bir dize yerine gibi bir dizi alabilir aynı şekilde . Sitenin amacı girdiyi katılaştırmak değil, eldeki zorluğa odaklanabilmemiz için G / Ç'yi kolaylaştırmaktır.
mbomb007

5

Fıçı , -lp, -ir 30 26 25 24 20 19 bayt

!1=[_“H%c¡“| =[~.|{

-1 bayt bayrak kullanma

Çevrimiçi deneyin!

Yanıt Geçmişi

?!1=[_“H%c¡“| =[~.|{

Çevrimiçi deneyin!

Hello WorldSözlük dizesine kısaltılmış

!1=[_Hello World| =[~.|{

Çevrimiçi deneyin!

Keg'in gücüne hayran kalmayı hiç bırakmadım. Başka bir bayt için EdgyNerd kullanıcısına kaydedilen krediler.

Önceki Sürümler

_!0=[Hello World|\*=[~.|{

Çevrimiçi deneyin!

Kaydedilen ekstra bayt için A__ kullanıcısına kredi.

Eski versiyon

?!1=[_Hello World| =[__~|{

Temel olarak, giriş programını alır ve:

  • Giriş uzunluğunun 1 olup olmadığını kontrol eder, doğruysa "Merhaba Dünya" yazdırır
  • Son karakterin boşluk olup olmadığını kontrol eder ve rastgele bir sayı yazdırır
  • Aksi takdirde sonsuz bir döngü çalıştırır

Sonra yığını örtük olarak yazdırın.

?                               #Get input from the user
 !1=                            #Compare the stack's length to 1
    [_Hello World           #Push "Hello, World!" to the stack
                     | =        #See if top item is a space
                        [__~|{  #If so, generate a random number, otherwise, infinite loop.

Merhaba dünya, noktalama işaretlerine ihtiyaç duymadığı için 4 bayt kurtardı.

Çevrimiçi deneyin! Eski versiyon

Çevrimiçi deneyin! Yeni sürüm


4 bayt kesebilirsiniz, "Merhaba Dünya" daki virgül veya ünlem işaretine ihtiyacınız yoktur.
TheOnlyMrCat

1
Şimdi buradaki zorluklara normal olarak cevap verebilmek için popüler olmayan başka bir dil öğrenmem gerekiyor.
A̲̲

1
-1 bayt: TIO . Keg'de golf yapma yeteneğimi kaybetmediğime sevindim.
A̲̲

@A__ Keg TIO'da olmaktan hoşlanıyor mu?
Jono 2906


3

Befunge-93 , 54 bayt

~"*"-_~1+#^_"dlroW olleH">:#,_@.%*2**:*::*88:*`0:?1#+<

Çevrimiçi deneyin!

Açıklamalı:

~"*"-                      _                ~1+                   #^_        "dlroW olleH">:#,_    @      .%*2**:*::*88:   *`0:             ?1#+<
Compare first      If equal, go right       Compare second       If equal,        Output          Exit    Modulo by 2^31   If less than      Add 1
character to       Otherwise, go left       character to       loop forever   "Hello World"                 and output     0, multiply     a random amount
'*'                and wrap around          -1 (EOF)                                                                         by 0            of times

Rasgelelik tekdüze değil. Her artışta% 50'lik bir artışı durdurma şansı vardır.


3

Japt , 22/25 bayt

İlk çözüm, *<space>ikinci program olarak kullanılan orijinal spesifikasyon ve diğeri, <space>*</space>önerilen "düzeltme" için EoI sayesinde, keyfi olarak değiştirilen güncellenmiş spesifikasyon içindir.

Her ikisi de üçüncü programın sonsuz döngüsüne girdikten sonra bir taşma hatası atar, ancak teorik olarak, (bellek amaçları için varsayabileceğimiz) yeterli hafıza ile sonsuza kadar çalışır.

Å?¢?ß:2pHÉ ö:`HÁM Wld

Program 1
deneyin Program 2
deneyin Program 3 deneyin

Å?UÎ>S?ß:2pHÉ ö:`HÁM Wld

Program 1
deneyin Program 2
deneyin Program 3 deneyin


Ben ikinci programı "[SPACE] * [SPACE]" değil "[SPACE] *", programınız işi değil bu yüzden olduğunu düşünüyorum
Düzenleme Cahiliyye

@EmbodimentofIgnorance, ben yayınlanmıştır zamanda spec ikinci programı oldu *<space> . Şimdi güncelleme zamanınız yok.
Shaggy

Sen üç bayt düzeltebilirim UÌ>Syerine ¢ikinci üçlü üzerine
Düzenleme Cahiliyye

@Downvoter, lütfen yorum bırakmak için nezaketiniz var.
Shaggy

2

JavaScript (ES7), 66 bayt

s=>s[1]?s<'!'?Math.random()*2**31|0:eval(`for(;;);`):'Hello World'

Çevrimiçi deneyin! (Selam Dünya)

Çevrimiçi deneyin! (rastgele sayı)

Çevrimiçi deneyin! (sonsuz döngü)


Misiniz x=(z=>x())&&x()hiçbir maksimum çağrı yığını boyutu ile bir tarayıcı varsayarak sonsuz döngü kodundan -1byte için çalışmıyor?
Geza Kerecsenyi

@GezaKerecsenyi Sadece kendimizi arayabiliriz ( böyle ) ama bunun kabul edilebilir olacağından emin değilim.
Arnauld

bu adil. Orada sadece devam ediyor bazı belirsiz tarayıcı olup olmadığını merak ediyorum (en azından, RAM bitene kadar)
Geza Kerecsenyi

1
@ Teorik olarak, bu sonsuza kadar sonsuz golf verilen kod golf için varsayabilir çalıştırmak.
Shaggy

2

Jöle , 23 21 bayt

OS¹Ḃ¿ịØ%HX’;““½,⁾ẇṭ»¤

Çevrimiçi deneyin!

Tek bir argüman alan ve geri dönen monadik bir bağlantı Hello World , rastgele 31 bit tam sayı veya spesifikasyona göre sonsuz döngü yapan .

Tüm seçenekler: * * *+*

açıklama

O                     | Convert to codepoints
 S                    | Sum
  ¹Ḃ¿                 | Loop the identity function while odd 
     ị              ¤ | Index into the following as a nilad:
      Ø%              | - 2 ** 32
        H             | - Halved
         X            | - Random integer in the range 1..2**31
          ’           | - Decrease by 1 
           ;          | - Concatenated to:
            ““½,⁾ẇṭ»  |   - "", "Hello World"








1

Odun kömürü , 30 bayt

W№θ*F⁼θ*≔Hello Worldθ∨θI‽X²¦³¹

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Kötüye Kullanımlar Kömürün yalnızca bir satır varsa boşluklara ayrılan varsayılan girdi biçimi, bu nedenle rasgele sayı girişi aslında üç girişe benziyor. Açıklama:

W№θ*

İlk giriş a içerirken işlemi tekrarlayın *.

F⁼θ*

İlk giriş *sadece ...

≔Hello Worldθ

... sonra ile değiştirin Hello World, böylece döngünün sona ermesine neden olun. *+*değiştirilmez ve sonsuz bir döngüye neden olur.

∨θ

İlk giriş boş değilse çıktı alın.

I‽X²¦³¹

Ancak boşsa, istenen aralıkta rastgele bir tam sayı çıktılayın.


1

++ , 78 bayt ekle

z:"Hello World"
`y
xR2147483647
x:?
a:"*"
b:" * "
c:"*+*"
Ix=a,Oz
Ix=b,O
Wx=c,

Çevrimiçi deneyin!

açıklama

z:"Hello World"	; Set z = "Hello World"
`y		; Set y as the active variable
xR2147483647	; Set y to a random number between 0 and 2147483647
x:?		; Set x to the input
a:"*"		; Set a = "*"
b:" * "		; Set b = " * "
c:"*+*"		; Set c = "*+*"
Ix=a,		; If x == a then...
	Oz	;	...output z
Ix=b,		; If x == b then...
	O	;	...output y
Wx=c,		; While x == c then...
		;	...do nothing

1

Brachylog , 26 23 bayt

l₃∈&hṢ∧2^₃₁-₁ṙw∨Ḥ⊇ᶠ³⁶tw

Çevrimiçi deneyin!

Programı girdi değişkeni aracılığıyla bir dize olarak alır ve çıktı değişkenini yok sayar. Girdinin üç geçerli programdan yalnızca biri olduğu garantisini büyük ölçüde kullanır: herhangi bir uzunluk-üç girdi, ya ilk karakterin boşluk olup olmamasına bağlı olarak ya " * "da "*+*"diğer girdiler gibi davranacaktır "*".

l₃                         The input has length 3
  ∈                        and is an element of something,
   &h                      and the input's first element
     Ṣ                     is a space
  ∈                        (if not, try some other thing it's an element of),
      ∧2^₃₁-₁              so take 2,147,483,647 and
             ṙw            print a random number between 0 and it inclusive.
               ∨           If the input's length isn't 3,
                Ḥ⊇ᶠ³⁶tw    print the 36th subsequence of "Hello, World!".

Hata! Yanlış "Merhaba Dünya" - şu anda düzeltme
İlişkisiz String

1

PHP , 51 bayt

for(;'*'<$l=$argn[1];);echo$l?rand():'Hello World';

Çevrimiçi deneyin! (Selam Dünya)

Çevrimiçi deneyin! (Rastgele Sayı)

Çevrimiçi deneyin! (Sonsuz döngü)

Olabilir girişinin ikinci karakterini Alır '', '*'ya '+'. Durumunda başka, gerçek olacak ve döngü sonsuz olacak, döngü sonra, "Merhaba Dünya" ya bir rastgele sayı gösterilir. Otomatik olarak 0 ve arasında bir sayı üretir tanımlanan kullanımlar standart C kütüphanesinde ve varsayılan olarak TIO dahil olmak üzere en platformlar / ortamlarına.'+''*'<'+'rand()getrandmax()RAND_MAX2147483647


1

05AB1E , 21 bayt

'*KgDi[ë<ižIL<Ω딟™‚ï

Çevrimiçi deneyin.(NOT: Rastgele yapı büyük listelerde oldukça yavaştır, bu nedenle sonuç verilmeden önce biraz zaman alabilir.)

Açıklama:

'*K           '# Remove all "*" from the (implicit) input
   g           # Get the length of what's remain (either 0, 1, or 2)
    D          # Duplicate this length
     i         # If the length is exactly 1:
      [        #  Start an infinite loop
     ë<i       # Else-if the length is 2:
        žI     #  Push builtin 2147483648
          L    #  Create a list in the range [1,2147483648]
           <   #  Decrease each by 1 to make the range [0,2147483647]
            Ω  #  Pop and push a random value from the list
               #  (after which the top of the stack is output implicitly as result)
     ë         # Else:
      ”Ÿ™‚ï    #  Push dictionary string "Hello World"
               #  (after which the top of the stack is output implicitly as result)

Neden ”Ÿ™‚ïolduğunu anlamak için bu 05AB1E bahşişime bakın ( sözlük nasıl kullanılır? )"Hello World" .


1

Pyth , 32 bayt

It/Jw\*#;?tlJOhC*4\ÿ"Hello World

Çevrimiçi deneyin!

Açıklama (Python-ish)

I                                   # if 
  /Jw\*                             #    (J:=input()).count("*"))
 t                                  #                             - 1:
       #;                           #     try: while True: pass;except: break;
         ?                          # if (ternary)
           lJ                       #    len(J):
             O                      #     randInt(0,                    )
               C                    #                int(     , 256)
                *4\ÿ                #                    4*"ÿ"
              h                     #                                + 1
                    "Hello World    # else: (implicitly) print "Hello World"

Bu, 0 ile 2 ^ 31 değil, 0 ile 2 ^ 32 arasında bir sayı yazdırır. Yazma için daha kısa bir yol hC*4\ÿolduğunu ^2 32, ancak çözüm doğru olduğu için sırayla, kullanmak gerekir ^2 31bunun yerine. Ayrıca, zyerine kullanmak Jw, 1 bayt daha kaydeder. Ve açıklamanız daha tönce çizgiyi atlıyor lJ.
randomdude999

Ayrıca, girdinin herhangi bir +karakter içerip içermediğini kontrol ederek "sonsuza kadar döngü" komutunu algılayabilir, 1 bayt kaydeder, çünkü onu azaltmanıza gerek yoktur.
randomdude999

0

APL (Dyalog Unicode) , 39 bayt SBCS

Anonim önek lambda.

{'+'∊⍵:∇⍵⋄' '∊⍵:⌊2E31×?0'Hello World'}

Çevrimiçi deneyin!

{ "DFN"; argüman:

'+'∊⍵: plus, bağımsız değişkenin bir üyesiyse:

  ∇⍵ tartışma üzerine kuyruk çekişi

' '∊⍵ boşluk argümanın bir üyesiyse:

  ?0 rastgele şamandıra (0–1)

  2E31× ölçeklendir (0–2³¹)

   zemin

'Hello World' başka dizeyi döndür


0

Commodore BASIC (VIC-20, C64, TheC64Mini vb.) - 170 BASIC bayt belirteci

 0a%=32767:goS9:b$=leF(b$,len(b$)-1):ifb$="*"tH?"hello world
 1ifb$=" * "tH?int(rN(ti)*a%)
 2ifb$="*+*"tHfOi=.to1:i=.:nE
 3end
 9b$="":fOi=.to1:geta$:i=-(a$=cH(13)):b$=b$+a$:?a$;:nE:reT

Bunu daha doğru yapmayı düşünüyorum, 6502 montaj dilinin garip dünyasına girmem gerekecek, ancak bu ilk taslak.

İlk nokta, INPUTCommodore BASIC'deki anahtar kelime beyaz boşlukları yok sayar, bu nedenle satırdaki alt rutin9 boşluklar dahil klavye girişlerini kabul etmenin hızlı ve kirli bir yoludur.

İkinci nokta, Commodore BASIC tamsayılarının 16-bit işaretli bir aralığı var, bu yüzden -32768 ila +32767 kaynağı - bu yüzden rastgele sayıyı 0 - 32767 dahil olmak üzere oluşturdum


0

Wren ,143 135 bayt

Ben iyi bir golfçü değilim ... RNG sahte bir sayı üreteci olduğu için her seferinde aynı değeri üretir.

Fn.new{|a|
import"random"for Random
if(a=="*+*"){
while(1){}
}else System.write(a[0]==" "?Random.new(9).int((1<<31)-1):"Hello World")
}

Çevrimiçi deneyin!


0

JavaScript, 63 Bayt, sonsuz özyinelemeli

s=>s[1]?Math.random()*2**31|eval("while(s>'!');"):'Hello World'

kötü ağ yani TIO bağlantısı yok

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.