“İyi” ve “Kötü” arasında geçiş yapma


17

Mücadele Açıklaması:

Kullanıcıdan girdi girmesini isteyen bir program yazın. Kullanıcı Goodveya değerini girecektir Bad. Başka bir girişi desteklemenize gerek yoktur. Kullanıcı girerse Good, yazdırın Badve tersini yapın (stdout'a vb.).

Notlar:

1) Başka iki kelime çifti kullanamazsınız.

2) Programınız yalnızca bir kez sormak ve yazdırmak zorundadır.

3) Bilgi istemi dizesini görüntülemenize gerek yoktur.

4) Çıkış, herhangi bir yolla girişten ayrı görünmelidir.

5) Değeri kabul etme ve sonucu döndürme işlevine izin verilmez; Kullanıcı programla etkileşime girmelidir.

İyi şanslar!


9
Girişi istemek yerine argüman olarak alan bir işlev yazabilir miyiz?
Adám

8
Lütfen bir işleve izin verilip verilmediğine ilişkin sorunuzu düzenleyin. Çok iyi bir neden (ve ben göremiyorum) sürece, STDIN girişi kısıtlamak değil tavsiye ederim
Jo King

2
kullanıcıdan girilmesini ister (stdin vb.) yalnızca STDIN veya etkileşimli girdiye izin verildiğini gösterir. Lütfen bunu tüm varsayılan I / O yöntemleriyle değiştirin
MilkyWay90

1
"Kullanıcıdan girdi soruyor", bu açık bir soru mu olmalı? Boş bir CLI istemi gerçekten bir şey istemediğinden…
user0721090601

5
Bu kısıtlamanın amacı nedir? Değeri kabul etmek ve sonucu döndürmek için hiçbir işleve izin verilmez; Kullanıcı programla etkileşimde olmalıdır
mbomb007

Yanıtlar:


46

Python 3 ,  32  31 bayt

exit('GBoaodd'['G'<input()::2])

Çevrimiçi deneyin!

Nasıl?

Girişin 'Good'karşılaştırılarak olup olmadığını test eder 'G'<input().

Gerçeğini kullanır Python o False==0ve True==1olarak sonuç kullanmak startbir dilim endeksi 'GBoaodd'tanımlanmamış kullanarak stopve stepbir 2ile 'GBoaodd'[start:stop:step].

STDERR'a yazdırır ( exityerine bir bayt kaydeder print).


Ne hile ama! Bunun nasıl çalıştığını anlayamıyorum.
Ishaq Khan

Baytları kısaltmak için bir lambda kullanabilir misiniz?
MilkyWay90

@ MilkyWay90 Soruya göre, girdiyi kabul eden bir program olmalıdır.
Jonathan Allan

@A__ varsayılan olarak evet, OP tarafından burada geçersiz kılınabileceğini gösteren bir yorum olmasına rağmen.
Jonathan Allan

4
"İyi" ve "Kötü" ifadelerinin "d" yi paylaşması çok kötü, ya da yapabileceğiniz 'GoodBad'.strip(input())bir bayt daha kısa.
xnor

15

APL (Dyalog Unicode) , 13 bayt SBCS

Stdin'den giriş isteyen ve stdout'a baskı yapan tam program.

'GooBad'1↓⍞

Çevrimiçi deneyin!

 stdin'den girdi istemi; GoodveyaBad

¯1↓ son karakteri bırak ( d); GooveyaBa

'GooBad'~ çoklu küme bu karakterleri bunlardan çıkarır; BadveyaGood


5
Neden downvote‽
Adám

1
Kodda GooBadveya var mı GoodBad?
NoOneIsHere

Bence olmalı GooBad, `` d '' karakteri eklemek bu yazıyı 14 bayt yapacak.

@NoOneIsHere Teşekkürler. Sabit.
Adám

12

Turing Machine But Way Worse , 405 bayt

