Puzzle di programmazione 3 (C) di m3ph1st0s: "Easy bug" [chiuso]


11

Questo è il terzo della mia serie di puzzle C / C ++; nel caso in cui tu abbia perso i primi 2 sono qui: (1) puzzle di programmazione 1 (C ++ ) di m3ph1st0s (C ++) (2) puzzle di programmazione 2 (C ++) di m3ph1st0s: "Chiama duro!"

Devo dire che i miei puzzle sono originali al 100%. In caso contrario, lo indicherò sempre nel testo. Il mio terzo puzzle ha 2 parti come segue:

Puzzle 3.1

Questa parte (3.1) non è un mio enigma originale, è raccolta da una pagina Internet che ho letto qualche tempo fa. Lo uso qui come punto di partenza e riscaldamento per te. Risolvi questo e poi passa alla seconda parte.

Qualcuno ha provato a stampare il segno "+" 20 volte e ha escogitato il seguente programma:

#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

Il fatto che non abbia avuto il risultato atteso è ovvio: il programma non finisce mai. Aggiustalo! Facile? Ora correggi il programma cambiando SOLO UN PERSONAGGIO - personaggio non spaziale ovviamente! Per questa sfida ci sono 3 soluzioni. Trova tutti e 3. Giusto per chiarire: il programma deve generare 20 "+" segni e deve finire velocemente. Prima di criticarmi su cosa significhi "veloce", dirò che significa al massimo un paio di secondi (che tra l'altro è troppo ma solo per renderlo cristallino).

Puzzle 3.2

EDITED In precedenza mi è stato fatto notare che la soluzione per il puzzle 3.2.2 potrebbe essere dipendente dal compilatore. Al fine di eliminare ogni possibile discussione sull'argomento, modificherò l'idea e la migliorerò nel prossimo enigma quando mi prenderò cura di non generare polemiche. Tuttavia, per continuare questo puzzle, farò una piccola modifica per 3.2.2 (la soluzione sarà più semplice ma più pulita).

Quando ho visto il puzzle per la prima volta l'ho trovato davvero fantastico. Sono riuscito a risolverlo ma non immediatamente poiché richiede un'attenta attenzione. Se sei qui significa che anche tu l'hai risolto. Se lo hai fatto scrivendo un programma per sostituire tutti i possibili caratteri con tutti i possibili valori e testare ogni soluzione, ti perdi. Duro lavoratore però. Ora dopo aver corretto il programma che scrive 20 segni "+":

3.2.1: Inserire una sola lettera e nient'altro nel codice in modo che il risultato sia valido e produca la stessa cosa in tutti e 3 i programmi corretti. Inutile dire che la lettera deve essere prima del racchiudere} di main (lo dico perché non voglio sentire le persone che hanno appena messo una lettera dopo il programma e in qualche modo il loro compilatore è stato molto amichevole).

EDITED (vedi sotto) - Per queste ultime domande considera che il contatore i inizia da -1 invece di 0.

3.2.1.5: Ripetere tutti i precedenti problemi con la condizione che l'output sia almeno 19 "+" segni (ma comunque un output finito). È consentito cambiare spazio. Ora potresti aver trovato più soluzioni rispetto al primo caso. Alcuni di questi si adatteranno sicuramente alla domanda 3.2.2.

3.2.2: Scegliere un altro valore per inizializzare la variabile n in modo che l'output risultante rimanga lo stesso per almeno un programma corretto in 3.2.1.5 (non necessariamente per tutti).

LAST EDIT1 : cambiare il programma in modo che emetta 21 "+" segni è ancora una buona soluzione, in quanto il testo originale non diceva "esattamente" 20 segni. Tuttavia, l'uscita infinita è vietata. Ovviamente questo non significa che iniziamo tutti a emettere centinaia di segni "+" poiché non è vietato. Ma eliminare una bella uscita 21 non sarebbe nello spirito di questa competizione.

LAST EDIT2 : considerando LAST EDIT1 e accettare il cambio di spazio sembra che ora abbiamo 5 possibili soluzioni, quattro delle quali sono già state evidenziate nelle risposte. L'ultima sfida tuttavia non è stata toccata e devo chiarire ancora una volta: n deve essere assegnato un altro valore , le soluzioni che assegnano 20 a n con alcuni trucchi non lo faranno (come n = 20L). Inoltre preferisco vedere la terza soluzione che non cambia gli spazi.

LAST EDIT3 : ho modificato le ultime domande, per favore leggi!

La sfida è risolvere entrambe le parti del puzzle. Il primo a farlo vince.

Spero che sia tutto chiaro, in caso contrario per favore pubblica tutte le domande e le modificherò il più rapidamente possibile. Saluti. testo enfatizzato


Suppongo che la modifica di un personaggio includa la modifica di spazi in caratteri non spaziali? Se è così, penso di aver trovato tutte e 3 le soluzioni per la parte 1.
mellamokb

oh..scusa..avrei pensato di negarlo esplicitamente ma me ne sono dimenticato. Modificherò ora. Grazie per avermelo chiesto.
Bogdan Alexandru,

Oh bene. Perché non riesco a trovare alcuna risposta per la parte 3.2.2 per le mie attuali 3 soluzioni ... Immagino che ciò significhi che devo cercarne un'altra :)
mellamokb

sì :) buona fortuna per questo
Bogdan Alexandru,