0 0 0 1 1 0 0
1 1 1 1 2 0 0
0 2 0 1 3 0 0
0 3 0 1 4 0 0
0 4 0 1 5 0 0
1 5 0 1 6 0 0
0 5 1 1 h 0 0
1 6 1 1 7 0 0
1 7 0 1 8 1 0
0 8 0 1 9 0 0
1 9 1 1 9 0 0
0 9 0 1 a 0 0
1 a 0 1 a 0 0
0 a 0 0 b 0 0
0 b 1 1 c 1 0
0 c 0 0 d 0 0
1 d 0 0 e 0 0
0 e 0 0 f 0 0
0 f 1 1 g 1 1
1 h 1 1 i 0 0
0 i 1 1 j 1 0
0 j 0 1 k 0 0
1 k 1 1 k 0 0
0 k 0 1 l 0 0
0 l 1 1 l 0 0
1 l 1 0 m 1 0
1 m 1 1 n 1 0
1 n 1 1 o 0 0
0 o 0 1 p 1 1

Çevrimiçi deneyin!

Bu biraz zaman aldı.

BİTMEMİŞ AÇIKLAMA :

0 0 0 1 1 0 0 Start going to the sixth bit
1 1 1 1 2 0 0
0 2 0 1 3 0 0
0 3 0 1 4 0 0
0 4 0 1 5 0 0 End going to the sixth bit
1 5 0 1 6 0 0 If the sixth bit is 1, then it is Good. Start transforming "G" to "B" and go to state 6
0 5 1 1 h 0 0 Else, it is Bad. Start transforming "B" to "G" and go to state h
1 6 1 1 7 0 0 Keep on transforming "G" to "B"
1 7 0 1 8 1 0 End transforming and print "B"
0 8 0 1 9 0 0 We are in the first "o" in "Good". Start moving into the 5th bit.
1 9 1 1 9 0 0
0 9 0 1 a 0 0
1 a 0 1 a 0 0 Do some looping magic and start transforming "o" to "a"
0 a 0 0 b 0 0 End looping magic
0 b 1 1 c 1 0 End transforming and print "a"
0 c 0 0 d 0 0 
1 d 0 0 e 0 0 Start transforming "a" to "d"
0 e 0 0 f 0 0 
0 f 1 1 g 1 1 Stop transforming, print "d", and terminate
1 h 1 1 i 0 0 Continue transforming "B" to "G"
0 i 1 1 j 1 0 Stop transforming and print out "G"
0 j 0 1 k 0 0 Start going into position to print out "oo"
1 k 1 1 k 0 0
0 k 0 1 l 0 0 Move more efficiently using LOOPING MAGIC1!1111111 
0 l 1 1 l 0 0 looping magic end, start transforming
1 l 1 0 m 1 0 end transforming and print out out "o"
1 m 1 1 n 1 0 print out "o" again
1 n 1 1 o 0 0 get into the "d" byte
0 o 0 1 p 1 1 print "d" and execute YOU HAVE BEEN TERMINATED

4
"Turing-Machine-But-Way-Worse" şüphesiz benim yeni favori esolang'ım.
MikeTheLiar

@MikeTheLiar Teşekkürler!
MilkyWay90

@A__favorite/disliked/"Turing-Machine-But-Way-Worse" is, without a doubt, my new favorite esolang.
MilkyWay90

“FESİH EDİLDİNİZ” ArnoldC, öyle mi?
TemporalWolf

@TemporalWolf Benim, ArnoldC!
MilkyWay90


8

8088 Montajı, IBM PC DOS, 25 bayt

unassembled:

BA 0110     MOV  DX, OFFSET GB  ; point DX to 'Good','Bad' string 
D1 EE       SHR  SI, 1          ; point SI to DOS PSP (80H) 
02 04       ADD  AL, [SI]       ; add input string length to AL, set parity flag 
7B 02       JNP  DISP           ; if odd parity, input was 'Bad' so jump to display 'Good'
02 D0       ADD  DL, AL         ; otherwise add string length as offset for 'Bad' string 
        DISP: 
B4 09       MOV  AH, 9          ; DOS display string function 
CD 21       INT  21H            ; call DOS API, write string to console 
C3          RET                 ; return to DOS 
        GB  DB  'Good$','Bad$'