1
@ardnew: non credo che l'OP abbia cambiato una volta l'intento originale della domanda. Sono d'accordo sul fatto che ci sono modi migliori per risolvere la domanda piuttosto che riempire un mucchio di Edit alla fine ... ma è ancora al centro la stessa domanda, con alcune cose chiarite.
mellamokb,

Risposte:


8

3.1

for( i = 0;-i < n; i-- )
for( i = 0; i < n; n-- )
for( i = 0; i + n; i-- )

Una di queste modifiche farà in modo che il programma generi 20 '+' segni. Questo è vicino:

for( i = 0;~i < n; i-- )

Emette 21 segni '+'.

3.2.1

Ho trovato almeno 112 modi per risolvere questo problema inserendo una lettera. Non tutti possono funzionare su tutti i compilatori.

int n = 20L;
int n = 20f;
int n = 20d;
uint n = 20;

for( i = 0L; ... )
for( i = 0f; ... )
for( i = 0d; ... )

iprintf("+");
printf("+x");
printf("x+");

Negli ultimi due, sostituisci qualsiasi lettera per xdarti 104 possibili soluzioni. L'uso di una delle ultime due righe modificherà l'output, ma l'output sarà sempre lo stesso per tutti e 3 i programmi corretti.

3.2.2

Tutto quello che mi è venuto in mente sono alcune cose che vengono ricondotte al numero 20 assegnato a int.

int n = 20L;
int n = 20.001;
int n = 20.999;
int n = 20 + 0x100000000L;

Sì, hai le stesse risposte esatte che faccio (non le ho pubblicate prima perché non avevo risposto a tutto). Penso che la risposta alla 3.2.2 risieda nella terza soluzione alla 3.1 che nessuno di noi ha trovato (e obbedisce alla regola di non permettere che lo spazio sia cambiato).
mellamokb,

Su 3.2.1, non sono sicuro circa l' fe dsuffissi per inti tipi (beh, dper qualsiasi tipo per questo), ma ci sono pochi altri che hai lasciato fuori: int n = 20l, int n = 20U, e int n = 20u. Inoltre non credo uintsia un identificatore di tipo standard in C o C ++. Quale compilatore stai usando per questi comunque?
Ardnew,

Hai fatto un ottimo lavoro qui, ma non completo! Prima di tutto, la soluzione ~ i è ancora buona! Il requisito era produrre 20 "+" segni, quindi 21 è ancora una buona soluzione (l'unica soluzione cattiva è l'output infinito). Ciò significa che ora hai trovato 4 soluzioni! E la cosa divertente è che ne ho ancora uno :) Riguardo alla 3.2.2, è un male poiché ho specificamente richiesto di cambiare il VALORE di n, di non fare alcuni trucchi per farlo 20 :)
Bogdan Alexandru

1
e inoltre, entrambe le soluzioni -i e ~ i cambiano spazio, quindi le considero soluzioni "parziali". la terza soluzione completa deve cambiare un carattere non spaziale come specificato nel testo del quiz
Bogdan Alexandru,

1
non hai capito il problema. Ho detto che la modifica produrrà lo stesso output del corrispondente programma modificato. cioè ho i programmi corretti C1, C2, C3. dopo l'inserimento del personaggio ho P1, P2, P3. il requisito è: P1 ha la stessa uscita di C1, P2 ha la stessa uscita di C2, P3 ha la stessa uscita di C3. NON è P1, P2, P3 con la stessa uscita
Bogdan Alexandru,

2

3.1

Ancora un altro enigma. Ma le soluzioni normali sono noiose, che dire di qualcosa di speciale?

Soluzione 1:

#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i++ )
      printf("+");
   return 0;
}

Ho deciso di cambiare SOLO UN PERSONAGGIO, cioè -. Nessun altro personaggio è -stato cambiato.

Soluzione 2:

#include <stdio.h>
int main() {
   int i=printf("++++++++++++++++++++");exit(0);
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

Questo cambia esattamente un carattere - il punto e virgola dopo int iin =printf("++++++++++++++++++++");exit(0);.

Soluzione 3:

#include <stdix.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

Questo carica l' stdix.hintestazione del sistema. Nel percorso di inclusione del sistema, inserire il seguente file, chiamato stdix.h. Deve contenere i seguenti contenuti.

static inline void printf(const char *string) {
    int i;
    for(i = 0; i < 20; i--)
        putchar('+');
    exit(0);
}

3.2

Ora per inserire una lettera. Bene, è semplice, sostituirlo int main()con int main(a). Questo non è valido secondo gli standard, ma a chi importa?



0

3.1

  1. Cambia i--inn--
  2. i<n per -i<n
  3. (Sfortunatamente risposta non valida perché non stavo verificando con il compilatore prima di vedere altre risposte)

3.2.1

int n = 20 

per

uint n = 20

(Dipendente dal compilatore ...)

3.2.2

int n =-20L;

for(i = -1; i%n; i--)

stampa 19 + segni, come con int n = 20L;. Tuttavia, non mi sarei mai inventato se non avessi visto altre risposte alla 3.2.1


0
#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i++  )
      printf("+");
        printf("\n");
   return 0;
}

1
Assicurati di aggiungere la lingua del programma e il conteggio dei caratteri nella tua risposta.
Timtech,

1
@Timtech perché il personaggio conta? questo non è code-golf
orgoglioso haskeller il

1
@Timtech anche perché includere la lingua? questa è una sfida specifica per la lingua.
orgoglioso haskeller il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.