Açıklama:

DOS'un bellek adresinde sakladığı giriş dizesi uzunluğuna (artı önde gelen alana) bakar 80Hve ekler AL(başlangıçta 0 DOS tarafından ). 1Dize uzunluğunun ikili gösteriminde tek sayıda bit varsa , CPU eşlik bayrağı tek olarak veya tam tersi olarak ayarlanır. Giriş dizesi Yani ' Bad'uzunluğu 4( 0000 0100), tek parite ve giriş dizesi ' Good'olan 5( 0000 0101) çift parite olduğunu.

DXbaşlangıçta dizeyi gösterecek şekilde ayarlanmıştır 'Good$Bad$'ve eğer eşlik eşitse (giriş girdiyse ' Good') dize işaretçisini bu uzunluğa ( 5) ilerleterek işaret eder 'Bad$'. Eşlik garip ise, zaten işaret ettiği için hiçbir şey yapmayın 'Good$'. Sonra $sonlandırılmış bir dizeyi konsola görüntülemek için DOS API'sini kullanın .

Misal:

resim açıklamasını buraya girin

GOODBAD.COM'u indirin ve test edin veya dökümden oluşturun xxd:

0000000: ba10 01d1 ee02 047b 0202 d0b4 09cd 21c3  .......{......!.
0000010: 476f 6f64 2442 6164 24                   Good$Bad$

7

Jöle , 8 bayt

“Ċ³ṫ³»œṣ

Çevrimiçi deneyin!

Python biçimli bir dizeyi bağımsız değişken olarak bekleyen tam bir program

Nasıl?

“Ċ³ṫ³»œṣ - Main Link: list of characters, S
“Ċ³ṫ³»   - compression of dictionary words "Good"+"Bad" = ['G','o','o','d','B','a','d']
      œṣ - split on sublists equal to S
         - implicit, smashing print

1
OP yanıt verdi gibi görünüyor, girdi STDIN ile sınırlı değil.
Outgolfer Erik

6

Python 3, 38 37 34 33 bayt

exit("C">input()and"Good"or"Bad")

Çevrimiçi deneyin!

exit() : çıkış olarak çıkış kodunu döndürür

"C">input(): Girişin Calfabetik sırada dizeden büyük olup olmadığını kontrol eder

and"Good": Eğer sonuç True, daha sonra dönerGood

or"Bad" : Aksi takdirde, ile döner Bad



2
exit(input()[3:]and"Bad"or"Good")aynı bayt sayısı için de çalışır.
Neil


5

brainfuck , 72 bayt

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

Çevrimiçi deneyin!

Açıklama:,> +++++>,>,>,>,

Şunlardan birini okuyun: "G", 5, "o", "o", "d" veya "B", 5, "a", "d", 0

[<<<< [- <->> --- <] <. >> +. >>. >>>] Son karakter sıfır değilse:

Birinci hücreden bir kez ve üçüncü hücreden üç kez substract 5. Hücre 3'ü artırın

Çıkış hücreleri 1, 3, 5.

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

Aksi takdirde birinci hücreye bir kez ve üçüncü hücreye üç kez 5 ekleyin.

Azalan hücre 3

Çıkış hücreleri 1, 3, 3, 4


Güzel bir çözüm. Girişte yeni satır kullanmayarak biraz kısaltabilirsiniz. > +++++>,>,> [<<< [- <-... >> --- <] <>> + >> >>] <[<< [- <+ >> +++ <] <. >> - ..>.>]
Dorian

Evet, orada optimize edilecek bir şey olduğunu fark ettim, ancak kural 4'e uymak için neyin gerekli olduğunu yorumlamakta zorlandım
Helena


4

R , 42 37 35 32 bayt

-10 Giuseppe ve AkselA sayesinde!

`if`(scan(,'')>'C','Bad','Good')

Çevrimiçi deneyin!


1
Sorun değil. Diğer R golfçülerinin adlarının birçoğunu tanıyorum, bu yüzden isimlerini en yeni olarak görürsem sıklıkla yazılara tıklıyorum. :-)
Giuseppe

1
bu cevaptaki gibi "C"ilk yerine kullanmak başka bir çift bayt kurtaracaktır. "Bad"
Giuseppe

1
Sadece meraktan, `if`(readline()>"C","Bad","Good")geçerli bir cevap olur mu? Bu oyunda ve kurallarında yeniyim.
AkselA

2
@AkselA evet, ama scan(,"")bunun yerine kullanmanızı da öneririm readline(). R'ye özel sorularınız varsa golfR , R golf sohbet odasına gelmekten çekinmeyin :-)
Giuseppe

2
@AkselA ayrıca bazı özel ipuçları için R'deki Golf için İpuçları'na bakın ; Eğer onları okursanız orada gizli taşlar var :-)
Giuseppe


3

JavaScript 31 bayt

Arnauld'un cevabını beğendim, ancak kullanıcı girişini kabul etmesini ve StackExchange'te böyle çalıştırılmasını istiyorum:

alert(prompt()[3]?'Bad':'Good')



3

Ruby , 22 bayt

->n{n>?F?"Bad":"Good"}

Çevrimiçi deneyin!


Soru "kullanıcıdan giriş ister" der, ancak bunu yapmanın en kısa yolu lambda'nın yerini almaktır p getsve bu nedenle aynı uzunluktadır. (orijinal yorumum 2 bayt kaydedebileceğinizi söyledi, ancak sonucu yazdırmak için hesap vermedim)
DaveMongoose

3
Eğer aslında kullanıcıdan girdi isteyen tam bir programdan bahsedeceksek, -pbayrağı kullanmak en etkili cevabı verecektir: $_=$_>?F?:Bad:"Good"20 bayt. Çevrimiçi deneyin!
Değer Mürekkebi

3

05AB1E , 10 9 bayt

”‚¿‰±”áIK

@Emigna sayesinde -1 bayt .

Çevrimiçi deneyin veya her iki test durumunu da doğrulayın .

Açıklama:

”‚¿‰±”     # Push dictionary string "Good Bad"
      á    # Only keep letters (to remove the space)
       IK  # Remove the input
           # (output the result implicitly)

Bu 05AB1E ipucuma bakın ( sözlük nasıl kullanılır? ) , Neden ”‚¿‰±”olduğunu anlamak için "Good Bad".


Bu konuda birçok alternatif varyasyon görebiliyorum, ancak hepsi aynı bayt sayısıyla
sonuçlanıyor

1
Aslında, ile bir bayt kaydedebilirsiniz á.
Emigna

@Emigna Ah tabii ki harika. Şimdi görüyorum ki á, bunu düşünmediğime inanamıyorum, ama aynı zamanda bunu asla düşünmeyeceğimi de biliyorum. ;) Teşekkürler! (Ve evet, birkaç 10 baytlık alternatiflerim de vardı.)
Kevin Cruijssen

1
Hatta ihtiyacım yok, ”‚¿Bad”IKaynı zamanda 9'dur.
Grimmy

3

Java (JDK) , 124 bayt

interface G{static void main(String[]a){System.out.print(new java.util.Scanner(System.in).next().length()>3?"Bad":"Good");}}

Çevrimiçi deneyin!

Büyük olasılıkla, hala iyileştirilmesi gereken bir yer var, ancak golf kodlama konusunda tamamen yeniyim.


2
Hoşgeldiniz! Kodunuzu çalıştırabileceğiniz bir çevrimiçi tercümana bir açıklama ve / veya bağlantı eklemeyi düşünün. (Örnekler için diğer yanıtlara bakın.) Yalnızca kod yanıtları otomatik olarak düşük kaliteli olarak işaretlenir.
mbomb007

4
Uzunluk kısmı sadece olabilir!="Bad"
Jo King


3

Yakut, 30 28 bayt

puts %w|Good Bad|-gets.split

Golf-iest değil, ama son satırsonu kaldırmak ve bir çağrıda bir dizi dönüştürmek için split kötüye seviyorum.

Value Ink'in önerisi sayesinde -2 bayt EDIT!


Bu baskı "Good"veya "Bad"(tırnak işaretleri ile); Buna izin verildiğinden emin değilim.
Ürdün

1
putsBir dizinin her öğesini ayrı bir satıra basan gerçeği kötüye kullanın . 3 bayt daha pahalıdır p, ancak [0]artık parenlere ihtiyaç duymadan 2 bayt daha kaydettiğinizden ve daha sonra tasarruf ettiğinizden dışarı çıkar . Çevrimiçi deneyin!
Değer Mürekkebi

@ValueInk teşekkürler! Ürdün'ün sorunu da bu değişiklikle çözülüyor, bu bir kazan-kazan.
DaveMongoose

3

Shakespeare Programlama Dili , 582 bayt

(Okunabilirlik için boşluk eklendi)

G.Ajax,.Puck,.Act I:.Scene I:.[Enter Ajax and Puck]Ajax:
Open mind.Be you nicer the sum ofa big cat the cube ofa big big cat?If solet usScene V.
You is the sum ofthe sum ofyou a big big cat a cat.Speak thy.You is the sum ofyou twice twice twice the sum ofa big big cat a cat.Speak thy.Speak thy.You is the square oftwice the sum ofa big big cat a cat.Let usScene X.
Scene V:.Ajax:
You is the sum ofthe sum ofyou a big big pig a pig.Speak thy.You is the sum ofyou the sum ofa big big big big big cat a pig.Speak thy.You is the sum ofyou the sum ofa big cat a cat.
Scene X:.Ajax:Speak thy.

Çevrimiçi deneyin!

İle girişin ilk harfini alıyorum Open mind. O zaman ne olduğunu belirlemem gerek. B= 66 ve G= 71 arasındaki tüm sayılardan , kaba kuvvet uygulayıcım 66 yazmanın en kısa olduğunu söylüyor ( the sum ofa big cat the cube ofa big big cat), bu yüzden girişin ilk harfini 66 ile karşılaştırıyorum. Sahne I yazdırmaya devam ediyor Goodveya Sahne V yazdırıyor Bad.


2

Retina 0.8.2 , 20 bayt

oo
o
T`G\oaB`Ro
o
oo

Çevrimiçi deneyin! Bağlantı test paketini içerir. Açıklama:

oo
o

Çevirin Goodiçine God.

T`G\oaB`Ro

Harflerin GoaBböylece alışverişi, bu listenin ters ile Gbirlikte Bve obirlikte aalışverişinde yani Godbirlikte Bad.

o
oo

Çevirin Godiçine Good.


1
17 bayt , ancak daha az yaratıcı
pbeentje


2

Excel, 24 bayt

=IF(A1>"C","Bad","Good")

@ MilkyWay90'ın <Cönerisini kullanma .



2

Jöle , 9 bayt

“GooBa”œ^

Çevrimiçi deneyin!

açıklama

Giriş ve dize arasındaki çoklu ayar simetrik farkı “GooBa”.


@JonathanAllan Teşekkürler. Düzenlenen
Luis Mendo


@EriktheOutgolfer Maalesef sorunun tüm yazıldığı şekli, çalıştırıldığında giriş isteyen bir programa sahip olmamız gerektiği anlamına gelir (hiçbir bilgi istemi olmamasına rağmen). OP'lerin kendi cevabına da bakınız. Onları değiştirmek için almak istiyorsanız, bunun için gidin (her ne kadar biraz farklı olsa da, benzer yorumlarda ilk cevap vermediklerini unutmayın)
Jonathan Allan

OP yanıt verdi gibi görünüyor, girdi STDIN ile sınırlı değil.
Outgolfer Erik

@EriktheOutgolfer Teşekkürler! Geri alındı
Luis Mendo


2

Fıçı , 22 bayt

?^_^_o=[^aB^_|^ooG^]

2

brainfuck , 52 bayt

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

Çevrimiçi deneyin!

Kötü'ün İyi'den bir harf daha kısa olmasına güvenir, bu nedenle son giriş boştur.

Açıklama:

,>,,<<,       Get input into the first three cells
[             If the last letter was not empty (i.e. Good)
 >-----.      Decrement 'G' to 'B' and print
 <---.        Decrement 'd' to 'a' and print
 +++.         Increment back to 'd' and print
>>]           End loop
>[            If it is Bad instead
 +++++.       Increment 'B' to 'G' and print
 +[-<-->]<-.. Manipulate into  'o' and print twice
 >>.          Print 'd'
>]            End loop


2

Boolfuck , 47 bayt

+>,+;>,;,+;>;;;+;+;+[;<;;;,;+;;+;<];;+;+;;+;;+;

Çevrimiçi deneyin!

Temel olarak girdiyi bit olarak alabileceğinizi ve ardından belirli bitleri ters harfe çevirmek için ters çevirebileceğiniz gerçeğini kullanır.

Açıklama:

+>,+;>,;,+;>;;;+;+;+    Print the first letter by inverting the first and third bits of the input
                        'B' = 01000010
                        'G' = 11100010
                        This leaves the tape as
                            1 1 1 1' in the case of Bad
                            1 0 0 1' in the case of Good
                        By making the center cells the inverted bits
[;<;;;,;+;;+;<]         Print the center letters by looping over the two pairs of cells
                        0 1' results in 'a' = 10000110
                        1 1' results in 'o' = 11110110 by printing the 1 in the 2-4th places
                        1 1 1 1' loops twice, while 1 0 0 1' only loops once
;;+;+;;+;;+;            Finally print 'd' = 00100110


2

Fıçı , -rt 20 17 15 13 8 7 bayt (SBCS)

-᠀‘5ƳP↫

Aktarım yeri:

from KegLib import *
from Stackd import Stack
stack = Stack()
printed = False
iterable(stack, 'GoodBad')
string_input(stack)
maths(stack, '-')

if not printed:
    printing = ""
    for item in stack:
        if type(item) in [str, Stack]:
            printing += str(item)
        elif type(item) == Coherse.char:
            printing += item.v

        elif item < 10 or item > 256:
            printing += str(item)
        else:
            printing += chr(item)
    print(printing)

05AB1E cevabının bir limanı. Esasen:

  • Dizeyi iter "GoodBad"
  • Girişi dize olarak alır
  • Girişi itilen dizeden çıkarır. Bu, içindeki girişin ilk örneğini değiştirerek çalışırGoodBad hiçbir şeyle .
  • Ortaya çıkan dizeyi dolaylı olarak yazdırır.
  • -rtBayrak sağdan sola belirteçleri okumak için fıçı söyler.

Yanıt Geçmişi

?G=[øBad|ø‘5Ƴ

Aşağıdakilere aktarır:

from KegLib import *
from Stackd import Stack
stack = Stack()
printed = False
Input(stack)
character(stack, 'G')
comparative(stack, '=')
if bool(stack.pop()):
    empty(stack)
    character(stack, 'B')
    character(stack, 'a')
    character(stack, 'd')

else:
    empty(stack)
    iterable(stack, 'Good')

if not printed:
    printing = ""
    for item in stack:
        if type(item) is Stack:
            printing += str(item)

        elif type(item) is str:
            printing += custom_format(item)
        elif type(item) == Coherse.char:
            printing += item.v

        elif item < 10 or item > 256:
            printing += str(item)
        else:
            printing += chr(item)
    print(printing)

açıklama

?G=[øBad|ø‘5Ƴ

?            #Get input from user
 G=          #If the first letter is "G"
   [øBad     #Clear the stack and push "Bad"
        |    #Else,
         ø‘5Ƴ#Clear the stack and push the compressed string "Good"

1
Harika, o kadar golf yapamadım ... Cevabını iptal ettim.

@A__ aynen senin kadar oy verdi
Lyxal

Cevabım sizinkinden çok daha kötü. Cevabımı iptal etmemeliydin ...

Güncel fıçı belgeleri var mı?
EdgyNerd

@EdgyNerd gerçekten değil. Dokümanları güncellediğimden beri bir süre geçti. Yeni şeyler hakkında çoğu bilgiyi sohbette / burada bulabilirsiniz
Lyxal

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.